aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNIIBE Yutaka <[email protected]>2024-12-16 05:44:21 +0000
committerNIIBE Yutaka <[email protected]>2024-12-16 05:51:58 +0000
commit70d454e1ff48d5fe5765645a7bec1c27b3b8ad38 (patch)
tree8e077f655c1d2bb60fa0fc3d690cbd5580e8b444
parentw32: Fix errno for assuan_sock_bind failure. (diff)
downloadlibassuan-70d454e1ff48d5fe5765645a7bec1c27b3b8ad38.tar.gz
libassuan-70d454e1ff48d5fe5765645a7bec1c27b3b8ad38.zip
w32: Enable "w32_error" for assuan_sock_get_flag.
* src/assuan-defs.h (struct assuan_context_s): Have w32_error field. (_assuan_sock_wsa2errno): Supply CTX argument. * src/assuan-socket.c (_assuan_sock_wsa2errno): Put ERR to the field in CTX argument. (_assuan_sock_get_flag): Support "w32_error" string. (_assuan_sock_accept, _assuan_sock_bind): Follow the change. * src/assuan-uds.c (uds_reader, uds_writer): Likewise. * src/system-w32.c (__assuan_close, __assuan_socket): Likewise. (__assuan_connect): Likewise. -- GnuPG-bug-id: 7456 Signed-off-by: NIIBE Yutaka <[email protected]>
-rw-r--r--src/assuan-defs.h3
-rw-r--r--src/assuan-socket.c14
-rw-r--r--src/assuan-uds.c4
-rw-r--r--src/system-w32.c6
4 files changed, 17 insertions, 10 deletions
diff --git a/src/assuan-defs.h b/src/assuan-defs.h
index e7fb28b..fcb3d2b 100644
--- a/src/assuan-defs.h
+++ b/src/assuan-defs.h
@@ -76,6 +76,7 @@ struct assuan_context_s
#ifdef HAVE_W32_SYSTEM
/* The per-context w32 error string. */
char w32_strerror[256];
+ int w32_error;
#endif
/* The allocation hooks. */
@@ -402,7 +403,7 @@ int _assuan_sock_check_nonce (assuan_context_t ctx, assuan_fd_t fd,
assuan_sock_nonce_t *nonce);
#ifdef HAVE_W32_SYSTEM
wchar_t *_assuan_utf8_to_wchar (const char *string);
-int _assuan_sock_wsa2errno (int err);
+int _assuan_sock_wsa2errno (assuan_context_t ctx, int err);
#endif
#ifdef HAVE_FOPENCOOKIE
diff --git a/src/assuan-socket.c b/src/assuan-socket.c
index 2b148d1..4c859a5 100644
--- a/src/assuan-socket.c
+++ b/src/assuan-socket.c
@@ -289,7 +289,7 @@ MyDeleteFile (LPCSTR lpFileName)
int
-_assuan_sock_wsa2errno (int err)
+_assuan_sock_wsa2errno (assuan_context_t ctx, int err)
{
switch (err)
{
@@ -306,6 +306,8 @@ _assuan_sock_wsa2errno (int err)
default:
return EIO;
}
+
+ ctx->w32_error = err;
}
@@ -674,6 +676,10 @@ _assuan_sock_get_flag (assuan_context_t ctx, assuan_fd_t sockfd,
}
*r_value = !!i;
}
+#ifdef HAVE_W32_SYSTEM
+ else if (!strcmp (name, "w32_error"))
+ *r_value = ctx->w32_error;
+#endif
else
{
gpg_err_set_errno (EINVAL);
@@ -1076,7 +1082,7 @@ _assuan_sock_accept (assuan_context_t ctx, assuan_fd_t sockfd,
#ifdef HAVE_W32_SYSTEM
res = SOCKET2HANDLE (accept (HANDLE2SOCKET (sockfd), addr, p_addrlen));
if (res == SOCKET2HANDLE (INVALID_SOCKET))
- gpg_err_set_errno (_assuan_sock_wsa2errno (WSAGetLastError ()));
+ gpg_err_set_errno (_assuan_sock_wsa2errno (ctx, WSAGetLastError ()));
#else
res = accept (sockfd, addr, p_addrlen);
#endif
@@ -1312,7 +1318,7 @@ _assuan_sock_bind (assuan_context_t ctx, assuan_fd_t sockfd,
(struct sockaddr *)&myaddr, &len);
if (rc)
{
- int save_e = _assuan_sock_wsa2errno (WSAGetLastError ());
+ int save_e = _assuan_sock_wsa2errno (ctx, WSAGetLastError ());
CloseHandle (filehd);
MyDeleteFile (unaddr->sun_path);
gpg_err_set_errno (save_e);
@@ -1351,7 +1357,7 @@ _assuan_sock_bind (assuan_context_t ctx, assuan_fd_t sockfd,
{
res = bind (HANDLE2SOCKET(sockfd), addr, addrlen);
if (res < 0)
- gpg_err_set_errno ( _assuan_sock_wsa2errno (WSAGetLastError ()));
+ gpg_err_set_errno ( _assuan_sock_wsa2errno (ctx, WSAGetLastError ()));
}
leave:
#else
diff --git a/src/assuan-uds.c b/src/assuan-uds.c
index 8712b02..01f0861 100644
--- a/src/assuan-uds.c
+++ b/src/assuan-uds.c
@@ -148,7 +148,7 @@ uds_reader (assuan_context_t ctx, void *buf, size_t buflen)
#else /*HAVE_W32_SYSTEM*/
int res = recvfrom (HANDLE2SOCKET(ctx->inbound.fd), buf, buflen, 0, NULL, NULL);
if (res < 0)
- gpg_err_set_errno (_assuan_sock_wsa2errno (WSAGetLastError ()));
+ gpg_err_set_errno (_assuan_sock_wsa2errno (ctx, WSAGetLastError ()));
return res;
#endif /*HAVE_W32_SYSTEM*/
}
@@ -180,7 +180,7 @@ uds_writer (assuan_context_t ctx, const void *buf, size_t buflen)
(struct sockaddr *)&ctx->serveraddr,
sizeof (struct sockaddr_in));
if (res < 0)
- gpg_err_set_errno ( _assuan_sock_wsa2errno (WSAGetLastError ()));
+ gpg_err_set_errno ( _assuan_sock_wsa2errno (ctx, WSAGetLastError ()));
return res;
#endif /*HAVE_W32_SYSTEM*/
}
diff --git a/src/system-w32.c b/src/system-w32.c
index 25c2df2..80c935a 100644
--- a/src/system-w32.c
+++ b/src/system-w32.c
@@ -149,7 +149,7 @@ __assuan_close (assuan_context_t ctx, assuan_fd_t fd)
{
int rc = closesocket (HANDLE2SOCKET(fd));
if (rc)
- gpg_err_set_errno ( _assuan_sock_wsa2errno (WSAGetLastError ()) );
+ gpg_err_set_errno ( _assuan_sock_wsa2errno (ctx, WSAGetLastError ()) );
if (rc && WSAGetLastError () == WSAENOTSOCK)
{
rc = CloseHandle (fd);
@@ -647,7 +647,7 @@ __assuan_socket (assuan_context_t ctx, int domain, int type, int proto)
res = SOCKET2HANDLE (socket (domain, type, proto));
if (res == SOCKET2HANDLE (INVALID_SOCKET))
- gpg_err_set_errno (_assuan_sock_wsa2errno (WSAGetLastError ()));
+ gpg_err_set_errno (_assuan_sock_wsa2errno (ctx, WSAGetLastError ()));
return res;
}
@@ -660,7 +660,7 @@ __assuan_connect (assuan_context_t ctx, assuan_fd_t sock,
res = connect (HANDLE2SOCKET (sock), addr, length);
if (res < 0)
- gpg_err_set_errno (_assuan_sock_wsa2errno (WSAGetLastError ()));
+ gpg_err_set_errno (_assuan_sock_wsa2errno (ctx, WSAGetLastError ()));
return res;
}