=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/ssh/ssh-add.c,v retrieving revision 1.22.2.5 retrieving revision 1.22.2.6 diff -u -r1.22.2.5 -r1.22.2.6 --- src/usr.bin/ssh/ssh-add.c 2001/09/27 00:15:42 1.22.2.5 +++ src/usr.bin/ssh/ssh-add.c 2001/11/15 00:15:00 1.22.2.6 @@ -35,7 +35,7 @@ */ #include "includes.h" -RCSID("$OpenBSD: ssh-add.c,v 1.22.2.5 2001/09/27 00:15:42 miod Exp $"); +RCSID("$OpenBSD: ssh-add.c,v 1.22.2.6 2001/11/15 00:15:00 miod Exp $"); #include @@ -64,53 +64,61 @@ } } -static void +static int delete_file(AuthenticationConnection *ac, const char *filename) { Key *public; char *comment = NULL; + int ret = -1; public = key_load_public(filename, &comment); if (public == NULL) { printf("Bad key file %s\n", filename); - return; + return -1; } - if (ssh_remove_identity(ac, public)) + if (ssh_remove_identity(ac, public)) { fprintf(stderr, "Identity removed: %s (%s)\n", filename, comment); - else + ret = 0; + } else fprintf(stderr, "Could not remove identity: %s\n", filename); + key_free(public); xfree(comment); + + return ret; } /* Send a request to remove all identities. */ -static void +static int delete_all(AuthenticationConnection *ac) { - int success = 1; + int ret = -1; - if (!ssh_remove_all_identities(ac, 1)) - success = 0; + if (ssh_remove_all_identities(ac, 1)) + ret = 0; /* ignore error-code for ssh2 */ ssh_remove_all_identities(ac, 2); - if (success) + if (ret == 0) fprintf(stderr, "All identities removed.\n"); else fprintf(stderr, "Failed to remove all identities.\n"); + + return ret; } -static void +static int add_file(AuthenticationConnection *ac, const char *filename) { struct stat st; Key *private; char *comment = NULL; char msg[1024]; + int ret = -1; if (stat(filename, &st) < 0) { perror(filename); - exit(1); + return -1; } /* At first, try empty passphrase */ private = key_load_private(filename, "", &comment); @@ -129,7 +137,7 @@ if (strcmp(pass, "") == 0) { clear_pass(); xfree(comment); - return; + return -1; } private = key_load_private(filename, pass, &comment); if (private != NULL) @@ -138,23 +146,30 @@ strlcpy(msg, "Bad passphrase, try again: ", sizeof msg); } } - if (ssh_add_identity(ac, private, comment)) + if (ssh_add_identity(ac, private, comment)) { fprintf(stderr, "Identity added: %s (%s)\n", filename, comment); - else + ret = 0; + } else fprintf(stderr, "Could not add identity: %s\n", filename); + xfree(comment); key_free(private); + + return ret; } -static void +static int update_card(AuthenticationConnection *ac, int add, const char *id) { - if (ssh_update_card(ac, add, id)) + if (ssh_update_card(ac, add, id)) { fprintf(stderr, "Card %s: %s\n", add ? "added" : "removed", id); - else + return 0; + } else { fprintf(stderr, "Could not %s card: %s\n", add ? "add" : "remove", id); + return -1; + } } static void @@ -213,7 +228,7 @@ struct passwd *pw; char buf[1024]; char *sc_reader_id = NULL; - int i, ch, deleting = 0; + int i, ch, deleting = 0, ret = 0; SSLeay_add_all_algorithms(); @@ -234,7 +249,8 @@ deleting = 1; break; case 'D': - delete_all(ac); + if (delete_all(ac) == -1) + ret = 1; goto done; break; case 's': @@ -246,14 +262,15 @@ break; default: usage(); - exit(1); - break; + ret = 1; + goto done; } } argc -= optind; argv += optind; if (sc_reader_id != NULL) { - update_card(ac, !deleting, sc_reader_id); + if (update_card(ac, !deleting, sc_reader_id) == -1) + ret = 1; goto done; } if (argc == 0) { @@ -261,25 +278,31 @@ if (!pw) { fprintf(stderr, "No user found with uid %u\n", (u_int)getuid()); - ssh_close_authentication_connection(ac); - exit(1); + ret = 1; + goto done; } snprintf(buf, sizeof buf, "%s/%s", pw->pw_dir, _PATH_SSH_CLIENT_IDENTITY); - if (deleting) - delete_file(ac, buf); - else - add_file(ac, buf); + if (deleting) { + if (delete_file(ac, buf) == -1) + ret = 1; + } else { + if (add_file(ac, buf) == -1) + ret = 1; + } } else { for (i = 0; i < argc; i++) { - if (deleting) - delete_file(ac, argv[i]); - else - add_file(ac, argv[i]); + if (deleting) { + if (delete_file(ac, argv[i]) == -1) + ret = 1; + } else { + if (add_file(ac, argv[i]) == -1) + ret = 1; + } } } clear_pass(); done: ssh_close_authentication_connection(ac); - exit(0); + return ret; }