summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNIIBE Yutaka <gniibe@fsij.org>2022-11-07 12:13:37 +0900
committerNIIBE Yutaka <gniibe@fsij.org>2022-11-07 12:13:37 +0900
commit8a49959a1eed8ddce73fb3146d5a853061e36497 (patch)
tree66c33fd55e1a4ae0563ec70c273d5f0c7b17cfb0
parent4b3f2e4ac67491f1cf7f1f7ab25fee44b7e6bb96 (diff)
downloadlibassuan-8a49959a1eed8ddce73fb3146d5a853061e36497.tar.gz
Use higher-layer assuan_transact for fdpassing.
Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
-rw-r--r--src/system-w32.c76
-rw-r--r--tests/fdpassing-socket.c8
2 files changed, 5 insertions, 79 deletions
diff --git a/src/system-w32.c b/src/system-w32.c
index 1392a1e..76ff2a0 100644
--- a/src/system-w32.c
+++ b/src/system-w32.c
@@ -167,10 +167,6 @@ __assuan_close (assuan_context_t ctx, assuan_fd_t fd)
-/* To encode/decode file HANDLE, we use FDPASS_FORMAT */
-#define FDPASS_FORMAT "%p"
-#define FDPASS_MSG_SIZE (sizeof (uintptr_t)*2 + 1)
-
/* Get a file HANDLE to send, from POSIX fd. */
static gpg_error_t
get_file_handle (int fd, int server_pid, HANDLE *r_handle)
@@ -224,30 +220,6 @@ w32_fdpass_send (assuan_context_t ctx, assuan_fd_t fd)
return err;
}
-static int
-process_fdpass_msg (const char *fdpass_msg, size_t msglen, int *r_fd)
-{
- void *file_handle;
- int res;
- int fd;
-
- *r_fd = -1;
-
- res = sscanf (fdpass_msg, FDPASS_FORMAT, &file_handle);
- if (res != 1)
- return -1;
-
- fd = _open_osfhandle ((intptr_t)file_handle, _O_RDWR);
- if (fd < 0)
- {
- CloseHandle (file_handle);
- return -1;
- }
-
- *r_fd = fd;
- return 0;
-}
-
/* Receive a HANDLE from the peer and turn it into a FD (POSIX fd). */
gpg_error_t
@@ -280,53 +252,7 @@ __assuan_read (assuan_context_t ctx, assuan_fd_t fd, void *buffer, size_t size)
if (ctx->flags.is_socket)
{
- fd_set fds;
int tries = 3;
- fd_set efds;
-
- FD_ZERO (&fds);
- FD_SET (HANDLE2SOCKET (fd), &fds);
- FD_ZERO (&efds);
- FD_SET (HANDLE2SOCKET (fd), &efds);
- res = select (0, &fds, NULL, &efds, NULL);
- if (res < 0)
- {
- gpg_err_set_errno (EIO);
- return -1;
- }
- else if (FD_ISSET (HANDLE2SOCKET (fd), &efds))
- {
- int fd_recv;
- char fdpass_msg[FDPASS_MSG_SIZE];
-
- /* the message of ! */
- res = recv (HANDLE2SOCKET (fd), fdpass_msg, sizeof (fdpass_msg), MSG_OOB);
- if (res < 0)
- {
- gpg_err_set_errno (EIO);
- return -1;
- }
-
- /* the body of message */
- res = recv (HANDLE2SOCKET (fd), fdpass_msg, sizeof (fdpass_msg), 0);
- if (res < 0)
- {
- gpg_err_set_errno (EIO);
- return -1;
- }
-
- res = process_fdpass_msg (fdpass_msg, res, &fd_recv);
- if (res < 0)
- {
- gpg_err_set_errno (EIO);
- return -1;
- }
-
- ctx->uds.pendingfds[ctx->uds.pendingfdscount++] = (assuan_fd_t)fd_recv;
- TRACE1 (ctx, ASSUAN_LOG_SYSIO, "__assuan_read", ctx,
- "received fd: %d", fd_recv);
- /* Fall through */
- }
again:
ec = 0;
@@ -340,6 +266,8 @@ __assuan_read (assuan_context_t ctx, assuan_fd_t fd, void *buffer, size_t size)
layer then needs to take care of EAGAIN. No need to
specify a timeout - the socket is not expected to be in
blocking mode. */
+ fd_set fds;
+
FD_ZERO (&fds);
FD_SET (HANDLE2SOCKET (fd), &fds);
select (0, &fds, NULL, NULL, NULL);
diff --git a/tests/fdpassing-socket.c b/tests/fdpassing-socket.c
index bbf4b97..251c609 100644
--- a/tests/fdpassing-socket.c
+++ b/tests/fdpassing-socket.c
@@ -30,8 +30,6 @@
# include <windows.h>
# include <wincrypt.h>
# include <io.h>
-#else
-# include <sys/socket.h>
#endif
#include <unistd.h>
#include <errno.h>
@@ -68,11 +66,11 @@ cmd_echo (assuan_context_t ctx, char *line)
nbytes = 0;
while ( (c = gpgrt_fgetc (fp)) != -1)
{
- putc (c, stdout);
+ putc (c, stderr);
nbytes++;
}
- fflush (stdout);
- log_info ("done printing %d bytes to stdout\n", nbytes);
+ fflush (stderr);
+ log_info ("done printing %d bytes to stderr\n", nbytes);
gpgrt_fclose (fp);
return 0;