33 #if CFG_USE_POSIX_API < 200112 && !CFG_USE_XSI && !CFG_USE_IP6
55 #define MAIN_ERR_PREFIX "POSIX: "
61 #include <arpa/inet.h>
65 #if CFG_HDR_INTTYPES_H
66 uint16_t api_posix_htons(uint16_t host16)
68 unsigned short int api_posix_htons(
unsigned short int host16)
71 return(htons(host16));
74 #if CFG_HDR_INTTYPES_H
75 uint32_t api_posix_htonl(uint32_t host32)
77 unsigned long int api_posix_htonl(
unsigned long int host32)
80 return(htonl(host32));
83 #if CFG_HDR_INTTYPES_H
84 uint16_t api_posix_ntohs(uint16_t net16)
86 unsigned short int api_posix_ntohs(
unsigned short int net16)
92 #if CFG_HDR_INTTYPES_H
93 uint32_t api_posix_ntohl(uint32_t net32)
95 unsigned long int api_posix_ntohl(
unsigned long int net32)
103 api_posix_in_addr_t api_posix_inet_addr(
const char* cp)
105 api_posix_in_addr_t res = (api_posix_in_addr_t) -1;
106 unsigned long int a, b, c, d;
111 rv = sscanf(cp,
"%lu.%lu.%lu.%lu", &a, &b, &c, &d);
114 if(256L > a && 256L > b && 256L > c && 256L > d)
116 res = (api_posix_in_addr_t)
117 api_posix_htonl(a << 24 | b << 16 | c << 8 | d);
126 api_posix_struct_servent* api_posix_getservbyname(
const char* name,
129 static api_posix_struct_servent se;
132 tmp = getservbyname(name, proto);
133 if(NULL == tmp) {
return(NULL); }
136 se.s_name = tmp->s_name;
137 se.s_aliases = tmp->s_aliases;
138 se.s_port = tmp->s_port;
139 se.s_proto = tmp->s_proto;
146 api_posix_struct_hostent* api_posix_gethostbyname(
const char* name)
148 static api_posix_struct_hostent he;
151 tmp = gethostbyname(name);
152 if(NULL == tmp) {
return(NULL); }
155 he.h_name = tmp->h_name;
156 he.h_aliases = tmp->h_aliases;
157 he.h_addrtype = API_POSIX_AF_INET;
158 he.h_length = tmp->h_length;
159 he.h_addr_list = tmp->h_addr_list;
169 #include <sys/socket.h>
171 int api_posix_socket(
int domain,
int type,
int protocol)
175 case API_POSIX_AF_INET:
182 errno = EAFNOSUPPORT;
189 case API_POSIX_SOCK_STREAM:
201 return(socket(domain, type, protocol));
208 #include <sys/socket.h>
210 int api_posix_connect(
int sd,
const api_posix_struct_sockaddr* address,
211 api_posix_socklen_t address_len)
213 struct sockaddr_in sai;
214 struct sockaddr_in* sap = &sai;
216 switch(address->sa_family)
218 case API_POSIX_AF_INET:
220 sap->sin_family = AF_INET;
221 memcpy(&sap->sin_port,
222 &((api_posix_struct_sockaddr_in*) address)->sin_port, 2);
223 memcpy(&sap->sin_addr,
224 &((api_posix_struct_sockaddr_in*) address)->sin_addr, 4);
229 errno = EAFNOSUPPORT;
234 return(connect(sd, (
struct sockaddr*) sap,
235 (socklen_t)
sizeof(
struct sockaddr)));
242 #include <sys/socket.h>
244 int api_posix_getsockopt(
int sd,
int level,
int optname,
245 void* optval, api_posix_socklen_t* optlen)
248 #if defined(_AIX) || defined(__hpux)
249 size_t bsd_optlen = (size_t) *optlen;
252 int bsd_optlen = (int) *optlen;
256 if((api_posix_socklen_t) INT_MAX < *optlen || 0 > bsd_optlen)
258 PRINT_ERROR(
"Invalid parameter value for optlen in getsockopt()");
264 case API_POSIX_SOL_SOCKET:
278 case API_POSIX_SO_ERROR:
307 res = getsockopt(sd, level, optname, optval, &bsd_optlen);
308 if(!res) { *optlen = (api_posix_socklen_t) bsd_optlen; }
317 #include <sys/socket.h>
319 int api_posix_setsockopt(
int sd,
int level,
int optname,
320 const void* optval, api_posix_socklen_t optlen)
324 case API_POSIX_SOL_SOCKET:
344 #if CFG_HDR_SYS_SELECT_H
345 # include <sys/select.h>
347 #include <sys/time.h>
352 int api_posix_poll(api_posix_struct_pollfd fds[], api_posix_nfds_t nfds,
362 struct timeval* top = &to;
368 for(i = 0; i < nfds; ++i)
370 if(fdmax < fds[i].fd) { fdmax = fds[i].fd; }
375 if (API_POSIX_POLLIN & fds[i].events)
377 FD_SET(fds[i].fd, &readfds);
380 if (API_POSIX_POLLOUT & fds[i].events)
382 FD_SET(fds[i].fd, &writefds);
385 FD_SET(fds[i].fd, &errorfds);
392 to.tv_sec = (timeout / 1000);
393 to.tv_usec = (
long int) (timeout % 1000) * (
long int) 1000;
400 if(0 > timeout) { top = NULL; }
403 if (INT_MAX == fdmax)
412 res = select(++fdmax, &readfds, &writefds, NULL, top);
436 for(i = 0; i < nfds; ++i)
438 if (FD_ISSET(fds[i].fd, &readfds))
440 fds[i].revents |= API_POSIX_POLLIN;
442 if (FD_ISSET(fds[i].fd, &writefds))
444 fds[i].revents |= API_POSIX_POLLOUT;
446 if (FD_ISSET(fds[i].fd, &errorfds))
449 fds[i].revents |= API_POSIX_POLLERR | API_POSIX_POLLHUP
450 | API_POSIX_POLLNVAL;
462 #include <sys/socket.h>
463 #include <sys/types.h>
465 ssize_t api_posix_send(
int sd,
const void* buf,
size_t len,
int flags)
467 return(send(sd, buf, len, flags));
470 ssize_t api_posix_recv(
int sd,
void* buf,
size_t len,
int flags)
472 return(recv(sd, buf, len, flags));
480 extern int api_posix_bsd_dummy;
481 int api_posix_bsd_dummy = 0;