]> andersk Git - openssh.git/blobdiff - sshconnect.c
- (djm) Set "login ID" on systems with setluid. Only enabled for SCO
[openssh.git] / sshconnect.c
index 2102bef6f31bd2a9e6b247d6b72ef4438f7211c7..389d65985a00160004905f1c7328acd226558d54 100644 (file)
  */
 
 #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 <openssl/bn.h>
-#include <openssl/dsa.h>
-#include <openssl/rsa.h>
 
+#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");
                }
        }
This page took 0.038727 seconds and 4 git commands to generate.