+/* $OpenBSD: clientloop.c,v 1.169 2006/07/17 01:31:09 stevesk Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
#ifdef HAVE_SYS_STAT_H
# include <sys/stat.h>
#endif
+#include <sys/socket.h>
#include <sys/ioctl.h>
#include <ctype.h>
+#include <errno.h>
#ifdef HAVE_PATHS_H
#include <paths.h>
#endif
#include <signal.h>
#include <termios.h>
+#include <unistd.h>
#include "ssh.h"
#include "ssh1.h"
static int in_non_blocking_mode = 0;
/* Common data for the client loop code. */
-static int quit_pending; /* Set to non-zero to quit the client loop. */
+static volatile sig_atomic_t quit_pending; /* Set non-zero to quit the loop. */
static int escape_char; /* Escape character. */
static int escape_pending; /* Last character was the escape character */
static int last_was_cr; /* Last character was a newline. */
}
static void
-client_process_net_input(fd_set * readset)
+client_process_net_input(fd_set *readset)
{
int len;
char buf[8192];
}
static void
-client_process_control(fd_set * readset)
+client_process_control(fd_set *readset)
{
Buffer m;
Channel *c;
return;
}
- cctx = xmalloc(sizeof(*cctx));
- memset(cctx, 0, sizeof(*cctx));
+ cctx = xcalloc(1, sizeof(*cctx));
cctx->want_tty = (flags & SSHMUX_FLAG_TTY) != 0;
cctx->want_subsys = (flags & SSHMUX_FLAG_SUBSYS) != 0;
cctx->want_x_fwd = (flags & SSHMUX_FLAG_X11_FWD) != 0;
env_len = MIN(env_len, 4096);
debug3("%s: receiving %d env vars", __func__, env_len);
if (env_len != 0) {
- cctx->env = xmalloc(sizeof(*cctx->env) * (env_len + 1));
+ cctx->env = xcalloc(env_len + 1, sizeof(*cctx->env));
for (i = 0; i < env_len; i++)
cctx->env[i] = buffer_get_string(&m, &len);
cctx->env[i] = NULL;
debug2("%s: accepted tty %d, subsys %d, cmd %s", __func__,
cctx->want_tty, cctx->want_subsys, cmd);
+ xfree(cmd);
/* Gather fds from client */
new_fd[0] = mm_receive_fd(client_fd);
if (*s == 'h' || *s == 'H' || *s == '?') {
logit("Commands:");
- logit(" -Lport:host:hostport Request local forward");
- logit(" -Rport:host:hostport Request remote forward");
- logit(" -KRhostport Cancel remote forward");
+ logit(" -L[bind_address:]port:host:hostport "
+ "Request local forward");
+ logit(" -R[bind_address:]port:host:hostport "
+ "Request remote forward");
+ logit(" -KR[bind_address:]port "
+ "Cancel remote forward");
if (!options.permit_local_command)
goto out;
- logit(" !args Execute local command");
+ logit(" !args "
+ "Execute local command");
goto out;
}
goto out;
}
} else {
- channel_request_remote_forwarding(fwd.listen_host,
+ if (channel_request_remote_forwarding(fwd.listen_host,
fwd.listen_port, fwd.connect_host,
- fwd.connect_port);
+ fwd.connect_port) < 0) {
+ logit("Port forwarding failed.");
+ goto out;
+ }
}
logit("Forwarding port.");
}
static void
-client_process_input(fd_set * readset)
+client_process_input(fd_set *readset)
{
int len;
char buf[8192];
}
static void
-client_process_output(fd_set * writeset)
+client_process_output(fd_set *writeset)
{
int len;
char buf[100];