summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTodd C. Miller <millert@cvs.openbsd.org>2013-04-21 09:51:25 +0000
committerTodd C. Miller <millert@cvs.openbsd.org>2013-04-21 09:51:25 +0000
commit2404307084124a76a19c053871bbbfaf4979a202 (patch)
tree93b153bf1b4f4b885608fa10197e81e8b3406c1e
parentaad99ea5808d938de3e6f5a8f103cd68bc6a7ad9 (diff)
Convert select() to poll(). OK deraadt@
-rw-r--r--usr.bin/telnet/network.c26
-rw-r--r--usr.bin/telnet/sys_bsd.c106
-rw-r--r--usr.bin/telnet/telnet_locl.h4
-rw-r--r--usr.bin/telnet/tn3270.c26
-rw-r--r--usr.bin/telnet/utilities.c24
5 files changed, 67 insertions, 119 deletions
diff --git a/usr.bin/telnet/network.c b/usr.bin/telnet/network.c
index 3f0af179a06..6aa2f2aebcf 100644
--- a/usr.bin/telnet/network.c
+++ b/usr.bin/telnet/network.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: network.c,v 1.8 2003/06/03 02:56:18 millert Exp $ */
+/* $OpenBSD: network.c,v 1.9 2013/04/21 09:51:24 millert Exp $ */
/* $NetBSD: network.c,v 1.5 1996/02/28 21:04:06 thorpej Exp $ */
/*
@@ -61,34 +61,24 @@ init_network()
int
stilloob()
{
- static struct timeval timeout = { 0 };
- fd_set *fdsp;
- int fdsn;
+ struct pollfd pfd[1];
int value;
- fdsn = howmany(net+1, NFDBITS) * sizeof(fd_mask);
- if ((fdsp = (fd_set *)malloc(fdsn)) == NULL)
- err(1, "malloc");
-
do {
- memset(fdsp, 0, fdsn);
- FD_SET(net, fdsp);
- value = select(net+1, (fd_set *)0, (fd_set *)0, fdsp, &timeout);
+ pfd[0].fd = net;
+ pfd[0].events = POLLRDBAND;
+ value = poll(pfd, 1, 0);
} while ((value == -1) && (errno == EINTR));
if (value < 0) {
- perror("select");
- free(fdsp);
+ perror("poll");
(void) quit();
/* NOTREACHED */
}
- if (FD_ISSET(net, fdsp)) {
- free(fdsp);
+ if (pfd[0].revents & POLLRDBAND)
return 1;
- } else {
- free(fdsp);
+ else
return 0;
- }
}
diff --git a/usr.bin/telnet/sys_bsd.c b/usr.bin/telnet/sys_bsd.c
index 126742f0589..b9d23eb3eb0 100644
--- a/usr.bin/telnet/sys_bsd.c
+++ b/usr.bin/telnet/sys_bsd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sys_bsd.c,v 1.14 2003/06/03 02:56:18 millert Exp $ */
+/* $OpenBSD: sys_bsd.c,v 1.15 2013/04/21 09:51:24 millert Exp $ */
/* $NetBSD: sys_bsd.c,v 1.11 1996/02/28 21:04:10 thorpej Exp $ */
/*
@@ -43,6 +43,11 @@ int
tin, /* Input file descriptor */
net;
+#define TELNET_FD_TOUT 0
+#define TELNET_FD_TIN 1
+#define TELNET_FD_NET 2
+#define TELNET_FD_NUM 3
+
#ifndef USE_TERMIO
struct tchars otc = { 0 }, ntc = { 0 };
struct ltchars oltc = { 0 }, nltc = { 0 };
@@ -85,9 +90,6 @@ extern struct termios new_tc;
# endif
#endif /* USE_TERMIO */
-fd_set *ibitsp, *obitsp, *xbitsp;
-int fdsn;
-
void
init_sys()
{
@@ -961,8 +963,8 @@ sys_telnet_init()
*/
int
-process_rings(netin, netout, netex, ttyin, ttyout, poll)
- int poll; /* If 0, then block until something to do */
+process_rings(netin, netout, netex, ttyin, ttyout, dopoll)
+ int dopoll; /* If 0, then block until something to do */
{
int c;
/* One wants to be a bit careful about setting returnValue
@@ -971,49 +973,34 @@ process_rings(netin, netout, netex, ttyin, ttyout, poll)
* time (TN3270 mode only).
*/
int returnValue = 0;
- static struct timeval TimeValue = { 0 };
- int maxfd = -1;
- int tmp;
-
- if ((netout || netin || netex) && net > maxfd)
- maxfd = net;
- if (ttyout && tout > maxfd)
- maxfd = tout;
- if (ttyin && tin > maxfd)
- maxfd = tin;
- tmp = howmany(maxfd+1, NFDBITS) * sizeof(fd_mask);
- if (tmp > fdsn) {
- if (ibitsp)
- free(ibitsp);
- if (obitsp)
- free(obitsp);
- if (xbitsp)
- free(xbitsp);
- fdsn = tmp;
- if ((ibitsp = (fd_set *)malloc(fdsn)) == NULL)
- err(1, "malloc");
- if ((obitsp = (fd_set *)malloc(fdsn)) == NULL)
- err(1, "malloc");
- if ((xbitsp = (fd_set *)malloc(fdsn)) == NULL)
- err(1, "malloc");
- memset(ibitsp, 0, fdsn);
- memset(obitsp, 0, fdsn);
- memset(xbitsp, 0, fdsn);
+ struct pollfd pfd[TELNET_FD_NUM];
+
+ if (ttyout) {
+ pfd[TELNET_FD_TOUT].fd = tout;
+ pfd[TELNET_FD_TOUT].events = POLLOUT;
+ } else {
+ pfd[TELNET_FD_TOUT].fd = -1;
+ }
+ if (ttyin) {
+ pfd[TELNET_FD_TIN].fd = tin;
+ pfd[TELNET_FD_TIN].events = POLLIN;
+ } else {
+ pfd[TELNET_FD_TIN].fd = -1;
+ }
+ if (netout || netin || netex) {
+ pfd[TELNET_FD_NET].fd = net;
+ pfd[TELNET_FD_NET].events = 0;
+ if (netout)
+ pfd[TELNET_FD_NET].events |= POLLOUT;
+ if (netin)
+ pfd[TELNET_FD_NET].events |= POLLIN;
+ if (netex)
+ pfd[TELNET_FD_NET].events |= POLLRDBAND;
+ } else {
+ pfd[TELNET_FD_NET].fd = -1;
}
- if (netout)
- FD_SET(net, obitsp);
- if (ttyout)
- FD_SET(tout, obitsp);
- if (ttyin)
- FD_SET(tin, ibitsp);
- if (netin)
- FD_SET(net, ibitsp);
- if (netex)
- FD_SET(net, xbitsp);
-
- if ((c = select(maxfd+1, ibitsp, obitsp, xbitsp,
- (poll == 0)? (struct timeval *)0 : &TimeValue)) < 0) {
+ if ((c = poll(pfd, TELNET_FD_NUM, dopoll ? 0 : -1)) < 0) {
if (c == -1) {
/*
* we can get EINTR if we are in line mode,
@@ -1029,19 +1016,11 @@ process_rings(netin, netout, netex, ttyin, ttyout, poll)
* mode, and the transcom process died.
*/
if (errno == EBADF) {
- /*
- * zero the bits (even though kernel does it)
- * to make sure we are selecting on the right
- * ones.
- */
- memset(ibitsp, 0, fdsn);
- memset(obitsp, 0, fdsn);
- memset(xbitsp, 0, fdsn);
return 0;
}
# endif /* defined(TN3270) */
/* I don't like this, does it ever happen? */
- printf("sleep(5) from telnet, after select\r\n");
+ printf("sleep(5) from telnet, after poll\r\n");
sleep(5);
}
return 0;
@@ -1050,8 +1029,7 @@ process_rings(netin, netout, netex, ttyin, ttyout, poll)
/*
* Any urgent data?
*/
- if (FD_ISSET(net, xbitsp)) {
- FD_CLR(net, xbitsp);
+ if (pfd[TELNET_FD_NET].revents & POLLRDBAND) {
SYNCHing = 1;
(void) ttyflush(1); /* flush already enqueued data */
}
@@ -1059,10 +1037,9 @@ process_rings(netin, netout, netex, ttyin, ttyout, poll)
/*
* Something to read from the network...
*/
- if (FD_ISSET(net, ibitsp)) {
+ if (pfd[TELNET_FD_NET].revents & (POLLIN|POLLHUP)) {
int canread;
- FD_CLR(net, ibitsp);
canread = ring_empty_consecutive(&netiring);
#if !defined(SO_OOBINLINE)
/*
@@ -1172,8 +1149,7 @@ process_rings(netin, netout, netex, ttyin, ttyout, poll)
/*
* Something to read from the tty...
*/
- if (FD_ISSET(tin, ibitsp)) {
- FD_CLR(tin, ibitsp);
+ if (pfd[TELNET_FD_TIN].revents & (POLLIN|POLLHUP)) {
c = TerminalRead(ttyiring.supply, ring_empty_consecutive(&ttyiring));
if (c < 0 && errno == EIO)
c = 0;
@@ -1197,12 +1173,10 @@ process_rings(netin, netout, netex, ttyin, ttyout, poll)
returnValue = 1; /* did something useful */
}
- if (FD_ISSET(net, obitsp)) {
- FD_CLR(net, obitsp);
+ if (pfd[TELNET_FD_NET].revents & POLLOUT) {
returnValue |= netflush();
}
- if (FD_ISSET(tout, obitsp)) {
- FD_CLR(tout, obitsp);
+ if (pfd[TELNET_FD_TOUT].revents & POLLOUT) {
returnValue |= (ttyflush(SYNCHing|flushout) > 0);
}
diff --git a/usr.bin/telnet/telnet_locl.h b/usr.bin/telnet/telnet_locl.h
index 22b6e8c6a01..c51f0075005 100644
--- a/usr.bin/telnet/telnet_locl.h
+++ b/usr.bin/telnet/telnet_locl.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: telnet_locl.h,v 1.3 2003/05/14 01:46:51 hin Exp $ */
+/* $OpenBSD: telnet_locl.h,v 1.4 2013/04/21 09:51:24 millert Exp $ */
/* $KTH: telnet_locl.h,v 1.13 1997/11/03 21:37:55 assar Exp $ */
/*
@@ -56,7 +56,7 @@
#include <fcntl.h>
#include <netdb.h>
#include <pwd.h>
-#include <sys/select.h>
+#include <poll.h>
#include <sys/time.h>
#include <time.h>
#include <sys/param.h>
diff --git a/usr.bin/telnet/tn3270.c b/usr.bin/telnet/tn3270.c
index 2f7c87b2853..40c1b62f939 100644
--- a/usr.bin/telnet/tn3270.c
+++ b/usr.bin/telnet/tn3270.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tn3270.c,v 1.6 2003/06/03 02:56:18 millert Exp $ */
+/* $OpenBSD: tn3270.c,v 1.7 2013/04/21 09:51:24 millert Exp $ */
/* $NetBSD: tn3270.c,v 1.5 1996/02/28 21:04:18 thorpej Exp $ */
/*
@@ -107,14 +107,13 @@ DataToNetwork(buffer, count, done)
while (count) {
/* If not enough room for EORs, IACs, etc., wait */
if (NETROOM() < 6) {
- fd_set o;
+ struct pollfd pfd[1];
- FD_ZERO(&o);
netflush();
while (NETROOM() < 6) {
- FD_SET(net, &o);
- (void) select(net+1, (fd_set *) 0, &o, (fd_set *) 0,
- (struct timeval *) 0);
+ pfd[0].fd = net;
+ pfd[0].events = POLLOUT;
+ (void) poll(pfd, 1, -1);
netflush();
}
}
@@ -175,7 +174,7 @@ outputPurge()
* DataToTerminal - queue up some data to go to terminal.
*
* Note: there are people who call us and depend on our processing
- * *all* the data at one time (thus the select).
+ * *all* the data at one time (thus the poll).
*/
int
@@ -190,18 +189,13 @@ DataToTerminal(buffer, count)
while (count) {
if (TTYROOM() == 0) {
-#if defined(unix)
- fd_set o;
+ struct pollfd pfd[1];
- FD_ZERO(&o);
-#endif /* defined(unix) */
(void) ttyflush(0);
while (TTYROOM() == 0) {
-#if defined(unix)
- FD_SET(tout, &o);
- (void) select(tout+1, (fd_set *) 0, &o, (fd_set *) 0,
- (struct timeval *) 0);
-#endif /* defined(unix) */
+ pfd[0].fd = tout;
+ pfd[0].events = POLLOUT;
+ (void) poll(pfd, 1, -1);
(void) ttyflush(0);
}
}
diff --git a/usr.bin/telnet/utilities.c b/usr.bin/telnet/utilities.c
index 8cdea5f1a3e..c59dfccbc71 100644
--- a/usr.bin/telnet/utilities.c
+++ b/usr.bin/telnet/utilities.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: utilities.c,v 1.10 2007/10/17 20:10:44 chl Exp $ */
+/* $OpenBSD: utilities.c,v 1.11 2013/04/21 09:51:24 millert Exp $ */
/* $NetBSD: utilities.c,v 1.5 1996/02/28 21:04:21 thorpej Exp $ */
/*
@@ -847,33 +847,23 @@ printsub(direction, pointer, length)
/* EmptyTerminal - called to make sure that the terminal buffer is empty.
* Note that we consider the buffer to run all the
- * way to the kernel (thus the select).
+ * way to the kernel (thus the poll).
*/
void
EmptyTerminal()
{
-#if defined(unix)
- fd_set outs;
+ struct pollfd pfd[1];
- FD_ZERO(&outs);
-#endif /* defined(unix) */
+ pfd[0].fd = tout;
+ pfd[0].events = POLLOUT;
if (TTYBYTES() == 0) {
-#if defined(unix)
- FD_SET(tout, &outs);
- (void) select(tout+1, (fd_set *) 0, &outs, (fd_set *) 0,
- (struct timeval *) 0); /* wait for TTLOWAT */
-#endif /* defined(unix) */
+ (void) poll(pfd, 1, -1); /* wait for TTLOWAT */
} else {
while (TTYBYTES()) {
(void) ttyflush(0);
-#if defined(unix)
- ttyflush(0);
- FD_SET(tout, &outs);
- (void) select(tout+1, (fd_set *) 0, &outs, (fd_set *) 0,
- (struct timeval *) 0); /* wait for TTLOWAT */
-#endif /* defined(unix) */
+ (void) poll(pfd, 1, -1); /* wait for TTLOWAT */
}
}
}