aboutsummaryrefslogtreecommitdiffstats
path: root/agent/command-ssh.c
diff options
context:
space:
mode:
authorNIIBE Yutaka <[email protected]>2022-10-14 04:52:54 +0000
committerNIIBE Yutaka <[email protected]>2022-10-14 04:52:54 +0000
commitc51139f2bc546c6bd4548e24a604f2178a2b8366 (patch)
tree050da49953c5bbce3b66f478e45ba24b4184a082 /agent/command-ssh.c
parentcommon: Don't use FD2INT for POSIX-only code. (diff)
downloadgnupg-c51139f2bc546c6bd4548e24a604f2178a2b8366.tar.gz
gnupg-c51139f2bc546c6bd4548e24a604f2178a2b8366.zip
agent,w32: Support Win32-OpenSSH emulation by gpg-agent.
* agent/agent.h (start_command_handler_ssh_stream): New. * agent/command-ssh.c (start_command_handler_ssh_stream): New. * agent/gpg-agent.c (oWin32OpenSSHSupport): New. (W32_DEFAILT_AGENT_PIPE_NAME): New. (main): Add oWin32OpenSSHSupport support. (win32_openssh_thread): New. (handle_connections): Spawn win32_openssh_thread. * configure.ac (NEED_GPGRT_VERSION): Require libgpg-error 1.46. -- GnuPG-bug-id: 3883 Signed-off-by: NIIBE Yutaka <[email protected]>
Diffstat (limited to 'agent/command-ssh.c')
-rw-r--r--agent/command-ssh.c70
1 files changed, 38 insertions, 32 deletions
diff --git a/agent/command-ssh.c b/agent/command-ssh.c
index ce2b5df9d..50622850c 100644
--- a/agent/command-ssh.c
+++ b/agent/command-ssh.c
@@ -3768,67 +3768,73 @@ get_client_info (gnupg_fd_t fd, struct peer_info_s *out)
}
-/* Start serving client on SOCK_CLIENT. */
+/* Start serving client on STREAM. */
void
-start_command_handler_ssh (ctrl_t ctrl, gnupg_fd_t sock_client)
+start_command_handler_ssh_stream (ctrl_t ctrl, estream_t stream)
{
- estream_t stream_sock = NULL;
gpg_error_t err;
int ret;
- struct peer_info_s peer_info;
- es_syshd_t syshd;
-
- syshd.type = ES_SYSHD_SOCK;
- syshd.u.sock = sock_client;
err = agent_copy_startup_env (ctrl);
if (err)
goto out;
- get_client_info (sock_client, &peer_info);
- ctrl->client_pid = peer_info.pid;
- ctrl->client_uid = peer_info.uid;
-
- /* Create stream from socket. */
- stream_sock = es_sysopen (&syshd, "r+");
- if (!stream_sock)
- {
- err = gpg_error_from_syserror ();
- log_error (_("failed to create stream from socket: %s\n"),
- gpg_strerror (err));
- goto out;
- }
/* We have to disable the estream buffering, because the estream
core doesn't know about secure memory. */
- ret = es_setvbuf (stream_sock, NULL, _IONBF, 0);
+ ret = es_setvbuf (stream, NULL, _IONBF, 0);
if (ret)
{
- err = gpg_error_from_syserror ();
- log_error ("failed to disable buffering "
- "on socket stream: %s\n", gpg_strerror (err));
+ log_error ("failed to disable buffering on socket stream: %s\n",
+ strerror (errno));
goto out;
}
/* Main processing loop. */
- while ( !ssh_request_process (ctrl, stream_sock) )
+ while ( !ssh_request_process (ctrl, stream) )
{
/* Check whether we have reached EOF before trying to read
- another request. */
+ another request. */
int c;
- c = es_fgetc (stream_sock);
+ c = es_fgetc (stream);
if (c == EOF)
break;
- es_ungetc (c, stream_sock);
+ es_ungetc (c, stream);
}
/* Reset the daemon in case it has been used. */
agent_reset_daemon (ctrl);
-
out:
- if (stream_sock)
- es_fclose (stream_sock);
+ es_fclose (stream);
+}
+
+
+/* Start serving client on SOCK_CLIENT. */
+void
+start_command_handler_ssh (ctrl_t ctrl, gnupg_fd_t sock_client)
+{
+ estream_t stream_sock;
+ struct peer_info_s peer_info;
+ es_syshd_t syshd;
+
+ syshd.type = ES_SYSHD_SOCK;
+ syshd.u.sock = sock_client;
+
+ get_client_info (sock_client, &peer_info);
+ ctrl->client_pid = peer_info.pid;
+ ctrl->client_uid = peer_info.uid;
+
+ /* Create stream from socket. */
+ stream_sock = es_sysopen (&syshd, "r+");
+ if (!stream_sock)
+ {
+ log_error (_("failed to create stream from socket: %s\n"),
+ strerror (errno));
+ return;
+ }
+
+ start_command_handler_ssh_stream (ctrl, stream_sock);
}