frogbak
view release on metacpan or search on metacpan
rsh.c.freebsd view on Meta::CPAN
exit(0);
}
void
talk(nflag, omask, pid, rem, timeout)
int nflag;
long omask;
pid_t pid;
int rem;
{
int cc, wc;
fd_set readfrom, ready, rembits;
char *bp, buf[BUFSIZ];
struct timeval tvtimeout;
int srval;
if (!nflag && pid == 0) {
(void)close(rfd2);
reread: errno = 0;
if ((cc = read(0, buf, sizeof buf)) <= 0)
goto done;
bp = buf;
rewrite:
FD_ZERO(&rembits);
FD_SET(rem, &rembits);
if (select(16, 0, &rembits, 0, 0) < 0) {
if (errno != EINTR)
err(1, "select");
goto rewrite;
}
if (!FD_ISSET(rem, &rembits))
goto rewrite;
#ifdef KERBEROS
#ifdef CRYPT
if (doencrypt)
wc = des_write(rem, bp, cc);
else
#endif
#endif
wc = write(rem, bp, cc);
if (wc < 0) {
if (errno == EWOULDBLOCK)
goto rewrite;
goto done;
}
bp += wc;
cc -= wc;
if (cc == 0)
goto reread;
goto rewrite;
done:
(void)shutdown(rem, 1);
exit(0);
}
tvtimeout.tv_sec = timeout;
tvtimeout.tv_usec = 0;
(void)sigsetmask(omask);
FD_ZERO(&readfrom);
FD_SET(rfd2, &readfrom);
FD_SET(rem, &readfrom);
do {
ready = readfrom;
if (timeout) {
srval = select(16, &ready, 0, 0, &tvtimeout);
} else {
srval = select(16, &ready, 0, 0, 0);
}
if (srval < 0) {
if (errno != EINTR)
err(1, "select");
continue;
}
if (srval == 0)
errx(1, "timeout reached (%d seconds)\n", timeout);
if (FD_ISSET(rfd2, &ready)) {
errno = 0;
#ifdef KERBEROS
#ifdef CRYPT
if (doencrypt)
cc = des_read(rfd2, buf, sizeof buf);
else
#endif
#endif
cc = read(rfd2, buf, sizeof buf);
if (cc <= 0) {
if (errno != EWOULDBLOCK)
FD_CLR(rfd2, &readfrom);
} else
(void)write(2, buf, cc);
}
if (FD_ISSET(rem, &ready)) {
errno = 0;
#ifdef KERBEROS
#ifdef CRYPT
if (doencrypt)
cc = des_read(rem, buf, sizeof buf);
else
#endif
#endif
cc = read(rem, buf, sizeof buf);
if (cc <= 0) {
if (errno != EWOULDBLOCK)
FD_CLR(rem, &readfrom);
} else
(void)write(1, buf, cc);
}
} while (FD_ISSET(rfd2, &readfrom) || FD_ISSET(rem, &readfrom));
}
void
sendsig(sig)
int sig;
{
char signo;
signo = sig;
( run in 2.045 seconds using v1.01-cache-2.11-cpan-5511b514fd6 )