]> andersk Git - openssh.git/blobdiff - channels.c
- djm@cvs.openbsd.org 2001/12/21 10:06:43
[openssh.git] / channels.c
index 40a86dccbc5388618db16f360dfe2a25ff6f5b98..cc2613a88fb5f033bd966fd525db7b2a35a0398e 100644 (file)
@@ -39,7 +39,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: channels.c,v 1.146 2001/12/06 18:20:32 stevesk Exp $");
+RCSID("$OpenBSD: channels.c,v 1.150 2001/12/20 22:50:24 djm Exp $");
 
 #include "ssh.h"
 #include "ssh1.h"
@@ -54,6 +54,7 @@ RCSID("$OpenBSD: channels.c,v 1.146 2001/12/06 18:20:32 stevesk Exp $");
 #include "canohost.h"
 #include "key.h"
 #include "authfd.h"
+#include "pathnames.h"
 
 
 /* -- channel core */
@@ -262,6 +263,7 @@ channel_new(char *ctype, int type, int rfd, int wfd, int efd,
        c->cb_arg = NULL;
        c->cb_event = 0;
        c->force_drain = 0;
+       c->single_connection = 0;
        c->detach_user = NULL;
        c->input_filter = NULL;
        debug("channel %d: new [%s]", found, remote_name);
@@ -793,7 +795,7 @@ x11_open_helper(Buffer *b)
                data_len = ucp[8] + 256 * ucp[9];
        } else {
                debug("Initial X11 packet contains bad byte order byte: 0x%x",
-                     ucp[0]);
+                   ucp[0]);
                return -1;
        }
 
