frogbak
view release on metacpan or search on metacpan
talk(nflag, omask, pid, rem, timeout_seconds, timeout_message)
int nflag, pid;
long omask;
register int rem;
int timeout_seconds;
char *timeout_message;
{
register int cc, wc;
register char *bp;
struct timeval timeout;
int readfrom, ready, rembits;
int select_return;
char buf[BUFSIZ];
if (!nflag && pid == 0) {
(void)close(rfd2);
reread: errno = 0;
if ((cc = read(0, buf, sizeof buf)) <= 0)
goto done;
bp = buf;
rewrite: rembits = 1 << rem;
if (select(16, 0, &rembits, 0, 0) < 0) {
if (errno != EINTR) {
(void)fprintf(stderr,
"rsh: select: %s.\n", strerror(errno));
exit(1);
}
goto rewrite;
}
if ((rembits & (1 << rem)) == 0)
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);
}
timeout.tv_sec = timeout_seconds;
timeout.tv_usec = 0;
(void)sigsetmask(omask);
readfrom = (1 << rfd2) | (1 << rem);
do {
ready = readfrom;
if (timeout_seconds) {
select_return = select(16, &ready, 0, 0, &timeout);
} else {
select_return = select(16, &ready, 0, 0, 0);
}
if (select_return < 0) {
if (errno != EINTR) {
(void)fprintf(stderr,
"rsh: select: %s.\n", strerror(errno));
exit(1);
}
continue;
}
if (select_return == 0) {
(void)fprintf(stderr,
"rsh: timeout reached (after %d seconds)\n",
timeout.tv_sec);
if (timeout_message != NULL)
write(1, timeout_message, strlen(timeout_message));
exit(1);
}
if (ready & (1 << rfd2)) {
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)
readfrom &= ~(1 << rfd2);
} else
(void)write(2, buf, cc);
}
if (ready & (1 << rem)) {
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)
readfrom &= ~(1 << rem);
} else
(void)write(1, buf, cc);
}
} while (readfrom);
}
void
( run in 1.116 second using v1.01-cache-2.11-cpan-99c4e6809bf )