]> code.delx.au - gnu-emacs/blobdiff - src/w32.c
Merge from emacs-24; up to 2012-12-19T19:51:40Z!monnier@iro.umontreal.ca
[gnu-emacs] / src / w32.c
index 03e65bf943118c619ea056d0b7fe4e816aa4c02f..25cc2185793620266ce7cc35d91344abfb444b6e 100644 (file)
--- a/src/w32.c
+++ b/src/w32.c
@@ -6232,7 +6232,7 @@ sys_socket (int af, int type, int protocol)
 
   if (winsock_lib == NULL)
     {
-      h_errno = ENETDOWN;
+      errno = h_errno = ENETDOWN;
       return INVALID_SOCKET;
     }
 
@@ -6242,7 +6242,13 @@ sys_socket (int af, int type, int protocol)
   s = pfn_socket (af, type, protocol);
 
   if (s != INVALID_SOCKET)
-    return socket_to_fd (s);
+    {
+      int retval = socket_to_fd (s);
+
+      if (retval == -1)
+       errno = h_errno;
+      return retval;
+    }
 
   set_errno ();
   return -1;
@@ -6309,6 +6315,7 @@ socket_to_fd (SOCKET s)
              }
          }
       }
+      eassert (fd < MAXDESC);
       fd_info[fd].hnd = (HANDLE) s;
 
       /* set our own internal flags */
@@ -6347,7 +6354,7 @@ sys_bind (int s, const struct sockaddr * addr, int namelen)
 {
   if (winsock_lib == NULL)
     {
-      h_errno = ENOTSOCK;
+      errno = h_errno = ENOTSOCK;
       return SOCKET_ERROR;
     }
 
@@ -6359,7 +6366,7 @@ sys_bind (int s, const struct sockaddr * addr, int namelen)
        set_errno ();
       return rc;
     }
-  h_errno = ENOTSOCK;
+  errno = h_errno = ENOTSOCK;
   return SOCKET_ERROR;
 }
 
@@ -6368,7 +6375,7 @@ sys_connect (int s, const struct sockaddr * name, int namelen)
 {
   if (winsock_lib == NULL)
     {
-      h_errno = ENOTSOCK;
+      errno = h_errno = ENOTSOCK;
       return SOCKET_ERROR;
     }
 
@@ -6380,7 +6387,7 @@ sys_connect (int s, const struct sockaddr * name, int namelen)
        set_errno ();
       return rc;
     }
-  h_errno = ENOTSOCK;
+  errno = h_errno = ENOTSOCK;
   return SOCKET_ERROR;
 }
 
@@ -6414,7 +6421,7 @@ sys_gethostname (char * name, int namelen)
   if (namelen > MAX_COMPUTERNAME_LENGTH)
     return !GetComputerName (name, (DWORD *)&namelen);
 
-  h_errno = EFAULT;
+  errno = h_errno = EFAULT;
   return SOCKET_ERROR;
 }
 
@@ -6425,7 +6432,7 @@ sys_gethostbyname (const char * name)
 
   if (winsock_lib == NULL)
     {
-      h_errno = ENETDOWN;
+      errno = h_errno = ENETDOWN;
       return NULL;
     }
 
@@ -6443,7 +6450,7 @@ sys_getservbyname (const char * name, const char * proto)
 
   if (winsock_lib == NULL)
     {
-      h_errno = ENETDOWN;
+      errno = h_errno = ENETDOWN;
       return NULL;
     }
 
@@ -6459,7 +6466,7 @@ sys_getpeername (int s, struct sockaddr *addr, int * namelen)
 {
   if (winsock_lib == NULL)
     {
-      h_errno = ENETDOWN;
+      errno = h_errno = ENETDOWN;
       return SOCKET_ERROR;
     }
 
@@ -6471,7 +6478,7 @@ sys_getpeername (int s, struct sockaddr *addr, int * namelen)
        set_errno ();
       return rc;
     }
-  h_errno = ENOTSOCK;
+  errno = h_errno = ENOTSOCK;
   return SOCKET_ERROR;
 }
 
@@ -6480,7 +6487,7 @@ sys_shutdown (int s, int how)
 {
   if (winsock_lib == NULL)
     {
-      h_errno = ENETDOWN;
+      errno = h_errno = ENETDOWN;
       return SOCKET_ERROR;
     }
 
@@ -6492,7 +6499,7 @@ sys_shutdown (int s, int how)
        set_errno ();
       return rc;
     }
-  h_errno = ENOTSOCK;
+  errno = h_errno = ENOTSOCK;
   return SOCKET_ERROR;
 }
 
