2 * Acess2 POSIX Sockets Library
3 * - By John Hodge (thePowersGang)
8 #include <sys/socket.h>
10 #include <stdlib.h> // malloc/free
12 #include <netinet/in.h>
17 typedef struct s_sockinfo
23 struct sockaddr *local;
24 struct sockaddr *remote;
27 struct s_sockinfo gSockInfo[MAXFD];
28 static int giNumPreinit = 0;
31 static t_sockinfo *_GetInfo(int FD)
34 if( FD == 0 && giNumPreinit == MAXFD )
36 for( i = 0; i < MAXFD; i ++ )
38 if( gSockInfo[i].fd == FD )
42 if( FD != 0 && nInit == giNumPreinit )
48 int socket(int domain, int type, int protocol)
50 t_sockinfo *si = NULL;
52 if( domain < 0 || domain > AF_INET6 ) return -1;
53 if( type < 0 || type > SOCK_RDM ) return -1;
55 // Allocate an info struct
59 int fd = _SysOpen("/Devices/null", OPENFLAG_RDWR);
60 if( fd == -1 ) return -1;
66 si->protocol = protocol;
73 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
75 t_sockinfo *si = _GetInfo(sockfd);;
83 si->local = malloc( addrlen );
84 memcpy(si->local, addr, addrlen);
89 int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
91 t_sockinfo *si = _GetInfo(sockfd);;
99 si->remote = malloc( addrlen );
100 memcpy(si->remote, addr, addrlen);
105 int listen(int sockfd, int backlog)
107 // TODO: Save this to the t_sockinfo structure
111 void _ClearInfo(t_sockinfo *si)
127 void _CommitServer(int sockfd)
129 t_sockinfo *si = _GetInfo(sockfd);
141 uint8_t *addrBuffer = NULL;
143 switch( si->local->sa_family )
146 addrBuffer = (void*)&((struct sockaddr_in*)si->local)->sin_addr;
150 addrBuffer = (void*)&((struct sockaddr_in6*)si->local)->sin6_addr;
157 char hexAddr[addrLen*2+1];
159 for( i = 0; i < addrLen; i ++ ) {
160 hexAddr[i*2+0] = "0123456789ABCDEF"[addrBuffer[i] >> 4];
161 hexAddr[i*2+1] = "0123456789ABCDEF"[addrBuffer[i] & 15];
162 if(addrBuffer[i]) bNonZero = 1;
167 path = mkstr("/Devices/ip/routes/@%i:%s/%s", si->local->sa_family, file);
169 path = mkstr("/Devices/ip/*%i/%s", si->local->sa_family, file);
171 _SysReopen(si->fd, path, OPENFLAG_RDWR);
176 // TODO: Set up socket
181 void _CommitClient(int sockfd)
183 t_sockinfo *si = _GetInfo(sockfd);
189 int accept(int sockfd, struct sockaddr *clientaddr, socklen_t addrlen)
191 _CommitServer(sockfd);
195 child = _SysOpenChild(sockfd, "", OPENFLAG_RDWR);
196 if( child == -1 ) return -1;
198 _SysIOCtl(child, 8, clientaddr);
204 int recvfrom(int sockfd, void *buffer, size_t length, int flags, struct sockaddr *clientaddr, socklen_t *addrlen)
206 _CommitClient(sockfd);
207 // TODO: Determine socket type (TCP/UDP) and use a bounce-buffer for UDP
208 return _SysRead(sockfd, buffer, length);
211 int recv(int sockfd, void *buffer, size_t length, int flags)
213 _CommitClient(sockfd);
214 return _SysRead(sockfd, buffer, length);
217 int sendto(int sockfd, const void *buffer, size_t length, int flags, const struct sockaddr *clientaddr, socklen_t addrlen)
219 _CommitClient(sockfd);
220 // TODO: Determine socket type (TCP/UDP) and use a bounce-buffer for UDP
221 return _SysWrite(sockfd, buffer, length);
224 int send(int sockfd, void *buffer, size_t length, int flags)
226 _CommitClient(sockfd);
227 return _SysWrite(sockfd, buffer, length);