as exactly the same. If one is set, both are set.
* net.cc (fhandler_socket::fcntl): Ditto.
+Wed Oct 25 10:43:00 2000 Corinna Vinschen <corinna@vinschen.de>
+
+ * fhandler.cc (fhandler_base::fcntl): Treat O_NONBLOCK and OLD_O_NDELAY
+ as exactly the same. If one is set, both are set.
+ * net.cc (fhandler_socket::fcntl): Ditto.
+
Tue Oct 24 23:58:35 2000 Christopher Faylor <cgf@cygnus.com>
* dcrt0.cc (do_exit): Remove debugging statement.
* Each other flag will be ignored.
* Since O_ASYNC isn't defined in fcntl.h it's currently
* ignored as well.
- * There's no functionality at all, so...
*/
const int allowed_flags = O_APPEND | O_NONBLOCK | OLD_O_NDELAY;
+ /* Care for the old O_NDELAY flag. If one of the flags is set,
+ both flags are set. */
+ int new_flags = (int) arg;
+ if (new_flags & (O_NONBLOCK | OLD_O_NDELAY))
+ new_flags |= O_NONBLOCK | OLD_O_NDELAY;
+
int flags = get_flags () & ~allowed_flags;
- set_flags (flags | ((int)arg & allowed_flags));
+ set_flags (flags | (new_flags & allowed_flags));
}
res = 0;
break;
switch (cmd)
{
case F_SETFL:
- request = ((int) arg & O_NONBLOCK) ? 1 : 0;
- current = (get_flags () & O_NONBLOCK) ? 1 : 0;
- if (request != current && (res = ioctl (FIONBIO, &request)))
+ {
+ /* Care for the old O_NDELAY flag. If one of the flags is set,
+ both flags are set. */
+ int new_flags = (int) arg;
+ if (new_flags & (O_NONBLOCK | OLD_O_NDELAY))
+ new_flags |= O_NONBLOCK | OLD_O_NDELAY;
+ request = (new_flags & O_NONBLOCK) ? 1 : 0;
+ current = (get_flags () & O_NONBLOCK) ? 1 : 0;
+ if (request != current && (res = ioctl (FIONBIO, &request)))
+ break;
+ if (request)
+ set_flags (get_flags () | O_NONBLOCK | OLD_O_NDELAY);
+ else
+ set_flags (get_flags () & ~(O_NONBLOCK | OLD_O_NDELAY));
break;
- if (request)
- set_flags (get_flags () | O_NONBLOCK);
- else
- set_flags (get_flags () & ~O_NONBLOCK);
- break;
+ }
default:
res = fhandler_base::fcntl (cmd, arg);
break;