001 #exe {Cd(__DIR__);;};;
002 #include "Generic.HC";
003 
004 class CAiwniosSock:CSocket {
005   I64 os_sock;
006 };
007 
008 I64 AiwniosGetAddrInfo(U8 *node,U8*ul,addrinfo *hints=NULL,addrinfo **res) {
009   sockaddr_in *addr=CAlloc(sizeof sockaddr_in);
010   addrinfo *info=CAlloc(sizeof addrinfo);
011   CNetAddr *new=CAlloc(sizeof CNetAddr);
012   new->hostname=StrNew(node);
013   new->port=0;
014   info->ai_family=AF_INET;
015   info->ai_canonname=StrNew(node);
016   info->ai_addr=addr;
017   info->ai_socktype=SOCK_STREAM;
018   addr->sin_zero[0](U64*)=new;
019   *res=info;
020   return 0;
021 }
022 
023 socket_addr_resolver=CAlloc(sizeof CAddrResolver);
024 socket_addr_resolver->getaddrinfo=&AiwniosGetAddrInfo;
025 extern CAiwniosSock *AiwniosSocket(U16 ,U16);
026 I64 AiwniosAccept(CAiwniosSock *_s,sockaddr *src_addr,I64 addr_len) {
027   I64 s=_s->os_sock;
028   I64 code;
029   CAiwniosSock *sock;
030   if(NetPollForRead(1,&s)==0) {
031     code=NetAccept(s,NULL);
032     sock=AiwniosSocket(0,0);
033     sock->os_sock=code;
034   } else
035     sock=-1;
036   return sock;
037 }
038 I64 AiwniosClose(CAiwniosSock *_s) {
039   I64 s=_s->os_sock;
040   NetClose(s);
041   Free(_s);
042   return 0;
043 }
044 I64 AiwniosBind(CAiwniosSock *_s,sockaddr_in *src_addr,I64 addr_len) {
045   I64 s=_s->os_sock;
046   CNetAddr *from=src_addr->sin_zero[0](U64*),*new;
047   new=NetAddrNew(from->hostname,htons(src_addr->sin_port));//Update port information
048   NetBindIn(s,new);
049   NetAddrDel(new);
050   return 0;
051 }
052 I64 AiwniosConnect(CAiwniosSock *_s,sockaddr_in *src_addr,I64 addr_len) {
053   I64 s=_s->os_sock;
054   CNetAddr *from=src_addr->sin_zero[0](U64*),*new;
055   new=NetAddrNew(from->hostname,htons(src_addr->sin_port));//Update port information
056   NetConnect(s,new);
057   NetAddrDel(new);
058   return 0;
059 }
060 I64 AiwniosListen(CAiwniosSock *_s,I64 backlog) {
061   I64 s=_s->os_sock;
062   NetListen(s,backlog);
063   return 0;
064 }
065 I64 AiwniosRecvFrom(CAiwniosSock *_s,U8 *buf,I64 len,I64 flags,sockaddr *ul,I64 addrlen) {
066 //TODO wherefrom
067   I64 s=_s->os_sock;
068   while(0!=NetPollForRead(1,&s)) {
069     if(0==NetPollForHangup(1,&s))
070       return -1;
071     Sleep(3);
072   };
073   return NetRead(s,buf,len);
074 }
075 I64 AiwniosSendTo(CAiwniosSock* _s, U8* buf, I64 len, I64 flags, sockaddr* dest_addr, I64 addrlen) {
076 //TODO whereto
077   I64 s=_s->os_sock;
078   return NetWrite(s,buf,len);
079 
080 }
081 I64 AiwniosSockOpt(CAiwniosSock* _s, I64 level, I64 optname, U8* optval, I64 optlen) {
082 //Poop taods
083 }
084 
085 CAiwniosSock *AiwniosSocket(U16 ,U16) {
086   CAiwniosSock *ret=CAlloc(sizeof CAiwniosSock);
087   ret->accept=&AiwniosAccept;
088   ret->bind=&AiwniosBind;
089   ret->close=&AiwniosClose;
090   ret->connect=&AiwniosConnect;
091   ret->listen=&AiwniosListen;
092   ret->recvfrom=&AiwniosRecvFrom;
093   ret->sendto=&AiwniosSendTo;
094   ret->setsockopt=&AiwniosSockOpt;
095   ret->os_sock=NetSocketNew;
096   return ret;
097 }
098 RegisterSocketClass(AF_INET,SOCK_STREAM,&AiwniosSocket);
099 /*
100 I64 sock=create_connection("aiwnios.com",6667);
101 sendString(sock,
102 "NICK clayton\n"
103 "USER clayotn 0 * :realname\n"
104 ,0);
105 U8 buf[STR_LEN];
106 recvLine(sock,buf,STR_LEN,0);
107 "%s\n",buf;
108 close(sock);*/