@@ -883,7 +885,7 @@ channel_decode_socks4(Channel *c, fd_set * readset, fd_set * writeset)
 {
        u_char *p, *host;
        int len, have, i, found;
-       char username[256];     
+       char username[256];
        struct {
                u_int8_t version;
                u_int8_t command;
@@ -930,7 +932,7 @@ channel_decode_socks4(Channel *c, fd_set * readset, fd_set * writeset)
        host = inet_ntoa(s4_req.dest_addr);
        strlcpy(c->path, host, sizeof(c->path));
        c->host_port = ntohs(s4_req.dest_port);
-       
+
        debug("channel %d: dynamic request: socks4 host %s port %u command %u",
            c->self, host, c->host_port, s4_req.command);
 
@@ -1002,6 +1004,11 @@ channel_post_x11_listener(Channel *c, fd_set * readset, fd_set * writeset)
                debug("X11 connection requested.");
                addrlen = sizeof(addr);
                newsock = accept(c->sock, &addr, &addrlen);
+               if (c->single_connection) {
+                       debug("single_connection: closing X11 listener.");
+                       channel_close_fd(&c->sock);
+                       chan_mark_dead(c);
+               }
                if (newsock < 0) {
                        error("accept: %.100s", strerror(errno));
                        return;
@@ -1028,8 +1035,8 @@ channel_post_x11_listener(Channel *c, fd_set * readset, fd_set * writeset)
                        packet_start(SSH2_MSG_CHANNEL_OPEN);
                        packet_put_cstring("x11");
                        packet_put_int(nc->self);
-                       packet_put_int(c->local_window_max);
-                       packet_put_int(c->local_maxpacket);
+                       packet_put_int(nc->local_window_max);
+                       packet_put_int(nc->local_maxpacket);
                        /* originator ipaddr and port */
                        packet_put_cstring(remote_ipaddr);
                        if (datafellows & SSH_BUG_X11FWD) {
@@ -1372,7 +1379,7 @@ channel_handle_efd(Channel *c, fd_set * readset, fd_set * writeset)
                    FD_ISSET(c->efd, readset)) {
                        len = read(c->efd, buf, sizeof(buf));
                        debug2("channel %d: read %d from efd %d",
-                            c->self, len, c->efd);
+                           c->self, len, c->efd);
                        if (len < 0 && (errno == EINTR || errno == EAGAIN))
                                return 1;
                        if (len <= 0) {
@@ -1508,7 +1515,7 @@ static void
 channel_handler_init(void)
 {
        int i;
-       for(i = 0; i < SSH_CHANNEL_MAX_TYPE; i++) {
+       for (i = 0; i < SSH_CHANNEL_MAX_TYPE; i++) {
                channel_pre[i] = NULL;
                channel_post[i] = NULL;
        }
@@ -1703,7 +1710,7 @@ channel_output_poll(void)
 /* -- protocol input */
 
 void
-channel_input_data(int type, int plen, void *ctxt)
+channel_input_data(int type, int plen, u_int32_t seq, void *ctxt)
 {
        int id;
        char *data;
@@ -1749,7 +1756,7 @@ channel_input_data(int type, int plen, void *ctxt)
 }
 
 void
-channel_input_extended_data(int type, int plen, void *ctxt)
+channel_input_extended_data(int type, int plen, u_int32_t seq, void *ctxt)
 {
        int id;
        int tcode;
@@ -1789,7 +1796,7 @@ channel_input_extended_data(int type, int plen, void *ctxt)
 }
 
 void
-channel_input_ieof(int type, int plen, void *ctxt)
+channel_input_ieof(int type, int plen, u_int32_t seq, void *ctxt)
 {
        int id;
        Channel *c;
@@ -1811,7 +1818,7 @@ channel_input_ieof(int type, int plen, void *ctxt)
 }
 
 void
-channel_input_close(int type, int plen, void *ctxt)
+channel_input_close(int type, int plen, u_int32_t seq, void *ctxt)
 {
        int id;
        Channel *c;
@@ -1850,7 +1857,7 @@ channel_input_close(int type, int plen, void *ctxt)
 
 /* proto version 1.5 overloads CLOSE_CONFIRMATION with OCLOSE */
 void
-channel_input_oclose(int type, int plen, void *ctxt)
+channel_input_oclose(int type, int plen, u_int32_t seq, void *ctxt)
 {
        int id = packet_get_int();
        Channel *c = channel_lookup(id);
@@ -1861,7 +1868,7 @@ channel_input_oclose(int type, int plen, void *ctxt)
 }
 
 void
-channel_input_close_confirmation(int type, int plen, void *ctxt)
+channel_input_close_confirmation(int type, int plen, u_int32_t seq, void *ctxt)
 {
        int id = packet_get_int();
        Channel *c = channel_lookup(id);
@@ -1877,7 +1884,7 @@ channel_input_close_confirmation(int type, int plen, void *ctxt)
 }
 
 void
-channel_input_open_confirmation(int type, int plen, void *ctxt)
+channel_input_open_confirmation(int type, int plen, u_int32_t seq, void *ctxt)
 {
        int id, remote_id;
        Channel *c;
@@ -1927,7 +1934,7 @@ reason2txt(int reason)
 }
 
 void
-channel_input_open_failure(int type, int plen, void *ctxt)
+channel_input_open_failure(int type, int plen, u_int32_t seq, void *ctxt)
 {
        int id, reason;
        char *msg = NULL, *lang = NULL;
@@ -1961,7 +1968,7 @@ channel_input_open_failure(int type, int plen, void *ctxt)
 }
 
 void
-channel_input_channel_request(int type, int plen, void *ctxt)
+channel_input_channel_request(int type, int plen, u_int32_t seq, void *ctxt)
 {
        int id;
        Channel *c;
@@ -1986,7 +1993,7 @@ channel_input_channel_request(int type, int plen, void *ctxt)
 }
 
 void
-channel_input_window_adjust(int type, int plen, void *ctxt)
+channel_input_window_adjust(int type, int plen, u_int32_t seq, void *ctxt)
 {
        Channel *c;
        int id, adjust;
@@ -2010,7 +2017,7 @@ channel_input_window_adjust(int type, int plen, void *ctxt)
 }
 
 void
-channel_input_port_open(int type, int plen, void *ctxt)
+channel_input_port_open(int type, int plen, u_int32_t seq, void *ctxt)
 {
        Channel *c = NULL;
        u_short host_port;
@@ -2404,8 +2411,10 @@ channel_connect_to(const char *host, u_short port)
  * an error occurs.
  */
 int
-x11_create_display_inet(int x11_display_offset, int gateway_ports)
+x11_create_display_inet(int x11_display_offset, int gateway_ports,
+    int single_connection)
 {
+       Channel *nc = NULL;
        int display_number, sock;
        u_short port;
        struct addrinfo hints, *ai, *aitop;
@@ -2413,8 +2422,8 @@ x11_create_display_inet(int x11_display_offset, int gateway_ports)
        int gaierr, n, num_socks = 0, socks[NUM_SOCKS];
 
        for (display_number = x11_display_offset;
-            display_number < MAX_DISPLAYS;
-            display_number++) {
+           display_number < MAX_DISPLAYS;
+           display_number++) {
                port = 6000 + display_number;
                memset(&hints, 0, sizeof(hints));
                hints.ai_family = IPv4or6;
@@ -2481,44 +2490,33 @@ x11_create_display_inet(int x11_display_offset, int gateway_ports)
        /* Allocate a channel for each socket. */
        for (n = 0; n < num_socks; n++) {
                sock = socks[n];
-               (void) channel_new("x11 listener",
+               nc = channel_new("x11 listener",
                    SSH_CHANNEL_X11_LISTENER, sock, sock, -1,
                    CHAN_X11_WINDOW_DEFAULT, CHAN_X11_PACKET_DEFAULT,
                    0, xstrdup("X11 inet listener"), 1);
+               if (nc != NULL)
+                       nc->single_connection = single_connection;
        }
 
        /* Return the display number for the DISPLAY environment variable. */
        return display_number;
 }
 
-#ifndef X_UNIX_PATH
-#define X_UNIX_PATH "/tmp/.X11-unix/X"
-#endif
-
 static int
 connect_local_xsocket(u_int dnr)
 {
-       static const char *const x_sockets[] = {
-               X_UNIX_PATH "%u",
-               "/var/X/.X11-unix/X" "%u",
-               "/usr/spool/sockets/X11/" "%u",
-               NULL
-       };
        int sock;
        struct sockaddr_un addr;
-       const char *const * path;
 
-       for (path = x_sockets; *path; ++path) {
-               sock = socket(AF_UNIX, SOCK_STREAM, 0);
-               if (sock < 0)
-                       error("socket: %.100s", strerror(errno));
-               memset(&addr, 0, sizeof(addr));
-               addr.sun_family = AF_UNIX;
-               snprintf(addr.sun_path, sizeof addr.sun_path, *path, dnr);
-               if (connect(sock, (struct sockaddr *) & addr, sizeof(addr)) == 0)
-                       return sock;
-               close(sock);
-       }
+       sock = socket(AF_UNIX, SOCK_STREAM, 0);
+       if (sock < 0)
+               error("socket: %.100s", strerror(errno));
+       memset(&addr, 0, sizeof(addr));
+       addr.sun_family = AF_UNIX;
+       snprintf(addr.sun_path, sizeof addr.sun_path, _PATH_UNIX_X, dnr);
+       if (connect(sock, (struct sockaddr *) & addr, sizeof(addr)) == 0)
+               return sock;
+       close(sock);
        error("connect %.100s: %.100s", addr.sun_path, strerror(errno));
        return -1;
 }
@@ -2553,7 +2551,7 @@ x11_connect_display(void)
                /* Connect to the unix domain socket. */
                if (sscanf(strrchr(display, ':') + 1, "%d", &display_number) != 1) {
                        error("Could not parse display number from DISPLAY: %.100s",
-                             display);
+                           display);
                        return -1;
                }
                /* Create a socket. */
@@ -2578,7 +2576,7 @@ x11_connect_display(void)
        /* buf now contains the host name.  But first we parse the display number. */
        if (sscanf(cp + 1, "%d", &display_number) != 1) {
                error("Could not parse display number from DISPLAY: %.100s",
-                     display);
+                   display);
                return -1;
        }
 
@@ -2626,7 +2624,7 @@ x11_connect_display(void)
  */
 
 void
-x11_input_open(int type, int plen, void *ctxt)
+x11_input_open(int type, int plen, u_int32_t seq, void *ctxt)
 {
        Channel *c = NULL;
        int remote_id, sock = 0;
@@ -2673,7 +2671,7 @@ x11_input_open(int type, int plen, void *ctxt)
 
 /* dummy protocol handler that denies SSH-1 requests (agent/x11) */
 void
-deny_input_open(int type, int plen, void *ctxt)
+deny_input_open(int type, int plen, u_int32_t seq, void *ctxt)
 {
        int rchan = packet_get_int();
        switch (type) {
@@ -2884,7 +2882,7 @@ auth_input_request_forwarding(struct passwd * pw)
 /* This is called to process an SSH_SMSG_AGENT_OPEN message. */
 
 void
-auth_input_open_request(int type, int plen, void *ctxt)
+auth_input_open_request(int type, int plen, u_int32_t seq, void *ctxt)
 {
        Channel *c = NULL;
        int remote_id, sock;
This page took 0.041021 seconds and 4 git commands to generate.