static char sccsid
[] = "@(#)rsh.c 4.12 85/04/24";
char *index(), *rindex(), *malloc(), *getpass(), *sprintf(), *strcpy();
struct passwd
*getpwuid();
#define mask(s) (1 << ((s) - 1))
char *host
, *cp
, **ap
, buf
[BUFSIZ
], *args
, **argv
= argv0
, *user
= 0;
host
= rindex(argv
[0], '/');
if (!strcmp(host
, "rsh")) {
if (argc
> 0 && !strcmp(*argv
, "-l")) {
if (argc
> 0 && !strcmp(*argv
, "-n")) {
(void) open("/dev/null", 0);
if (argc
> 0 && !strcmp(*argv
, "-d")) {
* Ignore the -w, -e and -8 flags to allow aliases with rlogin
if (argc
> 0 && !strncmp(*argv
, "-w", 2)) {
if (argc
> 0 && !strncmp(*argv
, "-e", 2)) {
if (argc
> 0 && !strncmp(*argv
, "-8", 2)) {
execv("/usr/ucb/rlogin", argv0
);
perror("/usr/ucb/rlogin");
pwd
= getpwuid(getuid());
fprintf(stderr
, "who are you?\n");
for (ap
= argv
; *ap
; ap
++)
for (ap
= argv
; *ap
; ap
++) {
sp
= getservbyname("shell", "tcp");
fprintf(stderr
, "rsh: shell/tcp: unknown service\n");
rem
= rcmd(&host
, sp
->s_port
, pwd
->pw_name
,
user
? user
: pwd
->pw_name
, args
, &rfd2
);
fprintf(stderr
, "rsh: can't establish stderr\n");
if (options
& SO_DEBUG
) {
if (setsockopt(rem
, SOL_SOCKET
, SO_DEBUG
, &one
, sizeof (one
)) < 0)
perror("setsockopt (stdin)");
if (setsockopt(rfd2
, SOL_SOCKET
, SO_DEBUG
, &one
, sizeof (one
)) < 0)
perror("setsockopt (stderr)");
omask
= sigblock(mask(SIGINT
)|mask(SIGQUIT
)|mask(SIGTERM
));
signal(SIGQUIT
, sendsig
);
signal(SIGTERM
, sendsig
);
ioctl(rfd2
, FIONBIO
, &one
);
ioctl(rem
, FIONBIO
, &one
);
char *bp
; int rembits
, wc
;
cc
= read(0, buf
, sizeof buf
);
if (select(16, 0, &rembits
, 0, 0) < 0) {
if ((rembits
& (1<<rem
)) == 0)
if (errno
== EWOULDBLOCK
)
readfrom
= (1<<rfd2
) | (1<<rem
);
if (select(16, &ready
, 0, 0, 0) < 0) {
cc
= read(rfd2
, buf
, sizeof buf
);
if (errno
!= EWOULDBLOCK
)
(void) write(2, buf
, cc
);
cc
= read(rem
, buf
, sizeof buf
);
if (errno
!= EWOULDBLOCK
)
(void) write(1, buf
, cc
);
(void) kill(pid
, SIGKILL
);
"usage: rsh host [ -l login ] [ -p passwd ] command\n");
(void) write(rfd2
, &signo
, 1);