diff options
author | NIIBE Yutaka <gniibe@fsij.org> | 2022-11-07 12:13:37 +0900 |
---|---|---|
committer | NIIBE Yutaka <gniibe@fsij.org> | 2022-11-07 12:13:37 +0900 |
commit | 8a49959a1eed8ddce73fb3146d5a853061e36497 (patch) | |
tree | 66c33fd55e1a4ae0563ec70c273d5f0c7b17cfb0 | |
parent | 4b3f2e4ac67491f1cf7f1f7ab25fee44b7e6bb96 (diff) | |
download | libassuan-8a49959a1eed8ddce73fb3146d5a853061e36497.tar.gz |
Use higher-layer assuan_transact for fdpassing.
Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
-rw-r--r-- | src/system-w32.c | 76 | ||||
-rw-r--r-- | tests/fdpassing-socket.c | 8 |
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; |