summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordlg <>2014-10-10 13:14:50 +0000
committerdlg <>2014-10-10 13:14:50 +0000
commit602aac51517412d58a5947dd7477c78b826c54e6 (patch)
treea8992c6ad2162cb1eea081440628b30d8cf4f0ad
parentb48121fdd975081897efd096feaa7aeabd6ba9fe (diff)
downloadopenbsd-602aac51517412d58a5947dd7477c78b826c54e6.tar.gz
openbsd-602aac51517412d58a5947dd7477c78b826c54e6.tar.bz2
openbsd-602aac51517412d58a5947dd7477c78b826c54e6.zip
replace select with equiv poll usage.
looks good deraadt@ tweaks and ok millert@
-rw-r--r--src/lib/libc/net/rcmd.c29
1 files changed, 12 insertions, 17 deletions
diff --git a/src/lib/libc/net/rcmd.c b/src/lib/libc/net/rcmd.c
index d566e0ca4c..617fe440aa 100644
--- a/src/lib/libc/net/rcmd.c
+++ b/src/lib/libc/net/rcmd.c
@@ -46,6 +46,7 @@
46#include <string.h> 46#include <string.h>
47#include <syslog.h> 47#include <syslog.h>
48#include <stdlib.h> 48#include <stdlib.h>
49#include <poll.h>
49 50
50int 51int
51rcmd(char **ahost, int rport, const char *locuser, const char *remuser, 52rcmd(char **ahost, int rport, const char *locuser, const char *remuser,
@@ -63,7 +64,6 @@ rcmd_af(char **ahost, int porta, const char *locuser, const char *remuser,
63 struct addrinfo hints, *res, *r; 64 struct addrinfo hints, *res, *r;
64 int error; 65 int error;
65 struct sockaddr_storage from; 66 struct sockaddr_storage from;
66 fd_set *readsp = NULL;
67 sigset_t oldmask, mask; 67 sigset_t oldmask, mask;
68 pid_t pid; 68 pid_t pid;
69 int s, lport, timo; 69 int s, lport, timo;
@@ -188,18 +188,14 @@ rcmd_af(char **ahost, int porta, const char *locuser, const char *remuser,
188 write(s, "", 1); 188 write(s, "", 1);
189 lport = 0; 189 lport = 0;
190 } else { 190 } else {
191 struct pollfd pfd[2];
191 char num[8]; 192 char num[8];
192 int s2 = rresvport_af(&lport, af), s3; 193 int s2 = rresvport_af(&lport, af), s3;
193 socklen_t len = sizeof(from); 194 socklen_t len = sizeof(from);
194 int fdssize = howmany(MAX(s, s2)+1, NFDBITS) * sizeof(fd_mask);
195 195
196 if (s2 < 0) 196 if (s2 < 0)
197 goto bad; 197 goto bad;
198 readsp = (fd_set *)malloc(fdssize); 198
199 if (readsp == NULL) {
200 close(s2);
201 goto bad;
202 }
203 listen(s2, 1); 199 listen(s2, 1);
204 (void)snprintf(num, sizeof(num), "%d", lport); 200 (void)snprintf(num, sizeof(num), "%d", lport);
205 if (write(s, num, strlen(num)+1) != strlen(num)+1) { 201 if (write(s, num, strlen(num)+1) != strlen(num)+1) {
@@ -210,19 +206,21 @@ rcmd_af(char **ahost, int porta, const char *locuser, const char *remuser,
210 goto bad; 206 goto bad;
211 } 207 }
212again: 208again:
213 bzero(readsp, fdssize); 209 pfd[0].fd = s;
214 FD_SET(s, readsp); 210 pfd[0].events = POLLIN;
215 FD_SET(s2, readsp); 211 pfd[1].fd = s2;
212 pfd[1].events = POLLIN;
213
216 errno = 0; 214 errno = 0;
217 if (select(MAX(s, s2) + 1, readsp, 0, 0, 0) < 1 || 215 if (poll(pfd, 2, INFTIM) < 1 ||
218 !FD_ISSET(s2, readsp)) { 216 (pfd[1].revents & (POLLIN|POLLHUP)) == 0) {
219 if (errno != 0) 217 if (errno != 0)
220 (void)fprintf(stderr, 218 (void)fprintf(stderr,
221 "rcmd: select (setting up stderr): %s\n", 219 "rcmd: poll (setting up stderr): %s\n",
222 strerror(errno)); 220 strerror(errno));
223 else 221 else
224 (void)fprintf(stderr, 222 (void)fprintf(stderr,
225 "select: protocol failure in circuit setup\n"); 223 "poll: protocol failure in circuit setup\n");
226 (void)close(s2); 224 (void)close(s2);
227 goto bad; 225 goto bad;
228 } 226 }
@@ -288,14 +286,11 @@ again:
288 goto bad2; 286 goto bad2;
289 } 287 }
290 sigprocmask(SIG_SETMASK, &oldmask, NULL); 288 sigprocmask(SIG_SETMASK, &oldmask, NULL);
291 free(readsp);
292 return (s); 289 return (s);
293bad2: 290bad2:
294 if (lport) 291 if (lport)
295 (void)close(*fd2p); 292 (void)close(*fd2p);
296bad: 293bad:
297 if (readsp)
298 free(readsp);
299 (void)close(s); 294 (void)close(s);
300 sigprocmask(SIG_SETMASK, &oldmask, NULL); 295 sigprocmask(SIG_SETMASK, &oldmask, NULL);
301 return (-1); 296 return (-1);