version 1.108.2.1, 2003/09/16 20:50:44 |
version 1.108.2.2, 2004/03/04 18:18:16 |
|
|
p = read_passphrase(prompt, RP_ALLOW_EOF); |
p = read_passphrase(prompt, RP_ALLOW_EOF); |
if (p != NULL) { |
if (p != NULL) { |
/* |
/* |
* Accept empty responses and responses consisting |
* Accept empty responses and responses consisting |
* of the word "yes" as affirmative. |
* of the word "yes" as affirmative. |
*/ |
*/ |
if (*p == '\0' || *p == '\n' || strcasecmp(p, "yes") == 0) |
if (*p == '\0' || *p == '\n' || strcasecmp(p, "yes") == 0) |
|
|
static void |
static void |
new_socket(sock_type type, int fd) |
new_socket(sock_type type, int fd) |
{ |
{ |
u_int i, old_alloc; |
u_int i, old_alloc, new_alloc; |
|
|
if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) |
if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) |
error("fcntl O_NONBLOCK: %s", strerror(errno)); |
error("fcntl O_NONBLOCK: %s", strerror(errno)); |
|
|
for (i = 0; i < sockets_alloc; i++) |
for (i = 0; i < sockets_alloc; i++) |
if (sockets[i].type == AUTH_UNUSED) { |
if (sockets[i].type == AUTH_UNUSED) { |
sockets[i].fd = fd; |
sockets[i].fd = fd; |
sockets[i].type = type; |
|
buffer_init(&sockets[i].input); |
buffer_init(&sockets[i].input); |
buffer_init(&sockets[i].output); |
buffer_init(&sockets[i].output); |
buffer_init(&sockets[i].request); |
buffer_init(&sockets[i].request); |
|
sockets[i].type = type; |
return; |
return; |
} |
} |
old_alloc = sockets_alloc; |
old_alloc = sockets_alloc; |
sockets_alloc += 10; |
new_alloc = sockets_alloc + 10; |
if (sockets) |
if (sockets) |
sockets = xrealloc(sockets, sockets_alloc * sizeof(sockets[0])); |
sockets = xrealloc(sockets, new_alloc * sizeof(sockets[0])); |
else |
else |
sockets = xmalloc(sockets_alloc * sizeof(sockets[0])); |
sockets = xmalloc(new_alloc * sizeof(sockets[0])); |
for (i = old_alloc; i < sockets_alloc; i++) |
for (i = old_alloc; i < new_alloc; i++) |
sockets[i].type = AUTH_UNUSED; |
sockets[i].type = AUTH_UNUSED; |
sockets[old_alloc].type = type; |
sockets_alloc = new_alloc; |
sockets[old_alloc].fd = fd; |
sockets[old_alloc].fd = fd; |
buffer_init(&sockets[old_alloc].input); |
buffer_init(&sockets[old_alloc].input); |
buffer_init(&sockets[old_alloc].output); |
buffer_init(&sockets[old_alloc].output); |
buffer_init(&sockets[old_alloc].request); |
buffer_init(&sockets[old_alloc].request); |
|
sockets[old_alloc].type = type; |
} |
} |
|
|
static int |
static int |
|
|
} |
} |
|
|
static void |
static void |
cleanup_socket(void *p) |
cleanup_socket(void) |
{ |
{ |
if (socket_name[0]) |
if (socket_name[0]) |
unlink(socket_name); |
unlink(socket_name); |
|
|
rmdir(socket_dir); |
rmdir(socket_dir); |
} |
} |
|
|
static void |
void |
cleanup_exit(int i) |
cleanup_exit(int i) |
{ |
{ |
cleanup_socket(NULL); |
cleanup_socket(); |
exit(i); |
_exit(i); |
} |
} |
|
|
static void |
static void |
cleanup_handler(int sig) |
cleanup_handler(int sig) |
{ |
{ |
cleanup_socket(NULL); |
cleanup_socket(); |
_exit(2); |
_exit(2); |
} |
} |
|
|
|
|
|
|
if (agentsocket == NULL) { |
if (agentsocket == NULL) { |
/* Create private directory for agent socket */ |
/* Create private directory for agent socket */ |
strlcpy(socket_dir, "/tmp/ssh-XXXXXXXX", sizeof socket_dir); |
strlcpy(socket_dir, "/tmp/ssh-XXXXXXXXXX", sizeof socket_dir); |
if (mkdtemp(socket_dir) == NULL) { |
if (mkdtemp(socket_dir) == NULL) { |
perror("mkdtemp: private socket dir"); |
perror("mkdtemp: private socket dir"); |
exit(1); |
exit(1); |
|
|
perror("bind"); |
perror("bind"); |
cleanup_exit(1); |
cleanup_exit(1); |
} |
} |
if (listen(sock, 128) < 0) { |
if (listen(sock, SSH_LISTEN_BACKLOG) < 0) { |
perror("listen"); |
perror("listen"); |
cleanup_exit(1); |
cleanup_exit(1); |
} |
} |
|
|
} |
} |
|
|
skip: |
skip: |
fatal_add_cleanup(cleanup_socket, NULL); |
|
new_socket(AUTH_SOCKET, sock); |
new_socket(AUTH_SOCKET, sock); |
if (ac > 0) { |
if (ac > 0) { |
signal(SIGALRM, check_parent_exists); |
signal(SIGALRM, check_parent_exists); |