X-Git-Url: http://andersk.mit.edu/gitweb/openssh.git/blobdiff_plain/ec9f34503095dd760eec3ad8def668d3cdf6224c..67656ffcb8e1bdacdf86ef1f4b2df44fd4ce238e:/ssh-agent.c diff --git a/ssh-agent.c b/ssh-agent.c index 84ffe855..e8018bf3 100644 --- a/ssh-agent.c +++ b/ssh-agent.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-agent.c,v 1.67 2001/07/18 21:40:40 stevesk Exp $ */ +/* $OpenBSD: ssh-agent.c,v 1.75 2001/12/19 07:18:56 deraadt Exp $ */ /* * Author: Tatu Ylonen @@ -36,7 +36,7 @@ */ #include "includes.h" -RCSID("$OpenBSD: ssh-agent.c,v 1.67 2001/07/18 21:40:40 stevesk Exp $"); +RCSID("$OpenBSD: ssh-agent.c,v 1.75 2001/12/19 07:18:56 deraadt Exp $"); #include #include @@ -61,11 +61,15 @@ RCSID("$OpenBSD: ssh-agent.c,v 1.67 2001/07/18 21:40:40 stevesk Exp $"); #include "scard.h" #endif +typedef enum { + AUTH_UNUSED, + AUTH_SOCKET, + AUTH_CONNECTION +} sock_type; + typedef struct { int fd; - enum { - AUTH_UNUSED, AUTH_SOCKET, AUTH_CONNECTION - } type; + sock_type type; Buffer input; Buffer output; } SocketEntry; @@ -105,7 +109,7 @@ static void idtab_init(void) { int i; - for (i = 0; i <=2; i++){ + for (i = 0; i <=2; i++) { idtable[i].identities = NULL; idtable[i].nentries = 0; } @@ -289,7 +293,7 @@ process_remove_identity(SocketEntry *e, int version) u_int bits; int success = 0; - switch(version){ + switch (version) { case 1: key = key_new(KEY_RSA1); bits = buffer_get_int(&e->input); @@ -391,7 +395,7 @@ process_add_identity(SocketEntry *e, int version) type_name = buffer_get_string(&e->input, NULL); type = key_type_from_name(type_name); xfree(type_name); - switch(type) { + switch (type) { case KEY_DSA: k = key_new_private(type); buffer_get_bignum2(&e->input, k->dsa->p); @@ -451,12 +455,13 @@ process_add_smartcard_key (SocketEntry *e) { Idtab *tab; Key *n = NULL, *k = NULL; + char *sc_reader_id = NULL; int success = 0; - int sc_reader_num = 0; - - sc_reader_num = buffer_get_int(&e->input); - k = sc_get_key(sc_reader_num); + sc_reader_id = buffer_get_string(&e->input, NULL); + k = sc_get_key(sc_reader_id); + xfree(sc_reader_id); + if (k == NULL) { error("sc_get_pubkey failed"); goto send; @@ -510,11 +515,13 @@ process_remove_smartcard_key(SocketEntry *e) Key *k = NULL, *private; int idx; int success = 0; - int sc_reader_num = 0; + char *sc_reader_id = NULL; - sc_reader_num = buffer_get_int(&e->input); + sc_reader_id = buffer_get_string(&e->input, NULL); + k = sc_get_key(sc_reader_id); + xfree(sc_reader_id); - if ((k = sc_get_key(sc_reader_num)) == NULL) { + if (k == NULL) { error("sc_get_pubkey failed"); } else { k->type = KEY_RSA1; @@ -546,7 +553,7 @@ process_remove_smartcard_key(SocketEntry *e) buffer_put_char(&e->output, success ? SSH_AGENT_SUCCESS : SSH_AGENT_FAILURE); } -#endif +#endif /* SMARTCARD */ /* dispatch incoming messages */ @@ -608,11 +615,11 @@ process_message(SocketEntry *e) #ifdef SMARTCARD case SSH_AGENTC_ADD_SMARTCARD_KEY: process_add_smartcard_key(e); - break; + break; case SSH_AGENTC_REMOVE_SMARTCARD_KEY: process_remove_smartcard_key(e); - break; -#endif + break; +#endif /* SMARTCARD */ default: /* Unknown message. Respond with failure. */ error("Unknown message %d", type); @@ -624,7 +631,7 @@ process_message(SocketEntry *e) } static void -new_socket(int type, int fd) +new_socket(sock_type type, int fd) { u_int i, old_alloc; if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) @@ -778,20 +785,6 @@ after_select(fd_set *readset, fd_set *writeset) } } -static void -check_parent_exists(int sig) -{ - int save_errno = errno; - - if (parent_pid != -1 && kill(parent_pid, 0) < 0) { - /* printf("Parent has died - Authentication agent exiting.\n"); */ - exit(1); - } - signal(SIGALRM, check_parent_exists); - alarm(10); - errno = save_errno; -} - static void cleanup_socket(void) { @@ -815,12 +808,30 @@ cleanup_handler(int sig) _exit(2); } +static void +check_parent_exists(int sig) +{ + int save_errno = errno; + + if (parent_pid != -1 && kill(parent_pid, 0) < 0) { + /* printf("Parent has died - Authentication agent exiting.\n"); */ + cleanup_handler(sig); /* safe */ + } + signal(SIGALRM, check_parent_exists); + alarm(10); + errno = save_errno; +} + static void usage(void) { - fprintf(stderr, "ssh-agent version %s\n", SSH_VERSION); - fprintf(stderr, "Usage: %s [-c | -s] [-k] [-d] [command [args...]]\n", + fprintf(stderr, "Usage: %s [options] [command [args ...]]\n", __progname); + fprintf(stderr, "Options:\n"); + fprintf(stderr, " -c Generate C-shell commands on stdout.\n"); + fprintf(stderr, " -s Generate Bourne shell commands on stdout.\n"); + fprintf(stderr, " -k Kill the current agent.\n"); + fprintf(stderr, " -d Debug mode.\n"); exit(1); }