]> andersk Git - openssh.git/blobdiff - sshconnect.c
- (bal) Missed two files in major resync. auth-bsdauth.c and auth-skey.c
[openssh.git] / sshconnect.c
index 85427b44db75edf48ee344d59a029b151cc14f81..bafdec95a9a32d879705836dc47f9117480b8b35 100644 (file)
@@ -13,7 +13,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: sshconnect.c,v 1.103 2001/04/06 21:00:14 markus Exp $");
+RCSID("$OpenBSD: sshconnect.c,v 1.107 2001/06/07 20:23:05 markus Exp $");
 
 #include <openssl/bn.h>
 
@@ -147,7 +147,8 @@ ssh_proxy_connect(const char *host, u_short port, struct passwd *pw,
 int
 ssh_create_socket(struct passwd *pw, int privileged, int family)
 {
-       int sock;
+       int sock, gaierr;
+       struct addrinfo hints, *res;
 
        /*
         * If we are running as root and want to connect to a privileged
@@ -160,17 +161,40 @@ ssh_create_socket(struct passwd *pw, int privileged, int family)
                        error("rresvport: af=%d %.100s", family, strerror(errno));
                else
                        debug("Allocated local port %d.", p);
-       } else {
-               /*
-                * Just create an ordinary socket on arbitrary port.  We use
-                * the user's uid to create the socket.
-                */
-               temporarily_use_uid(pw);
-               sock = socket(family, SOCK_STREAM, 0);
-               if (sock < 0)
-                       error("socket: %.100s", strerror(errno));
-               restore_uid();
+               return sock;
+       }
+       /*
+        * Just create an ordinary socket on arbitrary port.  We use
+        * the user's uid to create the socket.
+        */
+       temporarily_use_uid(pw);
+       sock = socket(family, SOCK_STREAM, 0);
+       if (sock < 0)
+               error("socket: %.100s", strerror(errno));
+       restore_uid();
+
+       /* Bind the socket to an alternative local IP address */
+       if (options.bind_address == NULL)
+               return sock;
+
+       memset(&hints, 0, sizeof(hints));
+       hints.ai_family = IPv4or6;
+       hints.ai_socktype = SOCK_STREAM;
+       hints.ai_flags = AI_PASSIVE;
+       gaierr = getaddrinfo(options.bind_address, "0", &hints, &res);
+       if (gaierr) {
+               error("getaddrinfo: %s: %s", options.bind_address,
+                   gai_strerror(gaierr));
+               close(sock);
+               return -1;
+       }
+       if (bind(sock, res->ai_addr, res->ai_addrlen) < 0) {
+               error("bind: %s: %s", options.bind_address, strerror(errno));
+               close(sock);
+               freeaddrinfo(res);
+               return -1;
        }
+       freeaddrinfo(res);
        return sock;
 }
 
@@ -406,8 +430,6 @@ ssh_exchange_identification(void)
                fatal("Protocol major versions differ: %d vs. %d",
                    (options.protocol & SSH_PROTO_2) ? PROTOCOL_MAJOR_2 : PROTOCOL_MAJOR_1,
                    remote_major);
-       if (compat20)
-               packet_set_ssh2_format();
        /* Send our own protocol version identification. */
        snprintf(buf, sizeof buf, "SSH-%d.%d-%.100s\n",
            compat20 ? PROTOCOL_MAJOR_2 : PROTOCOL_MAJOR_1,
@@ -738,7 +760,7 @@ check_host_key(char *host, struct sockaddr *hostaddr, Key *host_key,
  * This function does not require super-user privileges.
  */
 void
-ssh_login(Key *own_host_key, const char *orighost,
+ssh_login(Key **keys, int nkeys, const char *orighost,
     struct sockaddr *hostaddr, struct passwd *pw)
 {
        char *host, *cp;
@@ -763,10 +785,10 @@ ssh_login(Key *own_host_key, const char *orighost,
        /* authenticate user */
        if (compat20) {
                ssh_kex2(host, hostaddr);
-               ssh_userauth2(server_user, host);
+               ssh_userauth2(local_user, server_user, host, keys, nkeys);
        } else {
                ssh_kex(host, hostaddr);
-               ssh_userauth(local_user, server_user, host, own_host_key);
+               ssh_userauth1(local_user, server_user, host, keys, nkeys);
        }
 }
 
@@ -777,7 +799,7 @@ ssh_put_password(char *password)
        char *padded;
 
        if (datafellows & SSH_BUG_PASSWORDPAD) {
-               packet_put_string(password, strlen(password));
+               packet_put_cstring(password);
                return;
        }
        size = roundup(strlen(password) + 1, 32);
This page took 0.040495 seconds and 4 git commands to generate.