OS X poll breakage (Was: Please help test recent changes)
Damien Miller
djm at mindrot.org
Tue Jan 11 18:34:19 AEDT 2022
On Tue, 11 Jan 2022, Damien Miller wrote:
> Wow, it looks like Darwin's poll(2) is completely broken for character-
> special devices (at least). E.g. the attached program spins shows similar
> behaviour when run on /dev/null - it spins, returning revents=POLLNVAL.
oops, this was the test program I was using.
Compare "./demo -" and "./demo /dev/null"
#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <poll.h>
#include <err.h>
int
main(int argc, char **argv)
{
struct pollfd p;
struct stat s;
int r;
char c;
setlinebuf(stdout);
p.fd = 0;
if (argc > 1 && strcmp(argv[1], "-") != 0) {
if ((p.fd = open(argv[1], O_RDONLY)) == -1)
err(1, "open %s", argv[1]);
}
if (fstat(p.fd, &s) != 0)
err(1, "stat");
printf("fd %d mode 0%o\n", p.fd, s.st_mode);
for (;;) {
p.events = POLLIN;
r = poll(&p, 1, -1);
if (r == -1)
err(1, "poll");
printf("poll %d rev 0x%02x\n", r, p.revents);
if ((p.revents & (POLLIN|POLLHUP)) == 0)
continue;
r = read(p.fd, &c, 1);
if (r == -1)
err(1, "read");
if (r == 0)
break;
}
return 0;
}
More information about the openssh-unix-dev
mailing list