-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);
-}
-