aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEli Zaretskii2013-02-16 13:08:49 +0200
committerEli Zaretskii2013-02-16 13:08:49 +0200
commitf277993be3a50b375c670351cb4051c806edd97f (patch)
treec92aa8b73303472c251fc6cb8ca42d3822ac3296 /src
parent2b0afdd959577f6049dbcb64e17885fcf75a95b9 (diff)
downloademacs-f277993be3a50b375c670351cb4051c806edd97f.tar.gz
emacs-f277993be3a50b375c670351cb4051c806edd97f.zip
Don't set h_errno on MS-Windows except in gethostbyname.
See http://lists.gnu.org/archive/html/emacs-devel/2013-02/msg00293.html and the following discussion for the details. src/w32.c (set_errno): Reset h_errno and don't set it to any other value. Set errno instead. (check_errno): Reset h_errno. (sys_socket, socket_to_fd, sys_bind, sys_connect) (sys_gethostname, sys_getservbyname, sys_getpeername) (sys_shutdown, sys_setsockopt, sys_listen, sys_getsockname) (sys_accept, sys_recvfrom, sys_sendto, fcntl, sys_read): Don't set h_errno. (sys_gethostbyname): Set h_errno only errors detected.
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog12
-rw-r--r--src/w32.c128
2 files changed, 81 insertions, 59 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 6ff25edac50..d326532ecb7 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,15 @@
12013-02-16 Eli Zaretskii <eliz@gnu.org>
2
3 * w32.c (set_errno): Reset h_errno and don't set it to any other
4 value. Set errno instead.
5 (check_errno): Reset h_errno.
6 (sys_socket, socket_to_fd, sys_bind, sys_connect)
7 (sys_gethostname, sys_getservbyname, sys_getpeername)
8 (sys_shutdown, sys_setsockopt, sys_listen, sys_getsockname)
9 (sys_accept, sys_recvfrom, sys_sendto, fcntl, sys_read): Don't set
10 h_errno.
11 (sys_gethostbyname): Set h_errno only errors detected.
12
12013-02-15 Paul Eggert <eggert@cs.ucla.edu> 132013-02-15 Paul Eggert <eggert@cs.ucla.edu>
2 14
3 * process.c (h_errno) [!HAVE_H_ERRNO]: Remove unused decl. 15 * process.c (h_errno) [!HAVE_H_ERRNO]: Remove unused decl.
diff --git a/src/w32.c b/src/w32.c
index 25cc2185793..12fb248b2d0 100644
--- a/src/w32.c
+++ b/src/w32.c
@@ -6092,35 +6092,39 @@ init_winsock (int load_now)
6092 6092
6093int h_errno = 0; 6093int h_errno = 0;
6094 6094
6095/* function to set h_errno for compatibility; map winsock error codes to 6095/* Function to map winsock error codes to errno codes for those errno
6096 normal system codes where they overlap (non-overlapping definitions 6096 code defined in errno.h (errno values not defined by errno.h are
6097 are already in <sys/socket.h> */ 6097 already in nt/inc/sys/socket.h). */
6098static void 6098static void
6099set_errno (void) 6099set_errno (void)
6100{ 6100{
6101 int wsa_err;
6102
6103 h_errno = 0;
6101 if (winsock_lib == NULL) 6104 if (winsock_lib == NULL)
6102 h_errno = EINVAL; 6105 wsa_err = EINVAL;
6103 else 6106 else
6104 h_errno = pfn_WSAGetLastError (); 6107 wsa_err = pfn_WSAGetLastError ();
6105 6108
6106 switch (h_errno) 6109 switch (wsa_err)
6107 { 6110 {
6108 case WSAEACCES: h_errno = EACCES; break; 6111 case WSAEACCES: errno = EACCES; break;
6109 case WSAEBADF: h_errno = EBADF; break; 6112 case WSAEBADF: errno = EBADF; break;
6110 case WSAEFAULT: h_errno = EFAULT; break; 6113 case WSAEFAULT: errno = EFAULT; break;
6111 case WSAEINTR: h_errno = EINTR; break; 6114 case WSAEINTR: errno = EINTR; break;
6112 case WSAEINVAL: h_errno = EINVAL; break; 6115 case WSAEINVAL: errno = EINVAL; break;
6113 case WSAEMFILE: h_errno = EMFILE; break; 6116 case WSAEMFILE: errno = EMFILE; break;
6114 case WSAENAMETOOLONG: h_errno = ENAMETOOLONG; break; 6117 case WSAENAMETOOLONG: errno = ENAMETOOLONG; break;
6115 case WSAENOTEMPTY: h_errno = ENOTEMPTY; break; 6118 case WSAENOTEMPTY: errno = ENOTEMPTY; break;
6119 default: errno = wsa_err; break;
6116 } 6120 }
6117 errno = h_errno;
6118} 6121}
6119 6122
6120static void 6123static void
6121check_errno (void) 6124check_errno (void)
6122{ 6125{
6123 if (h_errno == 0 && winsock_lib != NULL) 6126 h_errno = 0;
6127 if (winsock_lib != NULL)
6124 pfn_WSASetLastError (0); 6128 pfn_WSASetLastError (0);
6125} 6129}
6126 6130
@@ -6232,7 +6236,7 @@ sys_socket (int af, int type, int protocol)
6232 6236
6233 if (winsock_lib == NULL) 6237 if (winsock_lib == NULL)
6234 { 6238 {
6235 errno = h_errno = ENETDOWN; 6239 errno = ENETDOWN;
6236 return INVALID_SOCKET; 6240 return INVALID_SOCKET;
6237 } 6241 }
6238 6242
@@ -6242,13 +6246,7 @@ sys_socket (int af, int type, int protocol)
6242 s = pfn_socket (af, type, protocol); 6246 s = pfn_socket (af, type, protocol);
6243 6247
6244 if (s != INVALID_SOCKET) 6248 if (s != INVALID_SOCKET)
6245 { 6249 return socket_to_fd (s);
6246 int retval = socket_to_fd (s);
6247
6248 if (retval == -1)
6249 errno = h_errno;
6250 return retval;
6251 }
6252 6250
6253 set_errno (); 6251 set_errno ();
6254 return -1; 6252 return -1;
@@ -6344,8 +6342,9 @@ socket_to_fd (SOCKET s)
6344 /* clean up */ 6342 /* clean up */
6345 _close (fd); 6343 _close (fd);
6346 } 6344 }
6345 else
6347 pfn_closesocket (s); 6346 pfn_closesocket (s);
6348 h_errno = EMFILE; 6347 errno = EMFILE;
6349 return -1; 6348 return -1;
6350} 6349}
6351 6350
@@ -6354,7 +6353,7 @@ sys_bind (int s, const struct sockaddr * addr, int namelen)
6354{ 6353{
6355 if (winsock_lib == NULL) 6354 if (winsock_lib == NULL)
6356 { 6355 {
6357 errno = h_errno = ENOTSOCK; 6356 errno = ENOTSOCK;
6358 return SOCKET_ERROR; 6357 return SOCKET_ERROR;
6359 } 6358 }
6360 6359
@@ -6366,7 +6365,7 @@ sys_bind (int s, const struct sockaddr * addr, int namelen)
6366 set_errno (); 6365 set_errno ();
6367 return rc; 6366 return rc;
6368 } 6367 }
6369 errno = h_errno = ENOTSOCK; 6368 errno = ENOTSOCK;
6370 return SOCKET_ERROR; 6369 return SOCKET_ERROR;
6371} 6370}
6372 6371
@@ -6375,7 +6374,7 @@ sys_connect (int s, const struct sockaddr * name, int namelen)
6375{ 6374{
6376 if (winsock_lib == NULL) 6375 if (winsock_lib == NULL)
6377 { 6376 {
6378 errno = h_errno = ENOTSOCK; 6377 errno = ENOTSOCK;
6379 return SOCKET_ERROR; 6378 return SOCKET_ERROR;
6380 } 6379 }
6381 6380
@@ -6387,7 +6386,7 @@ sys_connect (int s, const struct sockaddr * name, int namelen)
6387 set_errno (); 6386 set_errno ();
6388 return rc; 6387 return rc;
6389 } 6388 }
6390 errno = h_errno = ENOTSOCK; 6389 errno = ENOTSOCK;
6391 return SOCKET_ERROR; 6390 return SOCKET_ERROR;
6392} 6391}
6393 6392
@@ -6416,12 +6415,20 @@ int
6416sys_gethostname (char * name, int namelen) 6415sys_gethostname (char * name, int namelen)
6417{ 6416{
6418 if (winsock_lib != NULL) 6417 if (winsock_lib != NULL)
6419 return pfn_gethostname (name, namelen); 6418 {
6419 int retval;
6420
6421 check_errno ();
6422 retval = pfn_gethostname (name, namelen);
6423 if (retval == SOCKET_ERROR)
6424 set_errno ();
6425 return retval;
6426 }
6420 6427
6421 if (namelen > MAX_COMPUTERNAME_LENGTH) 6428 if (namelen > MAX_COMPUTERNAME_LENGTH)
6422 return !GetComputerName (name, (DWORD *)&namelen); 6429 return !GetComputerName (name, (DWORD *)&namelen);
6423 6430
6424 errno = h_errno = EFAULT; 6431 errno = EFAULT;
6425 return SOCKET_ERROR; 6432 return SOCKET_ERROR;
6426} 6433}
6427 6434
@@ -6429,17 +6436,24 @@ struct hostent *
6429sys_gethostbyname (const char * name) 6436sys_gethostbyname (const char * name)
6430{ 6437{
6431 struct hostent * host; 6438 struct hostent * host;
6439 int h_err = h_errno;
6432 6440
6433 if (winsock_lib == NULL) 6441 if (winsock_lib == NULL)
6434 { 6442 {
6435 errno = h_errno = ENETDOWN; 6443 h_errno = NO_RECOVERY;
6444 errno = ENETDOWN;
6436 return NULL; 6445 return NULL;
6437 } 6446 }
6438 6447
6439 check_errno (); 6448 check_errno ();
6440 host = pfn_gethostbyname (name); 6449 host = pfn_gethostbyname (name);
6441 if (!host) 6450 if (!host)
6442 set_errno (); 6451 {
6452 set_errno ();
6453 h_errno = errno;
6454 }
6455 else
6456 h_errno = h_err;
6443 return host; 6457 return host;
6444} 6458}
6445 6459
@@ -6450,7 +6464,7 @@ sys_getservbyname (const char * name, const char * proto)
6450 6464
6451 if (winsock_lib == NULL) 6465 if (winsock_lib == NULL)
6452 { 6466 {
6453 errno = h_errno = ENETDOWN; 6467 errno = ENETDOWN;
6454 return NULL; 6468 return NULL;
6455 } 6469 }
6456 6470
@@ -6466,7 +6480,7 @@ sys_getpeername (int s, struct sockaddr *addr, int * namelen)
6466{ 6480{
6467 if (winsock_lib == NULL) 6481 if (winsock_lib == NULL)
6468 { 6482 {
6469 errno = h_errno = ENETDOWN; 6483 errno = ENETDOWN;
6470 return SOCKET_ERROR; 6484 return SOCKET_ERROR;
6471 } 6485 }
6472 6486
@@ -6478,7 +6492,7 @@ sys_getpeername (int s, struct sockaddr *addr, int * namelen)
6478 set_errno (); 6492 set_errno ();
6479 return rc; 6493 return rc;
6480 } 6494 }
6481 errno = h_errno = ENOTSOCK; 6495 errno = ENOTSOCK;
6482 return SOCKET_ERROR; 6496 return SOCKET_ERROR;
6483} 6497}
6484 6498
@@ -6487,7 +6501,7 @@ sys_shutdown (int s, int how)
6487{ 6501{
6488 if (winsock_lib == NULL) 6502 if (winsock_lib == NULL)
6489 { 6503 {
6490 errno = h_errno = ENETDOWN; 6504 errno = ENETDOWN;
6491 return SOCKET_ERROR; 6505 return SOCKET_ERROR;
6492 } 6506 }
6493 6507
@@ -6499,7 +6513,7 @@ sys_shutdown (int s, int how)
6499 set_errno (); 6513 set_errno ();
6500 return rc; 6514 return rc;
6501 } 6515 }
6502 errno = h_errno = ENOTSOCK; 6516 errno = ENOTSOCK;
6503 return SOCKET_ERROR; 6517 return SOCKET_ERROR;
6504} 6518}
6505 6519
@@ -6508,7 +6522,7 @@ sys_setsockopt (int s, int level, int optname, const void * optval, int optlen)
6508{ 6522{
6509 if (winsock_lib == NULL) 6523 if (winsock_lib == NULL)
6510 { 6524 {
6511 errno = h_errno = ENETDOWN; 6525 errno = ENETDOWN;
6512 return SOCKET_ERROR; 6526 return SOCKET_ERROR;
6513 } 6527 }
6514 6528
@@ -6521,7 +6535,7 @@ sys_setsockopt (int s, int level, int optname, const void * optval, int optlen)
6521 set_errno (); 6535 set_errno ();
6522 return rc; 6536 return rc;
6523 } 6537 }
6524 errno = h_errno = ENOTSOCK; 6538 errno = ENOTSOCK;
6525 return SOCKET_ERROR; 6539 return SOCKET_ERROR;
6526} 6540}
6527 6541
@@ -6530,7 +6544,7 @@ sys_listen (int s, int backlog)
6530{ 6544{
6531 if (winsock_lib == NULL) 6545 if (winsock_lib == NULL)
6532 { 6546 {
6533 errno = h_errno = ENETDOWN; 6547 errno = ENETDOWN;
6534 return SOCKET_ERROR; 6548 return SOCKET_ERROR;
6535 } 6549 }
6536 6550
@@ -6544,7 +6558,7 @@ sys_listen (int s, int backlog)
6544 fd_info[s].flags |= FILE_LISTEN; 6558 fd_info[s].flags |= FILE_LISTEN;
6545 return rc; 6559 return rc;
6546 } 6560 }
6547 errno = h_errno = ENOTSOCK; 6561 errno = ENOTSOCK;
6548 return SOCKET_ERROR; 6562 return SOCKET_ERROR;
6549} 6563}
6550 6564
@@ -6553,7 +6567,7 @@ sys_getsockname (int s, struct sockaddr * name, int * namelen)
6553{ 6567{
6554 if (winsock_lib == NULL) 6568 if (winsock_lib == NULL)
6555 { 6569 {
6556 errno = h_errno = ENETDOWN; 6570 errno = ENETDOWN;
6557 return SOCKET_ERROR; 6571 return SOCKET_ERROR;
6558 } 6572 }
6559 6573
@@ -6565,7 +6579,7 @@ sys_getsockname (int s, struct sockaddr * name, int * namelen)
6565 set_errno (); 6579 set_errno ();
6566 return rc; 6580 return rc;
6567 } 6581 }
6568 errno = h_errno = ENOTSOCK; 6582 errno = ENOTSOCK;
6569 return SOCKET_ERROR; 6583 return SOCKET_ERROR;
6570} 6584}
6571 6585
@@ -6574,7 +6588,7 @@ sys_accept (int s, struct sockaddr * addr, int * addrlen)
6574{ 6588{
6575 if (winsock_lib == NULL) 6589 if (winsock_lib == NULL)
6576 { 6590 {
6577 errno = h_errno = ENETDOWN; 6591 errno = ENETDOWN;
6578 return -1; 6592 return -1;
6579 } 6593 }
6580 6594
@@ -6586,11 +6600,7 @@ sys_accept (int s, struct sockaddr * addr, int * addrlen)
6586 if (t == INVALID_SOCKET) 6600 if (t == INVALID_SOCKET)
6587 set_errno (); 6601 set_errno ();
6588 else 6602 else
6589 { 6603 fd = socket_to_fd (t);
6590 fd = socket_to_fd (t);
6591 if (fd < 0)
6592 errno = h_errno; /* socket_to_fd sets h_errno */
6593 }
6594 6604
6595 if (fd >= 0) 6605 if (fd >= 0)
6596 { 6606 {
@@ -6599,7 +6609,7 @@ sys_accept (int s, struct sockaddr * addr, int * addrlen)
6599 } 6609 }
6600 return fd; 6610 return fd;
6601 } 6611 }
6602 errno = h_errno = ENOTSOCK; 6612 errno = ENOTSOCK;
6603 return -1; 6613 return -1;
6604} 6614}
6605 6615
@@ -6609,7 +6619,7 @@ sys_recvfrom (int s, char * buf, int len, int flags,
6609{ 6619{
6610 if (winsock_lib == NULL) 6620 if (winsock_lib == NULL)
6611 { 6621 {
6612 errno = h_errno = ENETDOWN; 6622 errno = ENETDOWN;
6613 return SOCKET_ERROR; 6623 return SOCKET_ERROR;
6614 } 6624 }
6615 6625
@@ -6621,7 +6631,7 @@ sys_recvfrom (int s, char * buf, int len, int flags,
6621 set_errno (); 6631 set_errno ();
6622 return rc; 6632 return rc;
6623 } 6633 }
6624 errno = h_errno = ENOTSOCK; 6634 errno = ENOTSOCK;
6625 return SOCKET_ERROR; 6635 return SOCKET_ERROR;
6626} 6636}
6627 6637
@@ -6631,7 +6641,7 @@ sys_sendto (int s, const char * buf, int len, int flags,
6631{ 6641{
6632 if (winsock_lib == NULL) 6642 if (winsock_lib == NULL)
6633 { 6643 {
6634 errno = h_errno = ENETDOWN; 6644 errno = ENETDOWN;
6635 return SOCKET_ERROR; 6645 return SOCKET_ERROR;
6636 } 6646 }
6637 6647
@@ -6643,7 +6653,7 @@ sys_sendto (int s, const char * buf, int len, int flags,
6643 set_errno (); 6653 set_errno ();
6644 return rc; 6654 return rc;
6645 } 6655 }
6646 errno = h_errno = ENOTSOCK; 6656 errno = ENOTSOCK;
6647 return SOCKET_ERROR; 6657 return SOCKET_ERROR;
6648} 6658}
6649 6659
@@ -6654,7 +6664,7 @@ fcntl (int s, int cmd, int options)
6654{ 6664{
6655 if (winsock_lib == NULL) 6665 if (winsock_lib == NULL)
6656 { 6666 {
6657 errno = h_errno = ENETDOWN; 6667 errno = ENETDOWN;
6658 return -1; 6668 return -1;
6659 } 6669 }
6660 6670
@@ -6673,11 +6683,11 @@ fcntl (int s, int cmd, int options)
6673 } 6683 }
6674 else 6684 else
6675 { 6685 {
6676 h_errno = EINVAL; 6686 errno = EINVAL;
6677 return SOCKET_ERROR; 6687 return SOCKET_ERROR;
6678 } 6688 }
6679 } 6689 }
6680 errno = h_errno = ENOTSOCK; 6690 errno = ENOTSOCK;
6681 return SOCKET_ERROR; 6691 return SOCKET_ERROR;
6682} 6692}
6683 6693
@@ -7108,7 +7118,7 @@ sys_read (int fd, char * buffer, unsigned int count)
7108 pfn_ioctlsocket (SOCK_HANDLE (fd), FIONREAD, &waiting); 7118 pfn_ioctlsocket (SOCK_HANDLE (fd), FIONREAD, &waiting);
7109 if (waiting == 0 && nchars == 0) 7119 if (waiting == 0 && nchars == 0)
7110 { 7120 {
7111 h_errno = errno = EWOULDBLOCK; 7121 errno = EWOULDBLOCK;
7112 return -1; 7122 return -1;
7113 } 7123 }
7114 7124