frogbak

 view release on metacpan or  search on metacpan

rsh.c  view on Meta::CPAN


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 )