I noticed today that Unix Plink responds to SIGWINCH by accidentally
dying of EINTR having interrupted its main select loop, and when I
checked, there turn out to be a couple of other select loops with the
same bug.
fd_set rfds;
FD_ZERO(&rfds);
FD_SET(fd, &rfds);
- ret = select(fd+1, &rfds, NULL, NULL, NULL);
+ do {
+ ret = select(fd+1, &rfds, NULL, NULL, NULL);
+ } while (ret < 0 && errno == EINTR);
assert(ret != 0);
if (ret < 0)
return ret;
ret = select(maxfd, &rset, &wset, &xset, NULL);
}
+ if (ret < 0 && errno == EINTR)
+ continue;
+
if (ret < 0) {
perror("select");
exit(1);
now = GETTICKCOUNT();
} while (ret < 0 && errno == EINTR);
} else {
- ret = select(maxfd, &rset, &wset, &xset, NULL);
+ do {
+ ret = select(maxfd, &rset, &wset, &xset, NULL);
+ } while (ret < 0 && errno == EINTR);
}
} while (ret == 0);