]> andersk Git - openssh.git/blobdiff - serverloop.c
remove acconfig.h
[openssh.git] / serverloop.c
index a953902736a69df0f602dc9e04c73cfd53ee1b7e..d2eff170a9042565450a7e65c28be0a147c4bdba 100644 (file)
@@ -35,7 +35,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: serverloop.c,v 1.110 2003/06/24 08:23:46 markus Exp $");
+RCSID("$OpenBSD: serverloop.c,v 1.118 2005/07/17 07:17:55 djm Exp $");
 
 #include "xmalloc.h"
 #include "packet.h"
@@ -60,7 +60,7 @@ extern ServerOptions options;
 
 /* XXX */
 extern Kex *xxx_kex;
-static Authctxt *xxx_authctxt;
+extern Authctxt *the_authctxt;
 
 static Buffer stdin_buffer;    /* Buffer for stdin data. */
 static Buffer stdout_buffer;   /* Buffer for stdout data. */
@@ -212,26 +212,23 @@ make_packets_from_stdout_data(void)
 static void
 client_alive_check(void)
 {
-       static int had_channel = 0;
-       int id;
-
-       id = channel_find_open();
-       if (id == -1) {
-               if (!had_channel)
-                       return;
-               packet_disconnect("No open channels after timeout!");
-       }
-       had_channel = 1;
+       int channel_id;
 
        /* timeout, check to see how many we have had */
        if (++client_alive_timeouts > options.client_alive_count_max)
                packet_disconnect("Timeout, your session not responding.");
 
        /*
-        * send a bogus channel request with "wantreply",
+        * send a bogus global/channel request with "wantreply",
         * we should get back a failure
         */
-       channel_request_start(id, "keepalive@openssh.com", 1);
+       if ((channel_id = channel_find_open()) == -1) {
+               packet_start(SSH2_MSG_GLOBAL_REQUEST);
+               packet_put_cstring("keepalive@openssh.com");
+               packet_put_char(1);     /* boolean: want reply */
+       } else {
+               channel_request_start(channel_id, "keepalive@openssh.com", 1);
+       }
        packet_send();
 }
 
