OSDN Git Service

* fhandler.cc (fhandler_base::fcntl): Treat O_NONBLOCK and OLD_O_NDELAY
authorcorinna <corinna>
Wed, 25 Oct 2000 08:47:23 +0000 (08:47 +0000)
committercorinna <corinna>
Wed, 25 Oct 2000 08:47:23 +0000 (08:47 +0000)
as exactly the same. If one is set, both are set.
* net.cc (fhandler_socket::fcntl): Ditto.

winsup/cygwin/ChangeLog
winsup/cygwin/fhandler.cc
winsup/cygwin/net.cc

index fdfe293..c0ff458 100644 (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>
 
        * dcrt0.cc (do_exit): Remove debugging statement.
index abeef9e..811b038 100644 (file)
@@ -1021,12 +1021,17 @@ int fhandler_base::fcntl (int cmd, void *arg)
         * 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;
index 10153f4..d5e358c 100644 (file)
@@ -1988,15 +1988,22 @@ fhandler_socket::fcntl (int cmd, void *arg)
   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;