From 1d62e5795ee49668a02a64532f13d6ea56d997db Mon Sep 17 00:00:00 2001 From: Assar Westerlund Date: Sat, 10 Apr 1999 15:32:50 +0000 Subject: [PATCH] (setup_copier): use `socketpair' instead of `pipe'. Some shells don't think it's a rsh session if they find a pipe at the other end. (setup_environment): add SSH_CLIENT just to make bash happy git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@5908 ec53bebd-3082-4978-b11e-865c3cabbd6b --- appl/rsh/rshd.c | 58 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 45 insertions(+), 13 deletions(-) diff --git a/appl/rsh/rshd.c b/appl/rsh/rshd.c index 43d108531..5c3df464e 100644 --- a/appl/rsh/rshd.c +++ b/appl/rsh/rshd.c @@ -399,18 +399,35 @@ loop (int from0, int to0, } } +/* + * Used by `setup_copier' to create some pipe-like means of + * communcation. Real pipes would probably be the best thing, but + * then the shell doesn't understand it's talking to rshd. If + * socketpair doesn't work everywhere, some autoconf magic would have + * to be added here. + * + * If it fails creating the `pipe', it aborts by calling fatal. + */ + +static void +pipe_a_like (int fd[2]) +{ + if (socketpair (AF_UNIX, SOCK_STREAM, 0, fd) < 0) + fatal (STDOUT_FILENO, "socketpair: %m"); +} + +/* + * Start a child process and leave the parent copying data to and from it. */ + static void setup_copier (void) { int p0[2], p1[2], p2[2]; pid_t pid; - if (pipe(p0) < 0) - fatal (STDOUT_FILENO, "pipe: %m"); - if (pipe(p1) < 0) - fatal (STDOUT_FILENO, "pipe: %m"); - if (pipe(p2) < 0) - fatal (STDOUT_FILENO, "pipe: %m"); + pipe_a_like(p0); + pipe_a_like(p1); + pipe_a_like(p2); pid = fork (); if (pid < 0) fatal (STDOUT_FILENO, "fork: %m"); @@ -424,7 +441,7 @@ setup_copier (void) close (p0[0]); close (p1[1]); close (p2[1]); - } else { + } else { /* parent */ close (p0[0]); close (p1[1]); close (p2[1]); @@ -438,12 +455,31 @@ setup_copier (void) } } +/* + * Is `port' a ``reserverd'' port? + */ + static int is_reserved(u_short port) { return ntohs(port) < IPPORT_RESERVED; } +/* + * Set the necessary part of the environment in `env'. + */ + +static void +setup_environment (char *env[6], struct passwd *pwd) +{ + asprintf (&env[0], "USER=%s", pwd->pw_name); + asprintf (&env[1], "HOME=%s", pwd->pw_dir); + asprintf (&env[2], "SHELL=%s", pwd->pw_shell); + asprintf (&env[3], "PATH=%s", _PATH_DEFPATH); + asprintf (&env[4], "SSH_CLIENT=only_to_make_bash_happy"); + env[5] = NULL; +} + static void doit (int do_kerberos, int check_rhosts) { @@ -457,7 +493,7 @@ doit (int do_kerberos, int check_rhosts) char cmd[COMMAND_SZ]; struct passwd *pwd; int s = STDIN_FILENO; - char *env[5]; + char *env[6]; addrlen = sizeof(thisaddr); if (getsockname (s, (struct sockaddr *)&thisaddr, &addrlen) < 0 @@ -577,11 +613,7 @@ doit (int do_kerberos, int check_rhosts) close (errsock); } - asprintf (&env[0], "USER=%s", pwd->pw_name); - asprintf (&env[1], "HOME=%s", pwd->pw_dir); - asprintf (&env[2], "SHELL=%s", pwd->pw_shell); - asprintf (&env[3], "PATH=%s", _PATH_DEFPATH); - env[4] = NULL; + setup_environment (env, pwd); if (do_encrypt) { setup_copier ();