diff options
Diffstat (limited to 'src')
| -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); |
