version 1.117, 2003/12/02 17:01:15 |
version 1.117.2.2, 2005/03/10 17:15:04 |
|
|
#include "authfd.h" |
#include "authfd.h" |
#include "compat.h" |
#include "compat.h" |
#include "log.h" |
#include "log.h" |
#include "readpass.h" |
|
#include "misc.h" |
#include "misc.h" |
|
|
#ifdef SMARTCARD |
#ifdef SMARTCARD |
|
|
static int |
static int |
confirm_key(Identity *id) |
confirm_key(Identity *id) |
{ |
{ |
char *p, prompt[1024]; |
char *p; |
int ret = -1; |
int ret = -1; |
|
|
p = key_fingerprint(id->key, SSH_FP_MD5, SSH_FP_HEX); |
p = key_fingerprint(id->key, SSH_FP_MD5, SSH_FP_HEX); |
snprintf(prompt, sizeof(prompt), "Allow use of key %s?\n" |
if (ask_permission("Allow use of key %s?\nKey fingerprint %s.", |
"Key fingerprint %s.", id->comment, p); |
id->comment, p)) |
|
ret = 0; |
xfree(p); |
xfree(p); |
p = read_passphrase(prompt, RP_ALLOW_EOF); |
|
if (p != NULL) { |
|
/* |
|
* Accept empty responses and responses consisting |
|
* of the word "yes" as affirmative. |
|
*/ |
|
if (*p == '\0' || *p == '\n' || strcasecmp(p, "yes") == 0) |
|
ret = 0; |
|
xfree(p); |
|
} |
|
return (ret); |
return (ret); |
} |
} |
|
|
|
|
{ |
{ |
u_int i, old_alloc, new_alloc; |
u_int i, old_alloc, new_alloc; |
|
|
if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) |
set_nonblock(fd); |
error("fcntl O_NONBLOCK: %s", strerror(errno)); |
|
|
|
if (fd > max_fd) |
if (fd > max_fd) |
max_fd = fd; |
max_fd = fd; |
|
|
} |
} |
|
|
static int |
static int |
prepare_select(fd_set **fdrp, fd_set **fdwp, int *fdl, int *nallocp) |
prepare_select(fd_set **fdrp, fd_set **fdwp, int *fdl, u_int *nallocp) |
{ |
{ |
u_int i, sz; |
u_int i, sz; |
int n = 0; |
int n = 0; |
|
|
main(int ac, char **av) |
main(int ac, char **av) |
{ |
{ |
int c_flag = 0, d_flag = 0, k_flag = 0, s_flag = 0; |
int c_flag = 0, d_flag = 0, k_flag = 0, s_flag = 0; |
int sock, fd, ch, nalloc; |
int sock, fd, ch; |
|
u_int nalloc; |
char *shell, *format, *pidstr, *agentsocket = NULL; |
char *shell, *format, *pidstr, *agentsocket = NULL; |
fd_set *readsetp = NULL, *writesetp = NULL; |
fd_set *readsetp = NULL, *writesetp = NULL; |
struct sockaddr_un sunaddr; |
struct sockaddr_un sunaddr; |
|
|
sock = socket(AF_UNIX, SOCK_STREAM, 0); |
sock = socket(AF_UNIX, SOCK_STREAM, 0); |
if (sock < 0) { |
if (sock < 0) { |
perror("socket"); |
perror("socket"); |
|
*socket_name = '\0'; /* Don't unlink any existing file */ |
cleanup_exit(1); |
cleanup_exit(1); |
} |
} |
memset(&sunaddr, 0, sizeof(sunaddr)); |
memset(&sunaddr, 0, sizeof(sunaddr)); |
|
|
strlcpy(sunaddr.sun_path, socket_name, sizeof(sunaddr.sun_path)); |
strlcpy(sunaddr.sun_path, socket_name, sizeof(sunaddr.sun_path)); |
if (bind(sock, (struct sockaddr *) & sunaddr, sizeof(sunaddr)) < 0) { |
if (bind(sock, (struct sockaddr *) & sunaddr, sizeof(sunaddr)) < 0) { |
perror("bind"); |
perror("bind"); |
|
*socket_name = '\0'; /* Don't unlink any existing file */ |
cleanup_exit(1); |
cleanup_exit(1); |
} |
} |
if (listen(sock, SSH_LISTEN_BACKLOG) < 0) { |
if (listen(sock, SSH_LISTEN_BACKLOG) < 0) { |