* 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.
This commit is contained in:
Corinna Vinschen 2000-10-25 08:47:23 +00:00
parent d220f0b21c
commit 2f7356f39b
3 changed files with 28 additions and 10 deletions

View File

@ -1,3 +1,9 @@
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> Tue Oct 24 23:58:35 2000 Christopher Faylor <cgf@cygnus.com>
* dcrt0.cc (do_exit): Remove debugging statement. * dcrt0.cc (do_exit): Remove debugging statement.

View File

@ -1021,12 +1021,17 @@ int fhandler_base::fcntl (int cmd, void *arg)
* Each other flag will be ignored. * Each other flag will be ignored.
* Since O_ASYNC isn't defined in fcntl.h it's currently * Since O_ASYNC isn't defined in fcntl.h it's currently
* ignored as well. * ignored as well.
* There's no functionality at all, so...
*/ */
const int allowed_flags = O_APPEND | O_NONBLOCK | OLD_O_NDELAY; 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; int flags = get_flags () & ~allowed_flags;
set_flags (flags | ((int)arg & allowed_flags)); set_flags (flags | (new_flags & allowed_flags));
} }
res = 0; res = 0;
break; break;

View File

@ -1988,15 +1988,22 @@ fhandler_socket::fcntl (int cmd, void *arg)
switch (cmd) switch (cmd)
{ {
case F_SETFL: case F_SETFL:
request = ((int) arg & O_NONBLOCK) ? 1 : 0; {
/* 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; current = (get_flags () & O_NONBLOCK) ? 1 : 0;
if (request != current && (res = ioctl (FIONBIO, &request))) if (request != current && (res = ioctl (FIONBIO, &request)))
break; break;
if (request) if (request)
set_flags (get_flags () | O_NONBLOCK); set_flags (get_flags () | O_NONBLOCK | OLD_O_NDELAY);
else else
set_flags (get_flags () & ~O_NONBLOCK); set_flags (get_flags () & ~(O_NONBLOCK | OLD_O_NDELAY));
break; break;
}
default: default:
res = fhandler_base::fcntl (cmd, arg); res = fhandler_base::fcntl (cmd, arg);
break; break;