version 1.23, 2001/07/03 23:47:05 |
version 1.24, 2001/09/04 23:35:59 |
|
|
|
|
void catch_child __P((int)); |
void catch_child __P((int)); |
void copytochild __P((int)); |
void copytochild __P((int)); |
__dead void doit __P((int)); |
__dead void doit __P((sigset_t *)); |
__dead void done __P((int)); |
__dead void done __P((int)); |
void echo __P((char)); |
void echo __P((char)); |
u_int getescape __P((char *)); |
u_int getescape __P((char *)); |
|
|
void mode __P((int)); |
void mode __P((int)); |
void msg __P((char *)); |
void msg __P((char *)); |
void oob __P((int)); |
void oob __P((int)); |
int reader __P((int)); |
int reader __P((sigset_t *)); |
void sendwindow __P((void)); |
void sendwindow __P((void)); |
void setsignal __P((int)); |
void setsignal __P((int)); |
void sigwinch __P((int)); |
void sigwinch __P((int)); |
|
|
struct passwd *pw; |
struct passwd *pw; |
struct servent *sp; |
struct servent *sp; |
struct termios tty; |
struct termios tty; |
int omask; |
sigset_t mask, omask; |
int argoff, ch, dflag, one, uid; |
int argoff, ch, dflag, one, uid; |
char *host, *p, *user, term[64]; |
char *host, *p, *user, term[64]; |
struct sockaddr_storage ss; |
struct sockaddr_storage ss; |
|
|
|
|
(void)signal(SIGPIPE, lostpeer); |
(void)signal(SIGPIPE, lostpeer); |
/* will use SIGUSR1 for window size hack, so hold it off */ |
/* will use SIGUSR1 for window size hack, so hold it off */ |
omask = sigblock(sigmask(SIGURG) | sigmask(SIGUSR1)); |
sigemptyset(&mask); |
|
sigaddset(&mask, SIGURG); |
|
sigaddset(&mask, SIGUSR1); |
|
sigprocmask(SIG_BLOCK, &mask, &omask); |
/* |
/* |
* We set SIGURG and SIGUSR1 below so that an |
* We set SIGURG and SIGUSR1 below so that an |
* incoming signal will be held pending rather than being |
* incoming signal will be held pending rather than being |
|
|
|
|
(void)seteuid(uid); |
(void)seteuid(uid); |
(void)setuid(uid); |
(void)setuid(uid); |
doit(omask); |
doit(&omask); |
/*NOTREACHED*/ |
/*NOTREACHED*/ |
|
|
return 0; |
return 0; |
|
|
|
|
void |
void |
doit(omask) |
doit(omask) |
int omask; |
sigset_t *omask; |
{ |
{ |
struct sigaction sa; |
struct sigaction sa; |
|
|
|
|
* signals to the child. We can now unblock SIGURG and SIGUSR1 |
* signals to the child. We can now unblock SIGURG and SIGUSR1 |
* that were set above. |
* that were set above. |
*/ |
*/ |
(void)sigsetmask(omask); |
(void)sigprocmask(SIG_SETMASK, omask, NULL); |
writer(); |
writer(); |
msg("closed connection."); |
msg("closed connection."); |
done(0); |
done(0); |
|
|
setsignal(sig) |
setsignal(sig) |
int sig; |
int sig; |
{ |
{ |
int omask = sigblock(sigmask(sig)); |
sigset_t mask, omask; |
|
|
|
sigemptyset(&mask); |
|
sigaddset(&mask, sig); |
|
sigprocmask(SIG_BLOCK, &mask, &omask); |
|
|
if (signal(sig, exit) == SIG_IGN) |
if (signal(sig, exit) == SIG_IGN) |
(void)signal(sig, SIG_IGN); |
(void)signal(sig, SIG_IGN); |
(void)sigsetmask(omask); |
|
|
sigprocmask(SIG_SETMASK, &omask, NULL); |
} |
} |
|
|
__dead void |
__dead void |
|
|
/* reader: read from remote: line -> 1 */ |
/* reader: read from remote: line -> 1 */ |
int |
int |
reader(omask) |
reader(omask) |
int omask; |
sigset_t *omask; |
{ |
{ |
pid_t pid; |
pid_t pid; |
int n, remaining; |
int n, remaining; |
|
|
ppid = getppid(); |
ppid = getppid(); |
(void)fcntl(rem, F_SETOWN, pid); |
(void)fcntl(rem, F_SETOWN, pid); |
(void)setjmp(rcvtop); |
(void)setjmp(rcvtop); |
(void)sigsetmask(omask); |
(void)sigprocmask(SIG_SETMASK, omask, NULL); |
bufp = rcvbuf; |
bufp = rcvbuf; |
for (;;) { |
for (;;) { |
while ((remaining = rcvcnt - (bufp - rcvbuf)) > 0) { |
while ((remaining = rcvcnt - (bufp - rcvbuf)) > 0) { |