* 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:
		| @@ -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. | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user