* fhandler.cc (fhandler_base::fcntl): Behave properly when passed
previous version of O_NDELAY. * syscalls.cc: Move OLD_O_NDELAY to winsup.h. * winsup.h: Define OLD_O_NDELAY now.
This commit is contained in:
@@ -1012,20 +1012,21 @@ int fhandler_base::fcntl (int cmd, void *arg)
|
||||
break;
|
||||
case F_GETFL:
|
||||
res = get_flags ();
|
||||
debug_printf ("GETFL: %d", res);
|
||||
break;
|
||||
case F_SETFL:
|
||||
{
|
||||
/*
|
||||
* Only O_APPEND, O_ASYNC and O_NONBLOCK are allowed.
|
||||
* Only O_APPEND, O_ASYNC and O_NONBLOCK/O_NDELAY are allowed.
|
||||
* 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...
|
||||
*/
|
||||
int flags = get_flags ();
|
||||
flags &= ~(O_APPEND | O_NONBLOCK);
|
||||
flags |= ((int) arg & (O_APPEND | O_NONBLOCK));
|
||||
set_flags (flags);
|
||||
const int allowed_flags = O_APPEND | O_NONBLOCK | OLD_O_NDELAY;
|
||||
|
||||
int flags = get_flags () & ~allowed_flags;
|
||||
set_flags (flags | ((int)arg & allowed_flags));
|
||||
}
|
||||
res = 0;
|
||||
break;
|
||||
|
Reference in New Issue
Block a user