X-Git-Url: http://andersk.mit.edu/gitweb/openssh.git/blobdiff_plain/7c49df644b12c5c7e5e9cde6d063197f06c03482..aca75d949ebab1f60acecf88ab78eae932e4d3fb:/sshconnect.c diff --git a/sshconnect.c b/sshconnect.c index 2102bef6..389d6598 100644 --- a/sshconnect.c +++ b/sshconnect.c @@ -13,23 +13,24 @@ */ #include "includes.h" -RCSID("$OpenBSD: sshconnect.c,v 1.88 2001/01/02 20:50:56 markus Exp $"); +RCSID("$OpenBSD: sshconnect.c,v 1.96 2001/02/08 22:35:30 markus Exp $"); #include -#include -#include +#include "ssh.h" #include "xmalloc.h" #include "rsa.h" -#include "ssh.h" #include "buffer.h" #include "packet.h" #include "uidswap.h" #include "compat.h" -#include "readconf.h" #include "key.h" #include "sshconnect.h" #include "hostfile.h" +#include "log.h" +#include "readconf.h" +#include "atomicio.h" +#include "misc.h" char *client_version_string = NULL; char *server_version_string = NULL; @@ -37,6 +38,9 @@ char *server_version_string = NULL; extern Options options; extern char *__progname; +/* AF_UNSPEC or AF_INET or AF_INET6 */ +extern int IPv4or6; + /* * Connect to the given ssh server using a proxy command. */ @@ -116,8 +120,8 @@ ssh_proxy_connect(const char *host, u_short port, uid_t original_real_uid, /* Execute the proxy command. Note that we gave up any extra privileges above. */ - execv(_PATH_BSHELL, argv); - perror(_PATH_BSHELL); + execv(argv[0], argv); + perror(argv[0]); exit(1); } /* Parent. */ @@ -187,12 +191,13 @@ ssh_connect(const char *host, struct sockaddr_storage * hostaddr, int anonymous, uid_t original_real_uid, const char *proxy_command) { + int gaierr; + int on = 1; int sock = -1, attempt; - struct servent *sp; - struct addrinfo hints, *ai, *aitop; char ntop[NI_MAXHOST], strport[NI_MAXSERV]; - int gaierr; + struct addrinfo hints, *ai, *aitop; struct linger linger; + struct servent *sp; debug("ssh_connect: getuid %u geteuid %u anon %d", (u_int) getuid(), (u_int) geteuid(), anonymous); @@ -260,7 +265,7 @@ ssh_connect(const char *host, struct sockaddr_storage * hostaddr, temporarily_use_uid(original_real_uid); if (connect(sock, ai->ai_addr, ai->ai_addrlen) >= 0) { /* Successful connection. */ - memcpy(hostaddr, ai->ai_addr, ai->ai_addrlen); + memcpy(hostaddr, ai->ai_addr, ai->ai_addrlen); restore_uid(); break; } else { @@ -298,7 +303,13 @@ ssh_connect(const char *host, struct sockaddr_storage * hostaddr, /* setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *)&on, sizeof(on)); */ linger.l_onoff = 1; linger.l_linger = 5; - setsockopt(sock, SOL_SOCKET, SO_LINGER, (void *) &linger, sizeof(linger)); + setsockopt(sock, SOL_SOCKET, SO_LINGER, (void *)&linger, sizeof(linger)); + + /* Set keepalives if requested. */ + if (options.keepalives && + setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (void *)&on, + sizeof(on)) < 0) + error("setsockopt SO_KEEPALIVE: %.100s", strerror(errno)); /* Set the connection. */ packet_set_connection(sock, sock); @@ -311,13 +322,13 @@ ssh_connect(const char *host, struct sockaddr_storage * hostaddr, * identification string. */ void -ssh_exchange_identification() +ssh_exchange_identification(void) { char buf[256], remote_version[256]; /* must be same size! */ int remote_major, remote_minor, i, mismatch; int connection_in = packet_get_connection_in(); int connection_out = packet_get_connection_out(); - int minor1 = PROTOCOL_MINOR_1; + int minor1 = PROTOCOL_MINOR_1; /* Read other side\'s version identification. */ for (;;) { @@ -410,6 +421,7 @@ ssh_exchange_identification() debug("Local version string %.100s", client_version_string); } +/* defaults to 'no' */ int read_yes_or_no(const char *prompt, int defval) { @@ -417,10 +429,13 @@ read_yes_or_no(const char *prompt, int defval) FILE *f; int retval = -1; + if (options.batch_mode) + return 0; + if (isatty(STDIN_FILENO)) f = stdin; else - f = fopen("/dev/tty", "rw"); + f = fopen(_PATH_TTY, "rw"); if (f == NULL) return 0; @@ -581,10 +596,10 @@ check_host_key(char *host, struct sockaddr *hostaddr, Key *host_key, debug("Found key in %s:%d", host_file, host_line); if (options.check_host_ip && ip_status == HOST_NEW) { if (!add_host_to_hostfile(user_hostfile, ip, host_key)) - log("Failed to add the %s host key for IP address '%.30s' to the list of known hosts (%.30s).", + log("Failed to add the %s host key for IP address '%.128s' to the list of known hosts (%.30s).", type, ip, user_hostfile); else - log("Warning: Permanently added the %s host key for IP address '%.30s' to the list of known hosts.", + log("Warning: Permanently added the %s host key for IP address '%.128s' to the list of known hosts.", type, ip); } break; @@ -677,7 +692,7 @@ check_host_key(char *host, struct sockaddr *hostaddr, Key *host_key, error("X11 forwarding is disabled to avoid trojan horses."); options.forward_x11 = 0; } - if (options.num_local_forwards > 0 || options.num_remote_forwards > 0) { + if (options.num_local_forwards > 0 || options.num_remote_forwards > 0) { error("Port forwarding is disabled to avoid trojan horses."); options.num_local_forwards = options.num_remote_forwards = 0; } @@ -694,7 +709,7 @@ check_host_key(char *host, struct sockaddr *hostaddr, Key *host_key, if (options.check_host_ip && host_status != HOST_CHANGED && ip_status == HOST_CHANGED) { log("Warning: the %s host key for '%.200s' " - "differs from the key for the IP address '%.30s'", + "differs from the key for the IP address '%.128s'", type, host, ip); if (host_status == HOST_OK) log("Matching host key in %s:%d", host_file, host_line); @@ -702,7 +717,8 @@ check_host_key(char *host, struct sockaddr *hostaddr, Key *host_key, if (options.strict_host_key_checking == 1) { fatal("Exiting, you have requested strict checking."); } else if (options.strict_host_key_checking == 2) { - if (!read_yes_or_no("Continue?", -1)) + if (!read_yes_or_no("Are you sure you want " \ + "to continue connecting (yes/no)? ", -1)) fatal("Aborted by user!\n"); } }