int win32_setsockopt(SOCKET s, int level, int optname, const char *optval, int optlen) { int r; SOCKET_TEST_ERROR(r = setsockopt(TO_SOCKET(s), level, optname, optval, optlen)); return r; }
int win32_listen(SOCKET s, int backlog) { int r; SOCKET_TEST_ERROR(r = listen(TO_SOCKET(s), backlog)); return r; }
int win32_send(SOCKET s, const char *buf, int len, int flags) { int r; SOCKET_TEST_ERROR(r = send(TO_SOCKET(s), buf, len, flags)); return r; }
int win32_recv(SOCKET s, char *buf, int len, int flags) { int r; SOCKET_TEST_ERROR(r = recv(TO_SOCKET(s), buf, len, flags)); return r; }
int win32_getsockname(SOCKET s, struct sockaddr *addr, int *addrlen) { int r; SOCKET_TEST_ERROR(r = getsockname(TO_SOCKET(s), addr, addrlen)); return r; }
int win32_ioctlsocket(SOCKET s, long cmd, u_long *argp) { int r; SOCKET_TEST_ERROR(r = ioctlsocket(TO_SOCKET(s), cmd, argp)); return r; }
int win32_connect(SOCKET s, const struct sockaddr *addr, int addrlen) { int r; SOCKET_TEST_ERROR(r = connect(TO_SOCKET(s), addr, addrlen)); return r; }
int win32_gethostname(char *name, int len) { int r; SOCKET_TEST_ERROR(r = gethostname(name, len)); return r; }
int win32_closesocket(SOCKET s) { int r; SOCKET_TEST_ERROR(r = closesocket(TO_SOCKET(s))); return r; }
int win32_shutdown(SOCKET s, int how) { int r; SOCKET_TEST_ERROR(r = shutdown(TO_SOCKET(s), how)); return r; }
int win32_sendto(SOCKET s, const char *buf, int len, int flags, const struct sockaddr *to, int tolen) { int r; SOCKET_TEST_ERROR(r = sendto(TO_SOCKET(s), buf, len, flags, to, tolen)); return r; }
int win32_recvfrom(SOCKET s, char *buf, int len, int flags, struct sockaddr *from, int *fromlen) { int r; int frombufsize = *fromlen; SOCKET_TEST_ERROR(r = recvfrom(TO_SOCKET(s), buf, len, flags, from, fromlen)); /* Winsock's recvfrom() only returns a valid 'from' when the socket * is connectionless. Perl expects a valid 'from' for all types * of sockets, so go the extra mile. */ if (r != SOCKET_ERROR && frombufsize == *fromlen) (void)win32_getpeername(s, from, fromlen); return r; }
/* select contributed by Vincent R. Slyngstad ([email protected]) */ int win32_select(int nfds, Perl_fd_set* rd, Perl_fd_set* wr, Perl_fd_set* ex, const struct timeval* timeout) { int r; #ifdef USE_SOCKETS_AS_HANDLES int i, fd, save_errno = errno; FD_SET nrd, nwr, nex; /* winsock seems incapable of dealing with all three null fd_sets, * so do the (millisecond) sleep as a special case */ if (!(rd || wr || ex)) { if (timeout) Sleep(timeout->tv_sec * 1000 + timeout->tv_usec / 1000); /* do the best we can */ else Sleep(UINT_MAX); return 0; } StartSockets(); FD_ZERO(&nrd); FD_ZERO(&nwr); FD_ZERO(&nex); for (i = 0; i < nfds; i++) { if (rd && PERL_FD_ISSET(i,rd)) { fd = TO_SOCKET(i); FD_SET((unsigned)fd, &nrd); } if (wr && PERL_FD_ISSET(i,wr)) { fd = TO_SOCKET(i); FD_SET((unsigned)fd, &nwr); } if (ex && PERL_FD_ISSET(i,ex)) { fd = TO_SOCKET(i); FD_SET((unsigned)fd, &nex); } } errno = save_errno; SOCKET_TEST_ERROR(r = select(nfds, &nrd, &nwr, &nex, timeout)); save_errno = errno; for (i = 0; i < nfds; i++) { if (rd && PERL_FD_ISSET(i,rd)) { fd = TO_SOCKET(i); if (!FD_ISSET(fd, &nrd)) PERL_FD_CLR(i,rd); } if (wr && PERL_FD_ISSET(i,wr)) { fd = TO_SOCKET(i); if (!FD_ISSET(fd, &nwr)) PERL_FD_CLR(i,wr); } if (ex && PERL_FD_ISSET(i,ex)) { fd = TO_SOCKET(i); if (!FD_ISSET(fd, &nex)) PERL_FD_CLR(i,ex); } } errno = save_errno; #else SOCKET_TEST_ERROR(r = select(nfds, rd, wr, ex, timeout)); #endif return r; }
/* select contributed by Vincent R. Slyngstad ([email protected]) */ int win32_select(int nfds, Perl_fd_set* rd, Perl_fd_set* wr, Perl_fd_set* ex, const struct timeval* timeout) { int r; #ifdef USE_SOCKETS_AS_HANDLES Perl_fd_set dummy; int i, fd, bit, offset; FD_SET nrd, nwr, nex, *prd, *pwr, *pex; /* winsock seems incapable of dealing with all three null fd_sets, * so do the (millisecond) sleep as a special case */ if (!(rd || wr || ex)) { if (timeout) Sleep(timeout->tv_sec * 1000 + timeout->tv_usec / 1000); /* do the best we can */ else Sleep(UINT_MAX); return 0; } StartSockets(); PERL_FD_ZERO(&dummy); if (!rd) rd = &dummy, prd = NULL; else prd = &nrd; if (!wr) wr = &dummy, pwr = NULL; else pwr = &nwr; if (!ex) ex = &dummy, pex = NULL; else pex = &nex; FD_ZERO(&nrd); FD_ZERO(&nwr); FD_ZERO(&nex); for (i = 0; i < nfds; i++) { fd = TO_SOCKET(i); if (PERL_FD_ISSET(i,rd)) FD_SET(fd, &nrd); if (PERL_FD_ISSET(i,wr)) FD_SET(fd, &nwr); if (PERL_FD_ISSET(i,ex)) FD_SET(fd, &nex); } SOCKET_TEST_ERROR(r = select(nfds, prd, pwr, pex, timeout)); for (i = 0; i < nfds; i++) { fd = TO_SOCKET(i); if (PERL_FD_ISSET(i,rd) && !FD_ISSET(fd, &nrd)) PERL_FD_CLR(i,rd); if (PERL_FD_ISSET(i,wr) && !FD_ISSET(fd, &nwr)) PERL_FD_CLR(i,wr); if (PERL_FD_ISSET(i,ex) && !FD_ISSET(fd, &nex)) PERL_FD_CLR(i,ex); } #else SOCKET_TEST_ERROR(r = select(nfds, rd, wr, ex, timeout)); #endif return r; }
/* select contributed by Vincent R. Slyngstad ([email protected]) */ int win32_select(int nfds, Perl_fd_set* rd, Perl_fd_set* wr, Perl_fd_set* ex, const struct timeval* timeout) { int r; int i, fd, save_errno = errno; FD_SET nrd, nwr, nex; bool just_sleep = TRUE; StartSockets(); FD_ZERO(&nrd); FD_ZERO(&nwr); FD_ZERO(&nex); for (i = 0; i < nfds; i++) { if (rd && PERL_FD_ISSET(i,rd)) { fd = TO_SOCKET(i); FD_SET((unsigned)fd, &nrd); just_sleep = FALSE; } if (wr && PERL_FD_ISSET(i,wr)) { fd = TO_SOCKET(i); FD_SET((unsigned)fd, &nwr); just_sleep = FALSE; } if (ex && PERL_FD_ISSET(i,ex)) { fd = TO_SOCKET(i); FD_SET((unsigned)fd, &nex); just_sleep = FALSE; } } /* winsock seems incapable of dealing with all three fd_sets being empty, * so do the (millisecond) sleep as a special case */ if (just_sleep) { if (timeout) Sleep(timeout->tv_sec * 1000 + timeout->tv_usec / 1000); /* do the best we can */ else Sleep(UINT_MAX); return 0; } errno = save_errno; SOCKET_TEST_ERROR(r = select(nfds, &nrd, &nwr, &nex, (PTIMEVAL)timeout)); save_errno = errno; for (i = 0; i < nfds; i++) { if (rd && PERL_FD_ISSET(i,rd)) { fd = TO_SOCKET(i); if (!FD_ISSET(fd, &nrd)) PERL_FD_CLR(i,rd); } if (wr && PERL_FD_ISSET(i,wr)) { fd = TO_SOCKET(i); if (!FD_ISSET(fd, &nwr)) PERL_FD_CLR(i,wr); } if (ex && PERL_FD_ISSET(i,ex)) { fd = TO_SOCKET(i); if (!FD_ISSET(fd, &nex)) PERL_FD_CLR(i,ex); } } errno = save_errno; return r; }