aboutsummaryrefslogtreecommitdiffstats
path: root/agent/command-ssh.c
diff options
context:
space:
mode:
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);
}