]> andersk Git - gssapi-openssh.git/blobdiff - openssh/clientloop.c
updating OPENSSH_GSSAPI_Protocol1-branch with latest on the trunk (OpenSSH 3.2.3p1)
[gssapi-openssh.git] / openssh / clientloop.c
index 65a6682a68e194b7db5c171745316a0a40c8c30c..15945a80d0b48019aae8af445a332543c7b16cf9 100644 (file)
@@ -59,7 +59,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: clientloop.c,v 1.96 2002/02/06 14:55:15 markus Exp $");
+RCSID("$OpenBSD: clientloop.c,v 1.100 2002/04/22 21:04:52 markus Exp $");
 
 #include "ssh.h"
 #include "ssh1.h"
@@ -81,6 +81,7 @@ RCSID("$OpenBSD: clientloop.c,v 1.96 2002/02/06 14:55:15 markus Exp $");
 #include "atomicio.h"
 #include "sshtty.h"
 #include "misc.h"
+#include "readpass.h"
 
 /* import options */
 extern Options options;
@@ -470,6 +471,67 @@ client_process_net_input(fd_set * readset)
        }
 }
 
+static void
+process_cmdline(void)
+{
+       void (*handler)(int);
+       char *s, *cmd;
+       u_short fwd_port, fwd_host_port;
+       char buf[1024], sfwd_port[6], sfwd_host_port[6];
+       int local = 0;
+
+       leave_raw_mode();
+       handler = signal(SIGINT, SIG_IGN);
+       cmd = s = read_passphrase("\r\nssh> ", RP_ECHO);
+       if (s == NULL)
+               goto out;
+       while (*s && isspace(*s))
+               s++;
+       if (*s == 0)
+               goto out;
+       if (strlen(s) < 2 || s[0] != '-' || !(s[1] == 'L' || s[1] == 'R')) {
+               log("Invalid command.");
+               goto out;
+       }
+       if (s[1] == 'L')
+               local = 1;
+       if (!local && !compat20) {
+               log("Not supported for SSH protocol version 1.");
+               goto out;
+       }
+       s += 2;
+       while (*s && isspace(*s))
+               s++;
+
+       if (sscanf(s, "%5[0-9]:%255[^:]:%5[0-9]",
+           sfwd_port, buf, sfwd_host_port) != 3 &&
+           sscanf(s, "%5[0-9]/%255[^/]/%5[0-9]",
+           sfwd_port, buf, sfwd_host_port) != 3) {
+               log("Bad forwarding specification.");
+               goto out;
+       }
+       if ((fwd_port = a2port(sfwd_port)) == 0 ||
+           (fwd_host_port = a2port(sfwd_host_port)) == 0) {
+               log("Bad forwarding port(s).");
+               goto out;
+       }
+       if (local) {
+               if (channel_setup_local_fwd_listener(fwd_port, buf,
+                   fwd_host_port, options.gateway_ports) < 0) {
+                       log("Port forwarding failed.");
+                       goto out;
+               }
+       } else
+               channel_request_remote_forwarding(fwd_port, buf,
+                   fwd_host_port);
+       log("Forwarding port.");
+out:
+       signal(SIGINT, handler);
+       enter_raw_mode();
+       if (cmd)
+               xfree(cmd);
+}
+
 /* process the characters one by one */
 static int
 process_escapes(Buffer *bin, Buffer *bout, Buffer *berr, char *buf, int len)
@@ -574,6 +636,7 @@ process_escapes(Buffer *bin, Buffer *bout, Buffer *berr, char *buf, int len)
 "%c?\r\n\
 Supported escape sequences:\r\n\
 ~.  - terminate connection\r\n\
+~C  - open a command line\r\n\
 ~R  - Request rekey (SSH protocol 2 only)\r\n\
 ~^Z - suspend ssh\r\n\
 ~#  - list forwarded connections\r\n\
@@ -593,6 +656,10 @@ Supported escape sequences:\r\n\
                                xfree(s);
                                continue;
 
+                       case 'C':
+                               process_cmdline();
+                               continue;
+
                        default:
                                if (ch != escape_char) {
                                        buffer_put_char(bin, escape_char);
@@ -1247,6 +1314,7 @@ static void
 client_init_dispatch_20(void)
 {
        dispatch_init(&dispatch_protocol_error);
+
        dispatch_set(SSH2_MSG_CHANNEL_CLOSE, &channel_input_oclose);
        dispatch_set(SSH2_MSG_CHANNEL_DATA, &channel_input_data);
        dispatch_set(SSH2_MSG_CHANNEL_EOF, &channel_input_ieof);
@@ -1260,6 +1328,10 @@ client_init_dispatch_20(void)
 
        /* rekeying */
        dispatch_set(SSH2_MSG_KEXINIT, &kex_input_kexinit);
+
+       /* global request reply messages */
+       dispatch_set(SSH2_MSG_REQUEST_FAILURE, &client_global_request_reply);
+       dispatch_set(SSH2_MSG_REQUEST_SUCCESS, &client_global_request_reply);
 }
 static void
 client_init_dispatch_13(void)
This page took 0.52579 seconds and 4 git commands to generate.