From 12fe2d35826cfd4094ead49971e059c1b81df9a3 Mon Sep 17 00:00:00 2001 From: Assar Westerlund Date: Wed, 23 Jun 1999 04:09:22 +0000 Subject: [PATCH] new option `-e' for not trying to open an stderr socket git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@6338 ec53bebd-3082-4978-b11e-865c3cabbd6b --- appl/rsh/rsh.c | 95 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 58 insertions(+), 37 deletions(-) diff --git a/appl/rsh/rsh.c b/appl/rsh/rsh.c index c8cce152b..06ab7745b 100644 --- a/appl/rsh/rsh.c +++ b/appl/rsh/rsh.c @@ -60,14 +60,16 @@ static int loop (int s, int errsock) { fd_set real_readset; - int count = 2; + int count = 1; FD_ZERO(&real_readset); FD_SET(s, &real_readset); - FD_SET(errsock, &real_readset); - if(input) { - FD_SET(STDIN_FILENO, &real_readset); + if (errsock != -1) { + FD_SET(errsock, &real_readset); + ++count; } + if(input) + FD_SET(STDIN_FILENO, &real_readset); for (;;) { int ret; @@ -94,7 +96,7 @@ loop (int s, int errsock) } else net_write (STDOUT_FILENO, buf, ret); } - if (FD_ISSET(errsock, &readset)) { + if (errsock != -1 && FD_ISSET(errsock, &readset)) { ret = do_read (errsock, buf, sizeof(buf)); if (ret < 0) err (1, "read"); @@ -397,33 +399,43 @@ proto (int s, int errsock, return 1; } - addrlen = sizeof(erraddr); - if (getsockname (errsock, (struct sockaddr *)&erraddr, &addrlen) < 0) { - warn ("getsockname"); - return 1; - } + if (errsock != -1) { - if (listen (errsock, 1) < 0) { - warn ("listen"); - return 1; - } + addrlen = sizeof(erraddr); + if (getsockname (errsock, (struct sockaddr *)&erraddr, &addrlen) < 0) { + warn ("getsockname"); + return 1; + } - p = buf; - snprintf (p, sizeof(buf), "%u", ntohs(erraddr.sin_port)); - len = strlen(buf) + 1; - if(net_write (s, buf, len) != len) { - warn ("write"); + if (listen (errsock, 1) < 0) { + warn ("listen"); + return 1; + } + + p = buf; + snprintf (p, sizeof(buf), "%u", ntohs(erraddr.sin_port)); + len = strlen(buf) + 1; + if(net_write (s, buf, len) != len) { + warn ("write"); + close (errsock); + return 1; + } + + errsock2 = accept (errsock, NULL, NULL); + if (errsock2 < 0) { + warn ("accept"); + close (errsock); + return 1; + } close (errsock); - return 1; - } - errsock2 = accept (errsock, NULL, NULL); - if (errsock2 < 0) { - warn ("accept"); - close (errsock); - return 1; + } else { + if (net_write (s, "0", 2) != 2) { + warn ("write"); + return 1; + } + errsock2 = -1; } - close (errsock); if ((*auth_func)(s, thisaddr, thataddr, hostname, remote_user, local_user, @@ -494,7 +506,7 @@ doit_broken (int argc, struct hostent *hostent; struct sockaddr_in addr; - if (priv_socket1 < 0 || priv_socket2 < 0) { + if (priv_socket1 < 0) { warnx ("unable to bind reserved port: is rsh setuid root?"); return 1; } @@ -575,6 +587,7 @@ doit (const char *hostname, int port, const char *cmd, size_t cmd_len, + int do_errsock, int (*auth_func)(int s, struct sockaddr_in this, struct sockaddr_in that, const char *hostname, const char *remote_user, @@ -611,14 +624,18 @@ doit (const char *hostname, close (s); continue; } - errsock = socket (AF_INET, SOCK_STREAM, 0); - if (errsock < 0) - err (1, "socket"); - memset (&erraddr, 0, sizeof(erraddr)); - erraddr.sin_family = AF_INET; - erraddr.sin_addr.s_addr = INADDR_ANY; - if (bind (errsock, (struct sockaddr *)&erraddr, sizeof(erraddr)) < 0) - err (1, "bind"); + if (do_errsock) { + errsock = socket (AF_INET, SOCK_STREAM, 0); + if (errsock < 0) + err (1, "socket"); + memset (&erraddr, 0, sizeof(erraddr)); + erraddr.sin_family = AF_INET; + erraddr.sin_addr.s_addr = INADDR_ANY; + if (bind (errsock, (struct sockaddr *)&erraddr, + sizeof(erraddr)) < 0) + err (1, "bind"); + } else + errsock = -1; ret = proto (s, errsock, hostname, @@ -640,6 +657,7 @@ static char *port_str; static const char *user; static int do_version; static int do_help; +static int do_errsock = 1; struct getargs args[] = { #ifdef KRB4 @@ -662,6 +680,7 @@ struct getargs args[] = { "number-or-service" }, { "user", 'l', arg_string, &user, "Run as this user", NULL }, + { "stderr", 'e', arg_negative_flag, &do_errsock, "don't open stderr"}, { "version", 0, arg_flag, &do_version, "Print version", NULL }, { "help", 0, arg_flag, &do_help, NULL, @@ -787,6 +806,7 @@ main(int argc, char **argv) auth_method = AUTH_KRB5; ret = doit (host, user, local_user, tmp_port, cmd, cmd_len, + do_errsock, send_krb5_auth); } #ifdef KRB4 @@ -802,6 +822,7 @@ main(int argc, char **argv) auth_method = AUTH_KRB4; ret = doit (host, user, local_user, tmp_port, cmd, cmd_len, + do_errsock, send_krb4_auth); } #endif @@ -817,7 +838,7 @@ main(int argc, char **argv) user, local_user, tmp_port, priv_socket1, - priv_socket2, + do_errsock ? priv_socket2 : -1, cmd, cmd_len); } return ret;