version 1.33, 2003/08/11 20:10:00 |
version 1.34, 2003/08/11 20:43:31 |
|
|
#include <sys/file.h> |
#include <sys/file.h> |
|
|
#include <netinet/in.h> |
#include <netinet/in.h> |
#include <netdb.h> |
|
|
|
|
#include <err.h> |
|
#include <errno.h> |
|
#include <netdb.h> |
|
#include <poll.h> |
#include <pwd.h> |
#include <pwd.h> |
#include <signal.h> |
#include <signal.h> |
|
#include <stdarg.h> |
#include <stdio.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdlib.h> |
#include <unistd.h> |
|
#include <errno.h> |
|
#include <err.h> |
|
#include <string.h> |
#include <string.h> |
#include <stdarg.h> |
#include <unistd.h> |
|
|
#include "pathnames.h" |
#include "pathnames.h" |
|
|
#ifdef KERBEROS |
#ifdef KERBEROS |
|
|
{ |
{ |
int cc, wc; |
int cc, wc; |
char *bp; |
char *bp; |
fd_set readfrom, ready, rembits; |
struct pollfd pfd[2]; |
char buf[BUFSIZ]; |
char buf[BUFSIZ]; |
|
|
if (!nflag && pid == 0) { |
if (!nflag && pid == 0) { |
(void)close(rfd2); |
(void)close(rfd2); |
|
|
reread: errno = 0; |
reread: errno = 0; |
if ((cc = read(0, buf, sizeof buf)) <= 0) |
if ((cc = read(STDIN_FILENO, buf, sizeof buf)) <= 0) |
goto done; |
goto done; |
bp = buf; |
bp = buf; |
|
|
rewrite: FD_ZERO(&rembits); |
pfd[0].fd = rem; |
if (rem >= FD_SETSIZE) |
pfd[0].events = POLLOUT; |
errx(1, "descriptor too large"); |
rewrite: |
FD_SET(rem, &rembits); |
if (poll(pfd, 1, INFTIM) < 0) { |
if (select(rem + 1, 0, &rembits, 0, 0) < 0) { |
|
if (errno != EINTR) |
if (errno != EINTR) |
err(1, "select"); |
err(1, "poll"); |
goto rewrite; |
goto rewrite; |
} |
} |
if (!FD_ISSET(rem, &rembits)) |
|
goto rewrite; |
|
#ifdef KERBEROS |
#ifdef KERBEROS |
if (doencrypt) |
if (doencrypt) |
wc = des_write(rem, bp, cc); |
wc = des_write(rem, bp, cc); |
|
|
} |
} |
|
|
sigprocmask(SIG_SETMASK, omask, NULL); |
sigprocmask(SIG_SETMASK, omask, NULL); |
FD_ZERO(&readfrom); |
pfd[1].fd = rfd2; |
if (rfd2 >= FD_SETSIZE) |
pfd[1].events = POLLIN; |
errx(1, "descriptor too large"); |
pfd[0].fd = rem; |
FD_SET(rfd2, &readfrom); |
pfd[0].events = POLLIN; |
if (rem >= FD_SETSIZE) |
|
errx(1, "descriptor too large"); |
|
FD_SET(rem, &readfrom); |
|
do { |
do { |
FD_COPY(&readfrom, &ready); |
if (poll(pfd, 2, INFTIM) < 0) { |
if (select(MAX(rfd2, rem) + 1, &ready, 0, 0, 0) < 0) { |
|
if (errno != EINTR) |
if (errno != EINTR) |
err(1, "select"); |
err(1, "poll"); |
continue; |
continue; |
} |
} |
if (FD_ISSET(rfd2, &ready)) { |
if (pfd[1].revents & POLLIN) { |
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) |
FD_CLR(rfd2, &readfrom); |
pfd[1].revents = 0; |
} else |
} else |
(void)write(2, buf, cc); |
(void)write(STDERR_FILENO, buf, cc); |
} |
} |
if (FD_ISSET(rem, &ready)) { |
if (pfd[0].revents & POLLIN) { |
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) |
FD_CLR(rem, &readfrom); |
pfd[0].revents = 0; |
} else |
} else |
(void)write(1, buf, cc); |
(void)write(STDOUT_FILENO, buf, cc); |
} |
} |
} while (FD_ISSET(rem, &readfrom) || FD_ISSET(rfd2, &readfrom)); |
} while ((pfd[0].revents & POLLIN) || (pfd[1].revents & POLLIN)); |
} |
} |
|
|
void |
void |