More general approach to file descriptor types and flags.

diff --git a/server/serial.c b/server/serial.c
index 110854a..5911876 100644
--- a/server/serial.c
+++ b/server/serial.c
@@ -35,7 +35,7 @@
 
 static void serial_dump( struct object *obj, int verbose );
 static int serial_get_fd( struct object *obj );
-static int serial_get_info( struct object *obj, struct get_file_info_reply *reply );
+static int serial_get_info( struct object *obj, struct get_file_info_reply *reply, int *flags );
 static int serial_get_poll_events( struct object *obj );
 static struct async_queue * serial_queue_async(struct object *obj, struct async* async, int type, int count);
 static void destroy_serial(struct object *obj);
@@ -189,7 +189,7 @@
     return serial->obj.fd;
 }
 
-static int serial_get_info( struct object *obj, struct get_file_info_reply *reply )
+static int serial_get_info( struct object *obj, struct get_file_info_reply *reply, int *flags )
 {
     struct serial *serial = (struct serial *) obj;
     assert( obj->ops == &serial_ops );
@@ -208,14 +208,14 @@
         reply->serial      = 0;
     }
 
+    *flags = 0;
     if(serial->attrib & FILE_FLAG_OVERLAPPED)
-        return FD_TYPE_OVERLAPPED;
+        *flags |= FD_FLAG_OVERLAPPED;
+    else if(!((serial->readinterval == MAXDWORD) &&
+              (serial->readmult == 0) && (serial->readconst == 0)) )
+        *flags |= FD_FLAG_TIMEOUT;
 
-    if( (serial->readinterval == MAXDWORD) &&
-        (serial->readmult == 0) && (serial->readconst == 0) )
-        return FD_TYPE_DEFAULT;
-
-    return FD_TYPE_TIMEOUT;
+    return FD_TYPE_DEFAULT;
 }
 
 static void serial_poll_event(struct object *obj, int event)