version 1.51.2.1, 2000/06/12 02:37:36 |
version 1.51.2.2, 2000/09/01 18:23:23 |
|
|
*/ |
*/ |
|
|
#include "includes.h" |
#include "includes.h" |
RCSID("$Id$"); |
RCSID("$OpenBSD$"); |
|
|
#include <openssl/evp.h> |
#include <openssl/evp.h> |
#include <openssl/dsa.h> |
#include <openssl/dsa.h> |
|
|
#include "ssh.h" |
#include "ssh.h" |
#include "packet.h" |
#include "packet.h" |
#include "buffer.h" |
#include "buffer.h" |
#include "authfd.h" |
|
#include "readconf.h" |
#include "readconf.h" |
#include "uidswap.h" |
#include "uidswap.h" |
|
|
|
|
#include "compat.h" |
#include "compat.h" |
#include "channels.h" |
#include "channels.h" |
#include "key.h" |
#include "key.h" |
|
#include "authfd.h" |
#include "authfile.h" |
#include "authfile.h" |
|
|
extern char *__progname; |
extern char *__progname; |
|
|
cp = strrchr(av0, '/') + 1; |
cp = strrchr(av0, '/') + 1; |
else |
else |
cp = av0; |
cp = av0; |
if (strcmp(cp, "rsh") != 0 && strcmp(cp, "ssh") != 0 && |
if (strcmp(cp, "rsh") && strcmp(cp, "ssh") && strcmp(cp, "rlogin") && |
strcmp(cp, "rlogin") != 0 && strcmp(cp, "slogin") != 0) |
strcmp(cp, "slogin") && strcmp(cp, "remsh")) |
host = cp; |
host = cp; |
|
|
for (optind = 1; optind < ac; optind++) { |
for (optind = 1; optind < ac; optind++) { |
|
|
} |
} |
|
|
/* Cannot fork to background if no command. */ |
/* Cannot fork to background if no command. */ |
if (fork_after_authentication_flag && buffer_len(&command) == 0) |
if (fork_after_authentication_flag && buffer_len(&command) == 0 && !no_shell_flag) |
fatal("Cannot fork into background without a command to execute."); |
fatal("Cannot fork into background without a command to execute."); |
|
|
/* Allocate a tty by default if no command specified. */ |
/* Allocate a tty by default if no command specified. */ |
|
|
pwcopy.pw_passwd = xstrdup(pw->pw_passwd); |
pwcopy.pw_passwd = xstrdup(pw->pw_passwd); |
pwcopy.pw_uid = pw->pw_uid; |
pwcopy.pw_uid = pw->pw_uid; |
pwcopy.pw_gid = pw->pw_gid; |
pwcopy.pw_gid = pw->pw_gid; |
|
pwcopy.pw_class = xstrdup(pw->pw_class); |
pwcopy.pw_dir = xstrdup(pw->pw_dir); |
pwcopy.pw_dir = xstrdup(pw->pw_dir); |
pwcopy.pw_shell = xstrdup(pw->pw_shell); |
pwcopy.pw_shell = xstrdup(pw->pw_shell); |
pw = &pwcopy; |
pw = &pwcopy; |
|
|
*/ |
*/ |
snprintf(buf, sizeof buf, "%.100s/%.100s", pw->pw_dir, SSH_USER_DIR); |
snprintf(buf, sizeof buf, "%.100s/%.100s", pw->pw_dir, SSH_USER_DIR); |
if (stat(buf, &st) < 0) |
if (stat(buf, &st) < 0) |
if (mkdir(buf, 0755) < 0) |
if (mkdir(buf, 0700) < 0) |
error("Could not create directory '%.200s'.", buf); |
error("Could not create directory '%.200s'.", buf); |
|
|
/* Check if the connection failed, and try "rsh" if appropriate. */ |
/* Check if the connection failed, and try "rsh" if appropriate. */ |
|
|
} |
} |
|
|
/* Enter the interactive session. */ |
/* Enter the interactive session. */ |
return client_loop(have_tty, tty_flag ? options.escape_char : -1); |
return client_loop(have_tty, tty_flag ? options.escape_char : -1, 0); |
} |
} |
|
|
void |
void |
|
|
ssh_session2(void) |
ssh_session2(void) |
{ |
{ |
int window, packetmax, id; |
int window, packetmax, id; |
int in = dup(STDIN_FILENO); |
int in, out, err; |
int out = dup(STDOUT_FILENO); |
|
int err = dup(STDERR_FILENO); |
|
|
|
|
if (stdin_null_flag) { |
|
in = open("/dev/null", O_RDONLY); |
|
} else { |
|
in = dup(STDIN_FILENO); |
|
} |
|
out = dup(STDOUT_FILENO); |
|
err = dup(STDERR_FILENO); |
|
|
if (in < 0 || out < 0 || err < 0) |
if (in < 0 || out < 0 || err < 0) |
fatal("dump in/out/err failed"); |
fatal("dup() in/out/err failed"); |
|
|
/* should be pre-session */ |
/* should be pre-session */ |
init_local_fwd(); |
init_local_fwd(); |
|
|
|
/* If requested, let ssh continue in the background. */ |
|
if (fork_after_authentication_flag) |
|
if (daemon(1, 1) < 0) |
|
fatal("daemon() failed: %.200s", strerror(errno)); |
|
|
window = 32*1024; |
window = 32*1024; |
if (tty_flag) { |
if (tty_flag) { |
packetmax = window/8; |
packetmax = window/8; |
|
|
packetmax = window/2; |
packetmax = window/2; |
} |
} |
|
|
|
/*XXX MAXPACK */ |
id = channel_new( |
id = channel_new( |
"session", SSH_CHANNEL_OPENING, in, out, err, |
"session", SSH_CHANNEL_OPENING, in, out, err, |
window, packetmax, CHAN_EXTENDED_WRITE, xstrdup("client-session")); |
window, packetmax, CHAN_EXTENDED_WRITE, xstrdup("client-session")); |
|
|
|
|
channel_open(id); |
channel_open(id); |
channel_register_callback(id, SSH2_MSG_CHANNEL_OPEN_CONFIRMATION, client_init, (void *)0); |
channel_register_callback(id, SSH2_MSG_CHANNEL_OPEN_CONFIRMATION, client_init, (void *)0); |
|
|
return client_loop(tty_flag, tty_flag ? options.escape_char : -1); |
return client_loop(tty_flag, tty_flag ? options.escape_char : -1, id); |
} |
} |