@@ -243,7 +240,7 @@ client_alive_check(void)
  */
 static void
 wait_until_can_do_something(fd_set **readsetp, fd_set **writesetp, int *maxfdp,
-    int *nallocp, u_int max_time_milliseconds)
+    u_int *nallocp, u_int max_time_milliseconds)
 {
        struct timeval tv, *tvp;
        int ret;
@@ -355,13 +352,13 @@ process_input(fd_set * readset)
                        connection_closed = 1;
                        if (compat20)
                                return;
-                       fatal_cleanup();
+                       cleanup_exit(255);
                } else if (len < 0) {
                        if (errno != EINTR && errno != EAGAIN) {
                                verbose("Read error from remote host "
                                    "%.100s: %.100s",
                                    get_remote_ipaddr(), strerror(errno));
-                               fatal_cleanup();
+                               cleanup_exit(255);
                        }
                } else {
                        /* Buffer any received data. */
@@ -489,7 +486,8 @@ void
 server_loop(pid_t pid, int fdin_arg, int fdout_arg, int fderr_arg)
 {
        fd_set *readset = NULL, *writeset = NULL;
-       int max_fd = 0, nalloc = 0;
+       int max_fd = 0;
+       u_int nalloc = 0;
        int wait_status;        /* Status returned by wait(). */
        pid_t wait_pid;         /* pid returned by wait(). */
        int waiting_termination = 0;    /* Have displayed waiting close message. */
@@ -756,8 +754,6 @@ server_loop2(Authctxt *authctxt)
        max_fd = MAX(connection_in, connection_out);
        max_fd = MAX(max_fd, notify_pipe[0]);
 
-       xxx_authctxt = authctxt;
-
        server_init_dispatch();
 
        for (;;) {
@@ -799,9 +795,9 @@ server_loop2(Authctxt *authctxt)
 }
 
 static void
-server_input_channel_failure(int type, u_int32_t seq, void *ctxt)
+server_input_keep_alive(int type, u_int32_t seq, void *ctxt)
 {
-       debug("Got CHANNEL_FAILURE for keepalive");
+       debug("Got %d/%u for keepalive", type, seq);
        /*
         * reset timeout, since we got a sane answer from the client.
         * even if this was generated by something other than
@@ -810,7 +806,6 @@ server_input_channel_failure(int type, u_int32_t seq, void *ctxt)
        client_alive_timeouts = 0;
 }
 
-
 static void
 server_input_stdin_data(int type, u_int32_t seq, void *ctxt)
 {
@@ -856,7 +851,7 @@ server_input_window_size(int type, u_int32_t seq, void *ctxt)
 }
 
 static Channel *
-server_request_direct_tcpip(char *ctype)
+server_request_direct_tcpip(void)
 {
        Channel *c;
        int sock;
@@ -870,7 +865,7 @@ server_request_direct_tcpip(char *ctype)
        packet_check_eom();
 
        debug("server_request_direct_tcpip: originator %s port %d, target %s port %d",
-          originator, originator_port, target, target_port);
+           originator, originator_port, target, target_port);
 
        /* XXX check permission */
        sock = channel_connect_to(target, target_port);
@@ -878,14 +873,14 @@ server_request_direct_tcpip(char *ctype)
        xfree(originator);
        if (sock < 0)
                return NULL;
-       c = channel_new(ctype, SSH_CHANNEL_CONNECTING,
+       c = channel_new("direct-tcpip", SSH_CHANNEL_CONNECTING,
            sock, sock, -1, CHAN_TCP_WINDOW_DEFAULT,
            CHAN_TCP_PACKET_DEFAULT, 0, "direct-tcpip", 1);
        return c;
 }
 
 static Channel *
-server_request_session(char *ctype)
+server_request_session(void)
 {
        Channel *c;
 
@@ -897,10 +892,10 @@ server_request_session(char *ctype)
         * SSH_CHANNEL_LARVAL.  Additionally, a callback for handling all
         * CHANNEL_REQUEST messages is registered.
         */
-       c = channel_new(ctype, SSH_CHANNEL_LARVAL,
+       c = channel_new("session", SSH_CHANNEL_LARVAL,
            -1, -1, -1, /*window size*/0, CHAN_SES_PACKET_DEFAULT,
            0, "server-session", 1);
-       if (session_open(xxx_authctxt, c->self) != 1) {
+       if (session_open(the_authctxt, c->self) != 1) {
                debug("session open failed, free channel %d", c->self);
                channel_free(c);
                return NULL;
@@ -926,9 +921,9 @@ server_input_channel_open(int type, u_int32_t seq, void *ctxt)
            ctype, rchan, rwindow, rmaxpack);
 
        if (strcmp(ctype, "session") == 0) {
-               c = server_request_session(ctype);
+               c = server_request_session();
        } else if (strcmp(ctype, "direct-tcpip") == 0) {
-               c = server_request_direct_tcpip(ctype);
+               c = server_request_direct_tcpip();
        }
        if (c != NULL) {
                debug("server_input_channel_open: confirm %s", ctype);
@@ -974,9 +969,9 @@ server_input_global_request(int type, u_int32_t seq, void *ctxt)
                char *listen_address;
                u_short listen_port;
 
-               pw = auth_get_user();
-               if (pw == NULL)
-                       fatal("server_input_global_request: no user");
+               pw = the_authctxt->pw;
+               if (pw == NULL || !the_authctxt->valid)
+                       fatal("server_input_global_request: no/invalid user");
                listen_address = packet_get_string(NULL);
                listen_port = (u_short)packet_get_int();
                debug("server_input_global_request: tcpip-forward listen %s port %d",
@@ -988,7 +983,7 @@ server_input_global_request(int type, u_int32_t seq, void *ctxt)
 #ifndef NO_IPPORT_RESERVED_CONCEPT
                    || (listen_port < IPPORT_RESERVED && pw->pw_uid != 0)
 #endif
-                  ) {
+                   ) {
                        success = 0;
                        packet_send_debug("Server has disabled port forwarding.");
                } else {
@@ -997,6 +992,17 @@ server_input_global_request(int type, u_int32_t seq, void *ctxt)
                            listen_address, listen_port, options.gateway_ports);
                }
                xfree(listen_address);
+       } else if (strcmp(rtype, "cancel-tcpip-forward") == 0) {
+               char *cancel_address;
+               u_short cancel_port;
+
+               cancel_address = packet_get_string(NULL);
+               cancel_port = (u_short)packet_get_int();
+               debug("%s: cancel-tcpip-forward addr %s port %d", __func__,
+                   cancel_address, cancel_port);
+
+               success = channel_cancel_rport_listener(cancel_address,
+                   cancel_port);
        }
        if (want_reply) {
                packet_start(success ?
@@ -1050,7 +1056,9 @@ server_init_dispatch_20(void)
        dispatch_set(SSH2_MSG_CHANNEL_WINDOW_ADJUST, &channel_input_window_adjust);
        dispatch_set(SSH2_MSG_GLOBAL_REQUEST, &server_input_global_request);
        /* client_alive */
-       dispatch_set(SSH2_MSG_CHANNEL_FAILURE, &server_input_channel_failure);
+       dispatch_set(SSH2_MSG_CHANNEL_FAILURE, &server_input_keep_alive);
+       dispatch_set(SSH2_MSG_REQUEST_SUCCESS, &server_input_keep_alive);
+       dispatch_set(SSH2_MSG_REQUEST_FAILURE, &server_input_keep_alive);
        /* rekeying */
        dispatch_set(SSH2_MSG_KEXINIT, &kex_input_kexinit);
 }
This page took 0.052345 seconds and 4 git commands to generate.