]> andersk Git - gssapi-openssh.git/blobdiff - openssh/sshconnect.c
Import of OpenSSH 4.2p1
[gssapi-openssh.git] / openssh / sshconnect.c
index 07703cf770914ac71c57c7d8e1a3d95a8d742c9d..ba7b9b71ec3d4c1e0fab89eb76a5c8e4f8dbbf55 100644 (file)
@@ -13,7 +13,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: sshconnect.c,v 1.162 2005/03/10 22:01:06 deraadt Exp $");
+RCSID("$OpenBSD: sshconnect.c,v 1.168 2005/07/17 07:17:55 djm Exp $");
 
 #include <openssl/bn.h>
 
@@ -59,12 +59,11 @@ static void warn_changed_key(Key *);
 static int
 ssh_proxy_connect(const char *host, u_short port, const char *proxy_command)
 {
-       Buffer command;
-       const char *cp;
-       char *command_string;
+       char *command_string, *tmp;
        int pin[2], pout[2];
        pid_t pid;
        char strport[NI_MAXSERV];
+       size_t len;
 
        /* Convert the port number into a string. */
        snprintf(strport, sizeof strport, "%hu", port);
@@ -76,31 +75,13 @@ ssh_proxy_connect(const char *host, u_short port, const char *proxy_command)
         * Use "exec" to avoid "sh -c" processes on some platforms
         * (e.g. Solaris)
         */
-       buffer_init(&command);
-       buffer_append(&command, "exec ", 5);
-
-       for (cp = proxy_command; *cp; cp++) {
-               if (cp[0] == '%' && cp[1] == '%') {
-                       buffer_append(&command, "%", 1);
-                       cp++;
-                       continue;
-               }
-               if (cp[0] == '%' && cp[1] == 'h') {
-                       buffer_append(&command, host, strlen(host));
-                       cp++;
-                       continue;
-               }
-               if (cp[0] == '%' && cp[1] == 'p') {
-                       buffer_append(&command, strport, strlen(strport));
-                       cp++;
-                       continue;
-               }
-               buffer_append(&command, cp, 1);
-       }
-       buffer_append(&command, "\0", 1);
-
-       /* Get the final command string. */
-       command_string = buffer_ptr(&command);
+       len = strlen(proxy_command) + 6;
+       tmp = xmalloc(len);
+       strlcpy(tmp, "exec ", len);
+       strlcat(tmp, proxy_command, len);
+       command_string = percent_expand(tmp, "h", host,
+           "p", strport, (char *)NULL);
+       xfree(tmp);
 
        /* Create pipes for communicating with the proxy. */
        if (pipe(pin) < 0 || pipe(pout) < 0)
@@ -154,7 +135,7 @@ ssh_proxy_connect(const char *host, u_short port, const char *proxy_command)
        close(pout[1]);
 
        /* Free the command name. */
-       buffer_free(&command);
+       xfree(command_string);
 
        /* Set the connection file descriptors. */
        packet_set_connection(pout[0], pin[1]);
@@ -308,18 +289,9 @@ ssh_connect(const char *host, struct sockaddr_storage * hostaddr,
        int sock = -1, attempt;
        char ntop[NI_MAXHOST], strport[NI_MAXSERV];
        struct addrinfo hints, *ai, *aitop;
-       struct servent *sp;
 
        debug2("ssh_connect: needpriv %d", needpriv);
 
-       /* Get default port if port has not been set. */
-       if (port == 0) {
-               sp = getservbyname(SSH_SERVICE_NAME, "tcp");
-               if (sp)
-                       port = ntohs(sp->s_port);
-               else
-                       port = SSH_DEFAULT_PORT;
-       }
        /* If a proxy command is given, connect using it. */
        if (proxy_command != NULL)
                return ssh_proxy_connect(host, port, proxy_command);
@@ -421,19 +393,21 @@ static void
 ssh_exchange_identification(void)
 {
        char buf[256], remote_version[256];     /* must be same size! */
-       int remote_major, remote_minor, i, mismatch;
+       int remote_major, remote_minor, mismatch;
        int connection_in = packet_get_connection_in();
        int connection_out = packet_get_connection_out();
        int minor1 = PROTOCOL_MINOR_1;
+       u_int i;
 
-       /* Read other side\'s version identification. */
+       /* Read other side's version identification. */
        for (;;) {
                for (i = 0; i < sizeof(buf) - 1; i++) {
-                       int len = atomicio(read, connection_in, &buf[i], 1);
-                       if (len < 0)
-                               fatal("ssh_exchange_identification: read: %.100s", strerror(errno));
-                       if (len != 1)
+                       size_t len = atomicio(read, connection_in, &buf[i], 1);
+
+                       if (len != 1 && errno == EPIPE)
                                fatal("ssh_exchange_identification: Connection closed by remote host");
+                       else if (len != 1)
+                               fatal("ssh_exchange_identification: read: %.100s", strerror(errno));
                        if (buf[i] == '\r') {
                                buf[i] = '\n';
                                buf[i + 1] = 0;
@@ -573,7 +547,7 @@ check_host_key(char *host, struct sockaddr *hostaddr, Key *host_key,
        switch (hostaddr->sa_family) {
        case AF_INET:
                local = (ntohl(((struct sockaddr_in *)hostaddr)->
-                  sin_addr.s_addr) >> 24) == IN_LOOPBACKNET;
+                   sin_addr.s_addr) >> 24) == IN_LOOPBACKNET;
                salen = sizeof(struct sockaddr_in);
                break;
        case AF_INET6:
@@ -706,8 +680,8 @@ check_host_key(char *host, struct sockaddr *hostaddr, Key *host_key,
 
                        if (show_other_keys(host, host_key))
                                snprintf(msg1, sizeof(msg1),
-                                  "\nbut keys of different type are already"
-                                  " known for this host.");
+                                   "\nbut keys of different type are already"
+                                   " known for this host.");
                        else
                                snprintf(msg1, sizeof(msg1), ".");
                        /* The default */
This page took 0.084798 seconds and 4 git commands to generate.