diff options
author | dlg <> | 2014-10-10 13:14:50 +0000 |
---|---|---|
committer | dlg <> | 2014-10-10 13:14:50 +0000 |
commit | 602aac51517412d58a5947dd7477c78b826c54e6 (patch) | |
tree | a8992c6ad2162cb1eea081440628b30d8cf4f0ad | |
parent | b48121fdd975081897efd096feaa7aeabd6ba9fe (diff) | |
download | openbsd-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.c | 29 |
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 | ||
50 | int | 51 | int |
51 | rcmd(char **ahost, int rport, const char *locuser, const char *remuser, | 52 | rcmd(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 | } |
212 | again: | 208 | again: |
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); |
293 | bad2: | 290 | bad2: |
294 | if (lport) | 291 | if (lport) |
295 | (void)close(*fd2p); | 292 | (void)close(*fd2p); |
296 | bad: | 293 | bad: |
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); |