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 posix_htons(uint16_t host16)
68 unsigned short int posix_htons(
unsigned short int host16)
71 return(htons(host16));
74 #if CFG_HDR_INTTYPES_H
75 uint32_t posix_htonl(uint32_t host32)
77 unsigned long int posix_htonl(
unsigned long int host32)
80 return(htonl(host32));
83 #if CFG_HDR_INTTYPES_H
84 uint16_t posix_ntohs(uint16_t net16)
86 unsigned short int posix_ntohs(
unsigned short int net16)
92 #if CFG_HDR_INTTYPES_H
93 uint32_t posix_ntohl(uint32_t net32)
95 unsigned long int posix_ntohl(
unsigned long int net32)
103 posix_in_addr_t posix_inet_addr(
const char* cp)
105 posix_in_addr_t res = (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 = (posix_in_addr_t) posix_htonl(a << 24 | b << 16 | c << 8 | d);
125 struct_posix_servent* posix_getservbyname(
const char* name,
128 static struct_posix_servent se;
131 tmp = getservbyname(name, proto);
132 if(NULL == tmp) {
return(NULL); }
135 se.s_name = tmp->s_name;
136 se.s_aliases = tmp->s_aliases;
137 se.s_port = tmp->s_port;
138 se.s_proto = tmp->s_proto;
145 struct_posix_hostent* posix_gethostbyname(
const char* name)
147 static struct_posix_hostent he;
150 tmp = gethostbyname(name);
151 if(NULL == tmp) {
return(NULL); }
154 he.h_name = tmp->h_name;
155 he.h_aliases = tmp->h_aliases;
156 he.h_addrtype = POSIX_AF_INET;
157 he.h_length = tmp->h_length;
158 he.h_addr_list = tmp->h_addr_list;
168 #include <sys/socket.h>
170 int posix_socket(
int domain,
int type,
int protocol)
181 errno = EAFNOSUPPORT;
188 case POSIX_SOCK_STREAM:
200 return(socket(domain, type, protocol));
207 #include <sys/socket.h>
209 int posix_connect(
int sd,
const struct_posix_sockaddr* address,
210 posix_socklen_t address_len)
212 struct sockaddr_in sai;
213 struct sockaddr_in* sap = &sai;
215 switch(address->sa_family)
219 sap->sin_family = AF_INET;
220 memcpy(&sap->sin_port,
221 &((struct_posix_sockaddr_in*) address)->sin_port, 2);
222 memcpy(&sap->sin_addr,
223 &((struct_posix_sockaddr_in*) address)->sin_addr, 4);
228 errno = EAFNOSUPPORT;
233 return(connect(sd, (
struct sockaddr*) sap,
234 (socklen_t)
sizeof(
struct sockaddr)));
241 #include <sys/socket.h>
243 int posix_getsockopt(
int sd,
int level,
int optname,
244 void* optval, posix_socklen_t* optlen)
247 #if defined(_AIX) || defined(__hpux)
248 size_t bsd_optlen = (size_t) *optlen;
251 int bsd_optlen = (int) *optlen;
255 if((posix_socklen_t) INT_MAX < *optlen || 0 > bsd_optlen)
257 PRINT_ERROR(
"Invalid parameter value for optlen in getsockopt()");
263 case POSIX_SOL_SOCKET:
306 res = getsockopt(sd, level, optname, optval, &bsd_optlen);
307 if(!res) { *optlen = (posix_socklen_t) bsd_optlen; }
316 #include <sys/socket.h>
318 int posix_setsockopt(
int sd,
int level,
int optname,
319 const void* optval, posix_socklen_t optlen)
323 case POSIX_SOL_SOCKET:
343 #if CFG_HDR_SYS_SELECT_H
344 # include <sys/select.h>
346 #include <sys/time.h>
351 int posix_poll(struct_posix_pollfd fds[], posix_nfds_t nfds,
int timeout)
360 struct timeval* top = &to;
366 for(i = 0; i < nfds; ++i)
368 if(fdmax < fds[i].fd) { fdmax = fds[i].fd; }
373 if (POSIX_POLLIN & fds[i].events)
375 FD_SET(fds[i].fd, &readfds);
378 if (POSIX_POLLOUT & fds[i].events)
380 FD_SET(fds[i].fd, &writefds);
383 FD_SET(fds[i].fd, &errorfds);
390 to.tv_sec = (timeout / 1000);
391 to.tv_usec = (
long int) (timeout % 1000) * (
long int) 1000;
398 if(0 > timeout) { top = NULL; }
401 if (INT_MAX == fdmax)
410 res = select(++fdmax, &readfds, &writefds, NULL, top);
434 for(i = 0; i < nfds; ++i)
436 if (FD_ISSET(fds[i].fd, &readfds))
438 fds[i].revents |= POSIX_POLLIN;
440 if (FD_ISSET(fds[i].fd, &writefds))
442 fds[i].revents |= POSIX_POLLOUT;
444 if (FD_ISSET(fds[i].fd, &errorfds))
447 fds[i].revents |= POSIX_POLLERR | POSIX_POLLHUP | POSIX_POLLNVAL;
459 #include <sys/socket.h>
460 #include <sys/types.h>
462 ssize_t posix_send(
int sd,
const void* buf,
size_t len,
int flags)
464 return(send(sd, buf, len, flags));
467 ssize_t posix_recv(
int sd,
void* buf,
size_t len,
int flags)
469 return(recv(sd, buf, len, flags));
477 extern int posix_bsd_dummy;
478 int posix_bsd_dummy = 0;