summaryrefslogtreecommitdiffstats
path: root/libexec
diff options
context:
space:
mode:
authorpfg <pfg@FreeBSD.org>2016-02-26 20:02:01 +0000
committerpfg <pfg@FreeBSD.org>2016-02-26 20:02:01 +0000
commit7fc57610ab8240efeb317b4238b794843071bd52 (patch)
treea4f53a3e24416d815edd0f61fb3a38766d776e7f /libexec
parent2b2505105847aaf1f15cd907b714963f9b401e06 (diff)
downloadFreeBSD-src-7fc57610ab8240efeb317b4238b794843071bd52.zip
FreeBSD-src-7fc57610ab8240efeb317b4238b794843071bd52.tar.gz
rlogin(1): Replace select(2) with poll(2).
Obtanied from: NetBSD (CVS Rev. 1.27 - 1.28)
Diffstat (limited to 'libexec')
-rw-r--r--libexec/rlogind/rlogind.c66
1 files changed, 23 insertions, 43 deletions
diff --git a/libexec/rlogind/rlogind.c b/libexec/rlogind/rlogind.c
index d64d7bf..f054970 100644
--- a/libexec/rlogind/rlogind.c
+++ b/libexec/rlogind/rlogind.c
@@ -76,6 +76,7 @@ __FBSDID("$FreeBSD$");
#include <errno.h>
#include <libutil.h>
#include <paths.h>
+#include <poll.h>
#include <pwd.h>
#include <syslog.h>
#include <stdio.h>
@@ -350,34 +351,27 @@ protocol(int f, int p)
nfd = f + 1;
else
nfd = p + 1;
- if (nfd > FD_SETSIZE) {
- syslog(LOG_ERR, "select mask too small, increase FD_SETSIZE");
- fatal(f, "internal error (select mask too small)", 0);
- }
for (;;) {
- fd_set ibits, obits, ebits, *omask;
-
- FD_ZERO(&ebits);
- FD_ZERO(&ibits);
- FD_ZERO(&obits);
- omask = (fd_set *)NULL;
- if (fcc) {
- FD_SET(p, &obits);
- omask = &obits;
- } else
- FD_SET(f, &ibits);
+ struct pollfd set[2];
+
+ set[0].fd = p;
+ set[0].events = POLLPRI;
+ set[1].fd = f;
+ set[1].events = 0;
+ if (fcc)
+ set[0].events |= POLLOUT;
+ else
+ set[1].events |= POLLIN;
if (pcc >= 0) {
- if (pcc) {
- FD_SET(f, &obits);
- omask = &obits;
- } else
- FD_SET(p, &ibits);
+ if (pcc)
+ set[1].events |= POLLOUT;
+ else
+ set[0].events |= POLLIN;
}
- FD_SET(p, &ebits);
- if ((n = select(nfd, &ibits, omask, &ebits, 0)) < 0) {
+ if ((n = poll(set, 2, INFTIM)) < 0) {
if (errno == EINTR)
continue;
- fatal(f, "select", 1);
+ fatal(f, "poll", 1);
}
if (n == 0) {
/* shouldn't happen... */
@@ -385,18 +379,16 @@ protocol(int f, int p)
continue;
}
#define pkcontrol(c) ((c)&(TIOCPKT_FLUSHWRITE|TIOCPKT_NOSTOP|TIOCPKT_DOSTOP))
- if (FD_ISSET(p, &ebits)) {
+ if (set[0].revents & POLLPRI) {
cc = read(p, &cntl, 1);
if (cc == 1 && pkcontrol(cntl)) {
cntl |= oobdata[0];
send(f, &cntl, 1, MSG_OOB);
- if (cntl & TIOCPKT_FLUSHWRITE) {
+ if (cntl & TIOCPKT_FLUSHWRITE)
pcc = 0;
- FD_CLR(p, &ibits);
- }
}
}
- if (FD_ISSET(f, &ibits)) {
+ if (set[1].revents & POLLIN) {
fcc = read(f, fibuf, sizeof(fibuf));
if (fcc < 0 && errno == EWOULDBLOCK)
fcc = 0;
@@ -422,11 +414,10 @@ protocol(int f, int p)
goto top; /* n^2 */
}
}
- FD_SET(p, &obits); /* try write */
}
}
- if (FD_ISSET(p, &obits) && fcc > 0) {
+ if (set[0].revents & POLLOUT && fcc > 0) {
cc = write(p, fbp, fcc);
if (cc > 0) {
fcc -= cc;
@@ -434,7 +425,7 @@ protocol(int f, int p)
}
}
- if (FD_ISSET(p, &ibits)) {
+ if (set[0].revents & POLLIN) {
pcc = read(p, pibuf, sizeof (pibuf));
pbp = pibuf;
if (pcc < 0 && errno == EWOULDBLOCK)
@@ -443,7 +434,6 @@ protocol(int f, int p)
break;
else if (pibuf[0] == 0) {
pbp++, pcc--;
- FD_SET(f, &obits); /* try write */
} else {
if (pkcontrol(pibuf[0])) {
pibuf[0] |= oobdata[0];
@@ -452,18 +442,8 @@ protocol(int f, int p)
pcc = 0;
}
}
- if ((FD_ISSET(f, &obits)) && pcc > 0) {
+ if (set[1].revents & POLLOUT && pcc > 0) {
cc = write(f, pbp, pcc);
- if (cc < 0 && errno == EWOULDBLOCK) {
- /*
- * This happens when we try write after read
- * from p, but some old kernels balk at large
- * writes even when select returns true.
- */
- if (!FD_ISSET(p, &ibits))
- sleep(5);
- continue;
- }
if (cc > 0) {
pcc -= cc;
pbp += cc;
OpenPOWER on IntegriCloud