diff options
author | Stef Walter <stefw@gnome.org> | 2016-02-22 09:03:11 +0100 |
---|---|---|
committer | Stef Walter <stefw@gnome.org> | 2016-02-22 09:03:11 +0100 |
commit | 54204c692beab0970554eb6e2fe1116ffcc3309c (patch) | |
tree | 3f35b1dc5a3f5ded1aec11db72d0963c1a64889c | |
parent | aa15e92549606ee992668c45e64172f9616e51d1 (diff) | |
download | gnome-keyring-ssh-wip.tar.gz |
XXX wait for ssh-agentssh-wip
-rw-r--r-- | daemon/ssh-agent/gkd-ssh-agent-client.c | 60 | ||||
-rw-r--r-- | daemon/ssh-agent/gkd-ssh-agent-private.h | 5 | ||||
-rw-r--r-- | daemon/ssh-agent/gkd-ssh-agent.c | 18 |
3 files changed, 68 insertions, 15 deletions
diff --git a/daemon/ssh-agent/gkd-ssh-agent-client.c b/daemon/ssh-agent/gkd-ssh-agent-client.c index d3003073..98f27735 100644 --- a/daemon/ssh-agent/gkd-ssh-agent-client.c +++ b/daemon/ssh-agent/gkd-ssh-agent-client.c @@ -21,6 +21,7 @@ #include "config.h" #include "gkd-ssh-agent-client.h" +#include "gkd-ssh-agent-private.h" #include "daemon/gkd-util.h" @@ -66,23 +67,39 @@ agent_watch_output (gint fd, GIOCondition condition, gpointer user_data) { - if (condition & G_IO_IN) + guint8 buf[1024]; + gssize len; + + if (condition & G_IO_IN) { +g_message ("setting ready"); ssh_agent_ready = TRUE; - read xxxx; + len = read (fd, buf, sizeof (buf)); + if (len < 0) { + if (errno != EAGAIN && errno != EINTR) + g_message ("couldn't read from ssh-agent stdout: %m"); + condition |= G_IO_ERR; + } else if (len > 0) { + gkd_ssh_agent_write_all (1, buf, len, "stdout"); + } + } - ssh_agent_watch = 0; - return FALSE; + if (condition & G_IO_HUP || condition & G_IO_ERR) { + ssh_agent_watch = 0; + return FALSE; + } + + return TRUE; } static gboolean agent_start_inlock (const char *socket) { - const gchar *argv[] = { SSH_AGENT, "-s", "-a", socket, NULL }; + const gchar *argv[] = { SSH_AGENT, "-D", "-a", socket, NULL }; GError *error = NULL; GPid pid; - if (!g_spawn_sync ("/", (gchar **)argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD, + if (!g_spawn_async_with_pipes ("/", (gchar **)argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, &pid, NULL, &ssh_agent_out, NULL, &error)) { g_warning ("couldn't run %s: %s", SSH_AGENT, error->message); g_error_free (error); @@ -111,12 +128,23 @@ agent_terminate (gint pid) kill (pid, SIGTERM); } +static gboolean +agent_ready_timeout (gpointer user_data) +{ + gboolean *timedout = user_data; +g_message ("timed out"); + *timedout = TRUE; + return TRUE; +} + gint gkd_ssh_agent_client_connect (void) { gboolean started = FALSE; struct sockaddr_un addr; const gchar *directory; + gboolean timedout = FALSE; + guint source; gint sock; g_mutex_lock (&ssh_agent_mutex); @@ -135,8 +163,15 @@ gkd_ssh_agent_client_connect (void) g_mutex_unlock (&ssh_agent_mutex); - while (started && !ssh_agent_ready) - g_main_context_iteration (NULL, TRUE); + if (started && !ssh_agent_ready) { + source = g_timeout_add_seconds (5, agent_ready_timeout, &timedout); + while (started && !ssh_agent_ready && !timedout) { +g_message ("waiting for agent: %u", (guint)timedout); + g_main_context_iteration (NULL, TRUE); + } + g_source_remove (source); +g_message ("waited for agent"); + } if (!ssh_agent_ready) return -1; @@ -163,6 +198,15 @@ gkd_ssh_agent_client_cleanup (void) agent_terminate (ssh_agent_pid); ssh_agent_pid = 0; + if (ssh_agent_watch) + g_source_remove (ssh_agent_watch); + ssh_agent_watch = 0; + ssh_agent_ready = FALSE; + + if (ssh_agent_out != -1) + close (ssh_agent_out); + ssh_agent_out = -1; + g_free (ssh_agent_path); ssh_agent_path = NULL; diff --git a/daemon/ssh-agent/gkd-ssh-agent-private.h b/daemon/ssh-agent/gkd-ssh-agent-private.h index 586e0f26..8bda7376 100644 --- a/daemon/ssh-agent/gkd-ssh-agent-private.h +++ b/daemon/ssh-agent/gkd-ssh-agent-private.h @@ -97,4 +97,9 @@ gboolean gkd_ssh_agent_write_packet (gint fd, gboolean gkd_ssh_agent_relay (GkdSshAgentCall *call); +gboolean gkd_ssh_agent_write_all (int fd, + const guchar *buf, + int len, + const gchar *where); + #endif /*GKDSSHPRIVATE_H_*/ diff --git a/daemon/ssh-agent/gkd-ssh-agent.c b/daemon/ssh-agent/gkd-ssh-agent.c index 0754da34..b4b420b7 100644 --- a/daemon/ssh-agent/gkd-ssh-agent.c +++ b/daemon/ssh-agent/gkd-ssh-agent.c @@ -73,8 +73,11 @@ read_all (int fd, guchar *buf, int len) return TRUE; } -static gboolean -write_all (int fd, const guchar *buf, int len) +gboolean +gkd_ssh_agent_write_all (int fd, + const guchar *buf, + int len, + const gchar *where) { int all = len; int res; @@ -85,12 +88,13 @@ write_all (int fd, const guchar *buf, int len) if (res < 0) { if (errno == EAGAIN && errno == EINTR) continue; - if (errno != EPIPE) - g_warning ("couldn't write %u bytes to client: %s", all, - g_strerror (errno)); + if (errno != EPIPE) { + g_warning ("couldn't write %u bytes to %s: %s", all, + where, g_strerror (errno)); + } return FALSE; } else if (res == 0) { - g_warning ("couldn't write %u bytes to client", all); + g_warning ("couldn't write %u bytes to %s", all, where); return FALSE; } else { len -= res; @@ -131,7 +135,7 @@ gkd_ssh_agent_write_packet (gint fd, { if (!egg_buffer_set_uint32 (buffer, 0, buffer->len - 4)) g_return_val_if_reached (FALSE); - return write_all (fd, buffer->buf, buffer->len); + return gkd_ssh_agent_write_all (fd, buffer->buf, buffer->len, "client"); } gboolean |