version 1.16, 1997/08/06 06:43:41 |
version 1.17, 1998/03/25 19:53:21 |
|
|
#include <pwd.h> |
#include <pwd.h> |
#include <signal.h> |
#include <signal.h> |
#include <stdio.h> |
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <unistd.h> |
#include <errno.h> |
#include <errno.h> |
#include <string.h> |
#include <string.h> |
#ifdef __STDC__ |
#ifdef __STDC__ |
|
|
char dst_realm_buf[REALM_SZ], *dest_realm; |
char dst_realm_buf[REALM_SZ], *dest_realm; |
|
|
void warning __P((const char *, ...)); |
void warning __P((const char *, ...)); |
|
void desrw_set_key __P((des_cblock *, des_key_schedule *)); |
|
int des_read __P((int, char *, int)); |
|
int des_write __P((int, char *, int)); |
|
|
|
int krcmd __P((char **, u_short, char *, char *, int *, char *)); |
|
int krcmd_mutual __P((char **, u_short, char *, char *, int *, char *, |
|
CREDENTIALS *, Key_schedule)); |
#endif |
#endif |
|
|
|
void usage __P((void)); |
|
|
|
void talk __P((int, int, int, register int)); |
|
|
/* |
/* |
* rsh - remote shell |
* rsh - remote shell |
*/ |
*/ |
extern int errno; |
extern int errno; |
int rfd2; |
int rfd2; |
|
|
|
int |
main(argc, argv) |
main(argc, argv) |
int argc; |
int argc; |
char **argv; |
char **argv; |
|
|
struct passwd *pw; |
struct passwd *pw; |
struct servent *sp; |
struct servent *sp; |
int omask; |
int omask; |
int argoff, asrsh, ch, dflag, nflag, one, pid, rem, uid; |
int argoff, asrsh, ch, dflag, nflag, one, pid = 0, rem, uid; |
register char *p; |
register char *p; |
char *args, *host, *user, *copyargs(); |
char *args, *host, *user, *copyargs(); |
void sendsig(); |
void sendsig(); |
|
|
host = user = NULL; |
host = user = NULL; |
|
|
/* if called as something other than "rsh", use it as the host name */ |
/* if called as something other than "rsh", use it as the host name */ |
if (p = strrchr(argv[0], '/')) |
if ((p = strrchr(argv[0], '/'))) |
++p; |
++p; |
else |
else |
p = argv[0]; |
p = argv[0]; |
|
|
#ifdef KERBEROS |
#ifdef KERBEROS |
case 'x': |
case 'x': |
doencrypt = 1; |
doencrypt = 1; |
desrw_set_key(&cred.session, schedule); |
desrw_set_key(&cred.session, &schedule); |
break; |
break; |
#endif |
#endif |
case '?': |
case '?': |
|
|
|
|
if (!nflag) |
if (!nflag) |
(void)kill(pid, SIGKILL); |
(void)kill(pid, SIGKILL); |
exit(0); |
|
|
return 0; |
} |
} |
|
|
|
void |
talk(nflag, omask, pid, rem) |
talk(nflag, omask, pid, rem) |
int nflag, pid; |
int nflag, pid; |
int omask; |
int omask; |
|
|
{ |
{ |
register int cc, wc; |
register int cc, wc; |
register char *bp; |
register char *bp; |
int readfrom, ready, rembits; |
fd_set readfrom, ready, rembits; |
char buf[BUFSIZ]; |
char buf[BUFSIZ]; |
|
|
if (!nflag && pid == 0) { |
if (!nflag && pid == 0) { |
|
|
goto done; |
goto done; |
bp = buf; |
bp = buf; |
|
|
rewrite: rembits = 1 << rem; |
rewrite: FD_ZERO(&rembits); |
|
FD_SET(rem, &rembits); |
if (select(rem + 1, 0, &rembits, 0, 0) < 0) { |
if (select(rem + 1, 0, &rembits, 0, 0) < 0) { |
if (errno != EINTR) { |
if (errno != EINTR) { |
(void)fprintf(stderr, |
(void)fprintf(stderr, |
|
|
} |
} |
goto rewrite; |
goto rewrite; |
} |
} |
if ((rembits & (1 << rem)) == 0) |
if (!FD_ISSET(rem, &rembits)) |
goto rewrite; |
goto rewrite; |
#ifdef KERBEROS |
#ifdef KERBEROS |
if (doencrypt) |
if (doencrypt) |
|
|
} |
} |
|
|
(void)sigsetmask(omask); |
(void)sigsetmask(omask); |
readfrom = (1 << rfd2) | (1 << rem); |
FD_ZERO(&readfrom); |
|
FD_SET(rfd2, &readfrom); |
|
FD_SET(rem, &readfrom); |
do { |
do { |
ready = readfrom; |
FD_COPY(&readfrom, &ready); |
if (select(MAX(rfd2, rem) + 1, &ready, 0, 0, 0) < 0) { |
if (select(MAX(rfd2, rem) + 1, &ready, 0, 0, 0) < 0) { |
if (errno != EINTR) { |
if (errno != EINTR) { |
(void)fprintf(stderr, |
(void)fprintf(stderr, |
|
|
} |
} |
continue; |
continue; |
} |
} |
if (ready & (1 << rfd2)) { |
if (FD_ISSET(rfd2, &ready)) { |
errno = 0; |
errno = 0; |
#ifdef KERBEROS |
#ifdef KERBEROS |
if (doencrypt) |
if (doencrypt) |
|
|
cc = read(rfd2, buf, sizeof buf); |
cc = read(rfd2, buf, sizeof buf); |
if (cc <= 0) { |
if (cc <= 0) { |
if (errno != EWOULDBLOCK) |
if (errno != EWOULDBLOCK) |
readfrom &= ~(1 << rfd2); |
FD_CLR(rfd2, &readfrom); |
} else |
} else |
(void)write(2, buf, cc); |
(void)write(2, buf, cc); |
} |
} |
if (ready & (1 << rem)) { |
if (FD_ISSET(rem, &ready)) { |
errno = 0; |
errno = 0; |
#ifdef KERBEROS |
#ifdef KERBEROS |
if (doencrypt) |
if (doencrypt) |
|
|
cc = read(rem, buf, sizeof buf); |
cc = read(rem, buf, sizeof buf); |
if (cc <= 0) { |
if (cc <= 0) { |
if (errno != EWOULDBLOCK) |
if (errno != EWOULDBLOCK) |
readfrom &= ~(1 << rem); |
FD_CLR(rem, &readfrom); |
} else |
} else |
(void)write(1, buf, cc); |
(void)write(1, buf, cc); |
} |
} |
} while (readfrom); |
} while (FD_ISSET(rem, &readfrom) || FD_ISSET(rfd2, &readfrom)); |
} |
} |
|
|
void |
void |
|
|
return(args); |
return(args); |
} |
} |
|
|
usage() |
void |
|
usage(void) |
{ |
{ |
(void)fprintf(stderr, |
(void)fprintf(stderr, |
"usage: rsh [-nd%s]%s[-l login] host [command]\n", |
"usage: rsh [-nd%s]%s[-l login] host [command]\n", |