diff options
Diffstat (limited to 'agent/command-ssh.c')
-rw-r--r-- | agent/command-ssh.c | 70 |
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); } |