@@ -6501,7 +6508,7 @@ sys_setsockopt (int s, int level, int optname, const void * optval, int optlen)
 {
   if (winsock_lib == NULL)
     {
-      h_errno = ENETDOWN;
+      errno = h_errno = ENETDOWN;
       return SOCKET_ERROR;
     }
 
@@ -6514,7 +6521,7 @@ sys_setsockopt (int s, int level, int optname, const void * optval, int optlen)
        set_errno ();
       return rc;
     }
-  h_errno = ENOTSOCK;
+  errno = h_errno = ENOTSOCK;
   return SOCKET_ERROR;
 }
 
@@ -6523,7 +6530,7 @@ sys_listen (int s, int backlog)
 {
   if (winsock_lib == NULL)
     {
-      h_errno = ENETDOWN;
+      errno = h_errno = ENETDOWN;
       return SOCKET_ERROR;
     }
 
@@ -6537,7 +6544,7 @@ sys_listen (int s, int backlog)
        fd_info[s].flags |= FILE_LISTEN;
       return rc;
     }
-  h_errno = ENOTSOCK;
+  errno = h_errno = ENOTSOCK;
   return SOCKET_ERROR;
 }
 
@@ -6546,7 +6553,7 @@ sys_getsockname (int s, struct sockaddr * name, int * namelen)
 {
   if (winsock_lib == NULL)
     {
-      h_errno = ENETDOWN;
+      errno = h_errno = ENETDOWN;
       return SOCKET_ERROR;
     }
 
@@ -6558,7 +6565,7 @@ sys_getsockname (int s, struct sockaddr * name, int * namelen)
        set_errno ();
       return rc;
     }
-  h_errno = ENOTSOCK;
+  errno = h_errno = ENOTSOCK;
   return SOCKET_ERROR;
 }
 
@@ -6567,7 +6574,7 @@ sys_accept (int s, struct sockaddr * addr, int * addrlen)
 {
   if (winsock_lib == NULL)
     {
-      h_errno = ENETDOWN;
+      errno = h_errno = ENETDOWN;
       return -1;
     }
 
@@ -6579,13 +6586,20 @@ sys_accept (int s, struct sockaddr * addr, int * addrlen)
       if (t == INVALID_SOCKET)
        set_errno ();
       else
-       fd = socket_to_fd (t);
+       {
+         fd = socket_to_fd (t);
+         if (fd < 0)
+           errno = h_errno;    /* socket_to_fd sets h_errno */
+       }
 
-      fd_info[s].cp->status = STATUS_READ_ACKNOWLEDGED;
-      ResetEvent (fd_info[s].cp->char_avail);
+      if (fd >= 0)
+       {
+         fd_info[s].cp->status = STATUS_READ_ACKNOWLEDGED;
+         ResetEvent (fd_info[s].cp->char_avail);
+       }
       return fd;
     }
-  h_errno = ENOTSOCK;
+  errno = h_errno = ENOTSOCK;
   return -1;
 }
 
@@ -6595,7 +6609,7 @@ sys_recvfrom (int s, char * buf, int len, int flags,
 {
   if (winsock_lib == NULL)
     {
-      h_errno = ENETDOWN;
+      errno = h_errno = ENETDOWN;
       return SOCKET_ERROR;
     }
 
@@ -6607,7 +6621,7 @@ sys_recvfrom (int s, char * buf, int len, int flags,
        set_errno ();
       return rc;
     }
-  h_errno = ENOTSOCK;
+  errno = h_errno = ENOTSOCK;
   return SOCKET_ERROR;
 }
 
@@ -6617,7 +6631,7 @@ sys_sendto (int s, const char * buf, int len, int flags,
 {
   if (winsock_lib == NULL)
     {
-      h_errno = ENETDOWN;
+      errno = h_errno = ENETDOWN;
       return SOCKET_ERROR;
     }
 
@@ -6629,7 +6643,7 @@ sys_sendto (int s, const char * buf, int len, int flags,
        set_errno ();
       return rc;
     }
-  h_errno = ENOTSOCK;
+  errno = h_errno = ENOTSOCK;
   return SOCKET_ERROR;
 }
 
@@ -6640,7 +6654,7 @@ fcntl (int s, int cmd, int options)
 {
   if (winsock_lib == NULL)
     {
-      h_errno = ENETDOWN;
+      errno = h_errno = ENETDOWN;
       return -1;
     }
 
@@ -6663,7 +6677,7 @@ fcntl (int s, int cmd, int options)
          return SOCKET_ERROR;
        }
     }
-  h_errno = ENOTSOCK;
+  errno = h_errno = ENOTSOCK;
   return SOCKET_ERROR;
 }