Hi, On Sat, 10 Oct 2015 21:32:29 -0700 Philip Guenther <guent...@gmail.com> wrote: > So: > * kill the 'mode' argument to PRIVSEP_OPEN and priv_open() > * fail a PRIVSEP_OPEN call if it's passed any flags other than > O_ACCMODE or O_NONBLOCK > * paranoia: mask O_CREAT when calling open() with only two arguments > * instead of using ioctl(FIONBIO) after the fact, pass O_NONBLOCK to > priv_open()
As for "open with O_NONBLOCK and ioctl(FIONBIO)", see the diff following for example, > Index: usr.sbin/npppd/npppd/npppd_iface.c > =================================================================== > RCS file: /cvs/src/usr.sbin/npppd/npppd/npppd_iface.c,v > retrieving revision 1.11 > diff -u -p -r1.11 npppd_iface.c > --- usr.sbin/npppd/npppd/npppd_iface.c 20 Jul 2015 18:58:30 -0000 > 1.11 > +++ usr.sbin/npppd/npppd/npppd_iface.c 11 Oct 2015 04:17:40 -0000 > @@ -283,15 +283,8 @@ npppd_iface_start(npppd_iface *_this) > > /* open device file */ > snprintf(buf, sizeof(buf), "/dev/%s", _this->ifname); > - if ((_this->devf = priv_open(buf, O_RDWR, 0600)) < 0) { > + if ((_this->devf = priv_open(buf, O_RDWR | O_NONBLOCK)) < 0) { > npppd_iface_log(_this, LOG_ERR, "open(%s) failed: %m", buf); > - goto fail; > - } > - > - x = 1; > - if (ioctl(_this->devf, FIONBIO, &x) != 0) { > - npppd_iface_log(_this, LOG_ERR, > - "ioctl(FIONBIO) failed in %s(): %m", __func__); > goto fail; > } > At least on tun, bpf or pppx they behave differently. Since open(,O_NONBLOCK) doesn't call ioctl(FIONBIO) internally and those device have/use their own flag. How should we fix this? Revert ioctl(FIONBIO), change the open(2) behavior or the devices behavior? --yasuoka