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
This commit is contained in:
Assar Westerlund
1999-06-23 04:09:22 +00:00
parent df89e94af0
commit 12fe2d3582

View File

@@ -60,14 +60,16 @@ static int
loop (int s, int errsock) loop (int s, int errsock)
{ {
fd_set real_readset; fd_set real_readset;
int count = 2; int count = 1;
FD_ZERO(&real_readset); FD_ZERO(&real_readset);
FD_SET(s, &real_readset); FD_SET(s, &real_readset);
FD_SET(errsock, &real_readset); if (errsock != -1) {
if(input) { FD_SET(errsock, &real_readset);
FD_SET(STDIN_FILENO, &real_readset); ++count;
} }
if(input)
FD_SET(STDIN_FILENO, &real_readset);
for (;;) { for (;;) {
int ret; int ret;
@@ -94,7 +96,7 @@ loop (int s, int errsock)
} else } else
net_write (STDOUT_FILENO, buf, ret); 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)); ret = do_read (errsock, buf, sizeof(buf));
if (ret < 0) if (ret < 0)
err (1, "read"); err (1, "read");
@@ -397,33 +399,43 @@ proto (int s, int errsock,
return 1; return 1;
} }
addrlen = sizeof(erraddr); if (errsock != -1) {
if (getsockname (errsock, (struct sockaddr *)&erraddr, &addrlen) < 0) {
warn ("getsockname");
return 1;
}
if (listen (errsock, 1) < 0) { addrlen = sizeof(erraddr);
warn ("listen"); if (getsockname (errsock, (struct sockaddr *)&erraddr, &addrlen) < 0) {
return 1; warn ("getsockname");
} return 1;
}
p = buf; if (listen (errsock, 1) < 0) {
snprintf (p, sizeof(buf), "%u", ntohs(erraddr.sin_port)); warn ("listen");
len = strlen(buf) + 1; return 1;
if(net_write (s, buf, len) != len) { }
warn ("write");
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); close (errsock);
return 1;
}
errsock2 = accept (errsock, NULL, NULL); } else {
if (errsock2 < 0) { if (net_write (s, "0", 2) != 2) {
warn ("accept"); warn ("write");
close (errsock); return 1;
return 1; }
errsock2 = -1;
} }
close (errsock);
if ((*auth_func)(s, thisaddr, thataddr, hostname, if ((*auth_func)(s, thisaddr, thataddr, hostname,
remote_user, local_user, remote_user, local_user,
@@ -494,7 +506,7 @@ doit_broken (int argc,
struct hostent *hostent; struct hostent *hostent;
struct sockaddr_in addr; 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?"); warnx ("unable to bind reserved port: is rsh setuid root?");
return 1; return 1;
} }
@@ -575,6 +587,7 @@ doit (const char *hostname,
int port, int port,
const char *cmd, const char *cmd,
size_t cmd_len, size_t cmd_len,
int do_errsock,
int (*auth_func)(int s, int (*auth_func)(int s,
struct sockaddr_in this, struct sockaddr_in that, struct sockaddr_in this, struct sockaddr_in that,
const char *hostname, const char *remote_user, const char *hostname, const char *remote_user,
@@ -611,14 +624,18 @@ doit (const char *hostname,
close (s); close (s);
continue; continue;
} }
errsock = socket (AF_INET, SOCK_STREAM, 0); if (do_errsock) {
if (errsock < 0) errsock = socket (AF_INET, SOCK_STREAM, 0);
err (1, "socket"); if (errsock < 0)
memset (&erraddr, 0, sizeof(erraddr)); err (1, "socket");
erraddr.sin_family = AF_INET; memset (&erraddr, 0, sizeof(erraddr));
erraddr.sin_addr.s_addr = INADDR_ANY; erraddr.sin_family = AF_INET;
if (bind (errsock, (struct sockaddr *)&erraddr, sizeof(erraddr)) < 0) erraddr.sin_addr.s_addr = INADDR_ANY;
err (1, "bind"); if (bind (errsock, (struct sockaddr *)&erraddr,
sizeof(erraddr)) < 0)
err (1, "bind");
} else
errsock = -1;
ret = proto (s, errsock, ret = proto (s, errsock,
hostname, hostname,
@@ -640,6 +657,7 @@ static char *port_str;
static const char *user; static const char *user;
static int do_version; static int do_version;
static int do_help; static int do_help;
static int do_errsock = 1;
struct getargs args[] = { struct getargs args[] = {
#ifdef KRB4 #ifdef KRB4
@@ -662,6 +680,7 @@ struct getargs args[] = {
"number-or-service" }, "number-or-service" },
{ "user", 'l', arg_string, &user, "Run as this user", { "user", 'l', arg_string, &user, "Run as this user",
NULL }, NULL },
{ "stderr", 'e', arg_negative_flag, &do_errsock, "don't open stderr"},
{ "version", 0, arg_flag, &do_version, "Print version", { "version", 0, arg_flag, &do_version, "Print version",
NULL }, NULL },
{ "help", 0, arg_flag, &do_help, NULL, { "help", 0, arg_flag, &do_help, NULL,
@@ -787,6 +806,7 @@ main(int argc, char **argv)
auth_method = AUTH_KRB5; auth_method = AUTH_KRB5;
ret = doit (host, user, local_user, tmp_port, cmd, cmd_len, ret = doit (host, user, local_user, tmp_port, cmd, cmd_len,
do_errsock,
send_krb5_auth); send_krb5_auth);
} }
#ifdef KRB4 #ifdef KRB4
@@ -802,6 +822,7 @@ main(int argc, char **argv)
auth_method = AUTH_KRB4; auth_method = AUTH_KRB4;
ret = doit (host, user, local_user, tmp_port, cmd, cmd_len, ret = doit (host, user, local_user, tmp_port, cmd, cmd_len,
do_errsock,
send_krb4_auth); send_krb4_auth);
} }
#endif #endif
@@ -817,7 +838,7 @@ main(int argc, char **argv)
user, local_user, user, local_user,
tmp_port, tmp_port,
priv_socket1, priv_socket1,
priv_socket2, do_errsock ? priv_socket2 : -1,
cmd, cmd_len); cmd, cmd_len);
} }
return ret; return ret;