[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] /srv/bzr/emacs/trunk r111804: Don't set h_errno on MS-Wind
From: |
Eli Zaretskii |
Subject: |
[Emacs-diffs] /srv/bzr/emacs/trunk r111804: Don't set h_errno on MS-Windows except in gethostbyname. |
Date: |
Sat, 16 Feb 2013 13:08:49 +0200 |
User-agent: |
Bazaar (2.5.0) |
------------------------------------------------------------
revno: 111804
committer: Eli Zaretskii <address@hidden>
branch nick: trunk
timestamp: Sat 2013-02-16 13:08:49 +0200
message:
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.
modified:
src/ChangeLog
src/w32.c
=== modified file 'src/ChangeLog'
--- a/src/ChangeLog 2013-02-15 19:37:29 +0000
+++ b/src/ChangeLog 2013-02-16 11:08:49 +0000
@@ -1,3 +1,15 @@
+2013-02-16 Eli Zaretskii <address@hidden>
+
+ * 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.
+
2013-02-15 Paul Eggert <address@hidden>
* process.c (h_errno) [!HAVE_H_ERRNO]: Remove unused decl.
=== modified file 'src/w32.c'
--- a/src/w32.c 2013-02-15 17:31:12 +0000
+++ b/src/w32.c 2013-02-16 11:08:49 +0000
@@ -6092,35 +6092,39 @@
int h_errno = 0;
-/* function to set h_errno for compatibility; map winsock error codes to
- normal system codes where they overlap (non-overlapping definitions
- are already in <sys/socket.h> */
+/* Function to map winsock error codes to errno codes for those errno
+ code defined in errno.h (errno values not defined by errno.h are
+ already in nt/inc/sys/socket.h). */
static void
set_errno (void)
{
+ int wsa_err;
+
+ h_errno = 0;
if (winsock_lib == NULL)
- h_errno = EINVAL;
+ wsa_err = EINVAL;
else
- h_errno = pfn_WSAGetLastError ();
+ wsa_err = pfn_WSAGetLastError ();
- switch (h_errno)
+ switch (wsa_err)
{
- case WSAEACCES: h_errno = EACCES; break;
- case WSAEBADF: h_errno = EBADF; break;
- case WSAEFAULT: h_errno = EFAULT; break;
- case WSAEINTR: h_errno = EINTR; break;
- case WSAEINVAL: h_errno = EINVAL; break;
- case WSAEMFILE: h_errno = EMFILE; break;
- case WSAENAMETOOLONG: h_errno = ENAMETOOLONG; break;
- case WSAENOTEMPTY: h_errno = ENOTEMPTY; break;
+ case WSAEACCES: errno = EACCES; break;
+ case WSAEBADF: errno = EBADF; break;
+ case WSAEFAULT: errno = EFAULT; break;
+ case WSAEINTR: errno = EINTR; break;
+ case WSAEINVAL: errno = EINVAL; break;
+ case WSAEMFILE: errno = EMFILE; break;
+ case WSAENAMETOOLONG: errno = ENAMETOOLONG; break;
+ case WSAENOTEMPTY: errno = ENOTEMPTY; break;
+ default: errno = wsa_err; break;
}
- errno = h_errno;
}
static void
check_errno (void)
{
- if (h_errno == 0 && winsock_lib != NULL)
+ h_errno = 0;
+ if (winsock_lib != NULL)
pfn_WSASetLastError (0);
}
@@ -6232,7 +6236,7 @@
if (winsock_lib == NULL)
{
- errno = h_errno = ENETDOWN;
+ errno = ENETDOWN;
return INVALID_SOCKET;
}
@@ -6242,13 +6246,7 @@
s = pfn_socket (af, type, protocol);
if (s != INVALID_SOCKET)
- {
- int retval = socket_to_fd (s);
-
- if (retval == -1)
- errno = h_errno;
- return retval;
- }
+ return socket_to_fd (s);
set_errno ();
return -1;
@@ -6344,8 +6342,9 @@
/* clean up */
_close (fd);
}
+ else
pfn_closesocket (s);
- h_errno = EMFILE;
+ errno = EMFILE;
return -1;
}
@@ -6354,7 +6353,7 @@
{
if (winsock_lib == NULL)
{
- errno = h_errno = ENOTSOCK;
+ errno = ENOTSOCK;
return SOCKET_ERROR;
}
@@ -6366,7 +6365,7 @@
set_errno ();
return rc;
}
- errno = h_errno = ENOTSOCK;
+ errno = ENOTSOCK;
return SOCKET_ERROR;
}
@@ -6375,7 +6374,7 @@
{
if (winsock_lib == NULL)
{
- errno = h_errno = ENOTSOCK;
+ errno = ENOTSOCK;
return SOCKET_ERROR;
}
@@ -6387,7 +6386,7 @@
set_errno ();
return rc;
}
- errno = h_errno = ENOTSOCK;
+ errno = ENOTSOCK;
return SOCKET_ERROR;
}
@@ -6416,12 +6415,20 @@
sys_gethostname (char * name, int namelen)
{
if (winsock_lib != NULL)
- return pfn_gethostname (name, namelen);
+ {
+ int retval;
+
+ check_errno ();
+ retval = pfn_gethostname (name, namelen);
+ if (retval == SOCKET_ERROR)
+ set_errno ();
+ return retval;
+ }
if (namelen > MAX_COMPUTERNAME_LENGTH)
return !GetComputerName (name, (DWORD *)&namelen);
- errno = h_errno = EFAULT;
+ errno = EFAULT;
return SOCKET_ERROR;
}
@@ -6429,17 +6436,24 @@
sys_gethostbyname (const char * name)
{
struct hostent * host;
+ int h_err = h_errno;
if (winsock_lib == NULL)
{
- errno = h_errno = ENETDOWN;
+ h_errno = NO_RECOVERY;
+ errno = ENETDOWN;
return NULL;
}
check_errno ();
host = pfn_gethostbyname (name);
if (!host)
- set_errno ();
+ {
+ set_errno ();
+ h_errno = errno;
+ }
+ else
+ h_errno = h_err;
return host;
}
@@ -6450,7 +6464,7 @@
if (winsock_lib == NULL)
{
- errno = h_errno = ENETDOWN;
+ errno = ENETDOWN;
return NULL;
}
@@ -6466,7 +6480,7 @@
{
if (winsock_lib == NULL)
{
- errno = h_errno = ENETDOWN;
+ errno = ENETDOWN;
return SOCKET_ERROR;
}
@@ -6478,7 +6492,7 @@
set_errno ();
return rc;
}
- errno = h_errno = ENOTSOCK;
+ errno = ENOTSOCK;
return SOCKET_ERROR;
}
@@ -6487,7 +6501,7 @@
{
if (winsock_lib == NULL)
{
- errno = h_errno = ENETDOWN;
+ errno = ENETDOWN;
return SOCKET_ERROR;
}
@@ -6499,7 +6513,7 @@
set_errno ();
return rc;
}
- errno = h_errno = ENOTSOCK;
+ errno = ENOTSOCK;
return SOCKET_ERROR;
}
@@ -6508,7 +6522,7 @@
{
if (winsock_lib == NULL)
{
- errno = h_errno = ENETDOWN;
+ errno = ENETDOWN;
return SOCKET_ERROR;
}
@@ -6521,7 +6535,7 @@
set_errno ();
return rc;
}
- errno = h_errno = ENOTSOCK;
+ errno = ENOTSOCK;
return SOCKET_ERROR;
}
@@ -6530,7 +6544,7 @@
{
if (winsock_lib == NULL)
{
- errno = h_errno = ENETDOWN;
+ errno = ENETDOWN;
return SOCKET_ERROR;
}
@@ -6544,7 +6558,7 @@
fd_info[s].flags |= FILE_LISTEN;
return rc;
}
- errno = h_errno = ENOTSOCK;
+ errno = ENOTSOCK;
return SOCKET_ERROR;
}
@@ -6553,7 +6567,7 @@
{
if (winsock_lib == NULL)
{
- errno = h_errno = ENETDOWN;
+ errno = ENETDOWN;
return SOCKET_ERROR;
}
@@ -6565,7 +6579,7 @@
set_errno ();
return rc;
}
- errno = h_errno = ENOTSOCK;
+ errno = ENOTSOCK;
return SOCKET_ERROR;
}
@@ -6574,7 +6588,7 @@
{
if (winsock_lib == NULL)
{
- errno = h_errno = ENETDOWN;
+ errno = ENETDOWN;
return -1;
}
@@ -6586,11 +6600,7 @@
if (t == INVALID_SOCKET)
set_errno ();
else
- {
- fd = socket_to_fd (t);
- if (fd < 0)
- errno = h_errno; /* socket_to_fd sets h_errno */
- }
+ fd = socket_to_fd (t);
if (fd >= 0)
{
@@ -6599,7 +6609,7 @@
}
return fd;
}
- errno = h_errno = ENOTSOCK;
+ errno = ENOTSOCK;
return -1;
}
@@ -6609,7 +6619,7 @@
{
if (winsock_lib == NULL)
{
- errno = h_errno = ENETDOWN;
+ errno = ENETDOWN;
return SOCKET_ERROR;
}
@@ -6621,7 +6631,7 @@
set_errno ();
return rc;
}
- errno = h_errno = ENOTSOCK;
+ errno = ENOTSOCK;
return SOCKET_ERROR;
}
@@ -6631,7 +6641,7 @@
{
if (winsock_lib == NULL)
{
- errno = h_errno = ENETDOWN;
+ errno = ENETDOWN;
return SOCKET_ERROR;
}
@@ -6643,7 +6653,7 @@
set_errno ();
return rc;
}
- errno = h_errno = ENOTSOCK;
+ errno = ENOTSOCK;
return SOCKET_ERROR;
}
@@ -6654,7 +6664,7 @@
{
if (winsock_lib == NULL)
{
- errno = h_errno = ENETDOWN;
+ errno = ENETDOWN;
return -1;
}
@@ -6673,11 +6683,11 @@
}
else
{
- h_errno = EINVAL;
+ errno = EINVAL;
return SOCKET_ERROR;
}
}
- errno = h_errno = ENOTSOCK;
+ errno = ENOTSOCK;
return SOCKET_ERROR;
}
@@ -7108,7 +7118,7 @@
pfn_ioctlsocket (SOCK_HANDLE (fd), FIONREAD, &waiting);
if (waiting == 0 && nchars == 0)
{
- h_errno = errno = EWOULDBLOCK;
+ errno = EWOULDBLOCK;
return -1;
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] /srv/bzr/emacs/trunk r111804: Don't set h_errno on MS-Windows except in gethostbyname.,
Eli Zaretskii <=