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:
@@ -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;
|
||||||
|
Reference in New Issue
Block a user