tweak for change#7173
[p5sagit/p5-mst-13.2.git] / win32 / win32sck.c
index 043ad44..3b81d8b 100644 (file)
@@ -105,7 +105,7 @@ set_socktype(void)
 {
 #ifdef USE_SOCKETS_AS_HANDLES
 #if defined(USE_THREADS) || defined(USE_ITHREADS)
-    dTHX;
+    dTHXo;
     if (!w32_init_socktype) {
 #endif
        int iSockOpt = SO_SYNCHRONOUS_NONALERT;
@@ -426,15 +426,27 @@ my_fclose (FILE *pf)
     if (!wsock_started)                /* No WinSock? */
        return(fclose(pf));     /* Then not a socket. */
     osf = TO_SOCKET(fileno(pf));/* Get it now before it's gone! */
-    if (osf != -1
-       && closesocket(osf) == SOCKET_ERROR
-       && WSAGetLastError() != WSAENOTSOCK)
-    {
-       (void)fclose(pf);
-       return EOF;
+    if (osf != -1) {
+       int err;
+       win32_fflush(pf);
+       err = closesocket(osf);
+       if (err == 0) {
+#if defined(USE_FIXED_OSFHANDLE) || defined(PERL_MSVCRT_READFIX)
+            _set_osfhnd(fileno(pf), INVALID_HANDLE_VALUE);
+#endif
+           (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;
+           }
+       }
     }
-    else
-       return fclose(pf);
+    return fclose(pf);
 }
 
 struct hostent *