*/
#include "includes.h"
-RCSID("$OpenBSD: ssh-add.c,v 1.48 2001/12/21 10:06:43 djm Exp $");
+RCSID("$OpenBSD: ssh-add.c,v 1.53 2002/03/21 22:44:05 rees Exp $");
#include <openssl/evp.h>
static char *default_files[] = {
_PATH_SSH_CLIENT_ID_RSA,
_PATH_SSH_CLIENT_ID_DSA,
- _PATH_SSH_CLIENT_IDENTITY,
+ _PATH_SSH_CLIENT_IDENTITY,
NULL
};
static int
update_card(AuthenticationConnection *ac, int add, const char *id)
{
- if (ssh_update_card(ac, add, id)) {
+ char *pin;
+
+ pin = read_passphrase("Enter passphrase for smartcard: ", RP_ALLOW_STDIN);
+ if (pin == NULL)
+ return -1;
+
+ if (ssh_update_card(ac, add, id, pin)) {
fprintf(stderr, "Card %s: %s\n",
add ? "added" : "removed", id);
return 0;
}
}
-static void
+static int
list_identities(AuthenticationConnection *ac, int do_fp)
{
Key *key;
xfree(comment);
}
}
- if (!had_identities)
+ if (!had_identities) {
printf("The agent has no identities.\n");
+ return -1;
+ }
+ return 0;
}
static int
ac = ssh_get_authentication_connection();
if (ac == NULL) {
fprintf(stderr, "Could not open a connection to your authentication agent.\n");
- exit(1);
+ exit(2);
}
while ((ch = getopt(argc, argv, "lLdDe:s:")) != -1) {
switch (ch) {
case 'l':
case 'L':
- list_identities(ac, ch == 'l' ? 1 : 0);
+ if (list_identities(ac, ch == 'l' ? 1 : 0) == -1)
+ ret = 1;
goto done;
break;
case 'd':
if (argc == 0) {
char buf[MAXPATHLEN];
struct passwd *pw;
+ struct stat st;
+ int count = 0;
if ((pw = getpwuid(getuid())) == NULL) {
fprintf(stderr, "No user found with uid %u\n",
}
for(i = 0; default_files[i]; i++) {
- snprintf(buf, sizeof(buf), "%s/%s", pw->pw_dir,
+ snprintf(buf, sizeof(buf), "%s/%s", pw->pw_dir,
default_files[i]);
+ if (stat(buf, &st) < 0)
+ continue;
if (do_file(ac, deleting, buf) == -1)
ret = 1;
+ else
+ count++;
}
+ if (count == 0)
+ ret = 1;
} else {
for(i = 0; i < argc; i++) {
- if (do_file(ac, deleting, argv[1]) == -1)
+ if (do_file(ac, deleting, argv[i]) == -1)
ret = 1;
}
}