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);*/