X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=win32%2Fwin32sck.c;h=0ce53c376b8cb3837475758c7faa06ba3b748c77;hb=2b7d8dfb16883bbf415fa28447ef22b443aa29c1;hp=49d38f33f14253017aed01e2c9124144b3370bb6;hpb=c5be433b5c5658093bc9cae4434721a0b63e7a85;p=p5sagit%2Fp5-mst-13.2.git diff --git a/win32/win32sck.c b/win32/win32sck.c index 49d38f3..0ce53c3 100644 --- a/win32/win32sck.c +++ b/win32/win32sck.c @@ -39,12 +39,12 @@ # define TO_SOCKET(x) (x) #endif /* USE_SOCKETS_AS_HANDLES */ -#ifdef USE_THREADS +#if defined(USE_THREADS) || defined(USE_ITHREADS) #define StartSockets() \ STMT_START { \ if (!wsock_started) \ start_sockets(); \ - set_socktype(); \ + set_socktype(); \ } STMT_END #else #define StartSockets() \ @@ -56,12 +56,6 @@ } STMT_END #endif -#define EndSockets() \ - STMT_START { \ - if (wsock_started) \ - WSACleanup(); \ - } STMT_END - #define SOCKET_TEST(x, y) \ STMT_START { \ StartSockets(); \ @@ -75,20 +69,15 @@ static struct servent* win32_savecopyservent(struct servent*d, struct servent*s, const char *proto); -#ifdef USE_THREADS -#ifdef USE_DECLSPEC_THREAD -__declspec(thread) struct servent myservent; -__declspec(thread) int init_socktype; -#else -#define myservent (thr->i.Wservent) -#define init_socktype (thr->i.Winit_socktype) -#endif -#else -static struct servent myservent; -#endif - static int wsock_started = 0; +EXTERN_C void +EndSockets(void) +{ + if (wsock_started) + WSACleanup(); +} + void start_sockets(void) { @@ -115,18 +104,18 @@ void set_socktype(void) { #ifdef USE_SOCKETS_AS_HANDLES -#ifdef USE_THREADS - dTHX; - if(!init_socktype) { +#if defined(USE_THREADS) || defined(USE_ITHREADS) + dTHXo; + if (!w32_init_socktype) { #endif - int iSockOpt = SO_SYNCHRONOUS_NONALERT; - /* - * Enable the use of sockets as filehandles - */ - setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, - (char *)&iSockOpt, sizeof(iSockOpt)); -#ifdef USE_THREADS - init_socktype = 1; + int iSockOpt = SO_SYNCHRONOUS_NONALERT; + /* + * Enable the use of sockets as filehandles + */ + setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, + (char *)&iSockOpt, sizeof(iSockOpt)); +#if defined(USE_THREADS) || defined(USE_ITHREADS) + w32_init_socktype = 1; } #endif #endif /* USE_SOCKETS_AS_HANDLES */ @@ -154,7 +143,7 @@ my_fdopen(int fd, char *mode) /* * If we get here, then fd is actually a socket. */ - Newz(1310, fp, 1, FILE); + Newz(1310, fp, 1, FILE); /* XXX leak, good thing this code isn't used */ if(fp == NULL) { errno = ENOMEM; return NULL; @@ -433,18 +422,28 @@ win32_socket(int af, int type, int protocol) int my_fclose (FILE *pf) { - int osf, retval; + int osf; if (!wsock_started) /* No WinSock? */ return(fclose(pf)); /* Then not a socket. */ osf = TO_SOCKET(fileno(pf));/* Get it now before it's gone! */ - retval = fclose(pf); /* Must fclose() before closesocket() */ - if (osf != -1 - && closesocket(osf) == SOCKET_ERROR - && WSAGetLastError() != WSAENOTSOCK) - { - return EOF; + if (osf != -1) { + int err; + win32_fflush(pf); + err = closesocket(osf); + if (err == 0) { + (void)fclose(pf); /* handle already closed, ignore error */ + return 0; + } + else if (err == SOCKET_ERROR) { + err = WSAGetLastError(); + if (err != WSAENOTSOCK) { + (void)fclose(pf); + errno = err; + return EOF; + } + } } - return retval; + return fclose(pf); } struct hostent * @@ -500,7 +499,7 @@ win32_getservbyname(const char *name, const char *proto) SOCKET_TEST(r = getservbyname(name, proto), NULL); if (r) { - r = win32_savecopyservent(&myservent, r, proto); + r = win32_savecopyservent(&w32_servent, r, proto); } return r; } @@ -513,7 +512,7 @@ win32_getservbyport(int port, const char *proto) SOCKET_TEST(r = getservbyport(port, proto), NULL); if (r) { - r = win32_savecopyservent(&myservent, r, proto); + r = win32_savecopyservent(&w32_servent, r, proto); } return r; }