Patch: 002-fd_type.diff

Martin Wilck Martin.Wilck at fujitsu-siemens.com
Mon Jan 7 09:35:07 CST 2002


Patch 2 in the series, a repost of my patch to wine-devel of 2002-01-03,
Now incremental to the previous patch (i.e., also relies on Mike's
patches being applied).

Patch file:	002-fd_type.diff
Purpose:	More general approach to file descriptor types and flags.
Created: 	2002-01-07
Applies:	CVS 2002-01-07
		(with 001-file_overlapped.diff applied)

If overlapped IO is to be allowed / implemented for several different types
of file descriptors (regular files, serial ports, pipes, sockets, ...), a
more general scheme must be found to obtain file descriptor types and flags
or capabilities. The current scheme treats FD_TYPE_OVERLAPPED as a special
type, making it impossible to distinguish between e.g. overlapped files and
overlapped sockets.

This patch fixes this behaviour by modifying the meaning of return value
of the get_file_info() function.

** NOTE ON BUILDING: 	tools/make_requests must be run	**
**			after applying this patch	**

server/protocol.def:
	The lowest byte of the type value is reserved for the type itself
	(macro FD_TYPE (type)the rest is available for miscellaneous flags.

	New FD types: FD_TYPE_DEVICE, FD_TYPE_NAMED_PIPE, FD_TYPE_PIPE,
		FD_TYPE_SERIAL, FD_TYPE_SOCKET.
	New FD flags (were formerly FD types):
		FD_TYPE_FLAG_OVERLAPPED: The fd uses overlapped I/O.
		FD_TYPE_FLAG_TIMEOUT: The fd applies a timeout on
			its I/O operations
	New test macros: FD_TYPE_IS_OVERLAPPED (type),
		FD_TYPE_HAS_TIMEOUT (type)

server/device.c:
	device_get_info():
		return FD_TYPE_DEVICE.
server/file.c:
	file_get_info():
		set FD_TYPE_FLAG_OVERLAPPED on overlapped files.
server/named_pipe.c:
	named_pipe_get_info():
		return FD_TYPE_NAMED_PIPE.
server/pipe.c:
	named_pipe_get_info():
		return FD_TYPE_PIPE.
server/serial.c:
	serial_get_info():
		return FD_TYPE_SERIAL, account for OVERLAPPED and
		TIMEOUT flags.
server/serial.c:
	sock_get_info():
		return FD_TYPE_SOCKET.

files/file.c:
	ReadFile():
		Replace FD_TYPE_XYZ dependent switch statement
		with an equivalent if/elseif construct which
		will allow a morte fine-grained destinction
		of fd types and flags in the future.
	WriteFile():
		dito.

Martin Wilck <Martin.Wilck at Fujitsu-Siemens.com>

diff -ruX diffignore CVS/wine/files/file.c MW/wine/files/file.c
--- CVS/wine/files/file.c	Mon Jan  7 16:04:31 2002
+++ MW/wine/files/file.c	Mon Jan  7 16:00:33 2002
@@ -1467,9 +1467,8 @@

     unix_handle = FILE_GetUnixHandleType( hFile, GENERIC_READ, &type );

-    switch (type)
+    if ( FD_TYPE_IS_OVERLAPPED (type) )
     {
-    case FD_TYPE_OVERLAPPED:
 	if (unix_handle == -1) return FALSE;
         if ( (overlapped==NULL) || NtResetEvent( overlapped->hEvent, NULL ) )
         {
@@ -1512,15 +1511,21 @@
         /* fail on return, with ERROR_IO_PENDING */
         SetLastError(ERROR_IO_PENDING);
         return FALSE;
+    }

-    case FD_TYPE_CONSOLE:
+    else if ( FD_TYPE (type) == FD_TYPE_CONSOLE )
+    {
 	return ReadConsoleA(hFile, buffer, bytesToRead, bytesRead, NULL);
+    }

-    case FD_TYPE_TIMEOUT:
+    else if ( FD_TYPE_HAS_TIMEOUT (type) )
+    {
         close(unix_handle);
         return FILE_TimeoutRead(hFile, buffer, bytesToRead, bytesRead);
+    }

-    default:
+    else
+    {
 	/* normal unix files */
 	if (unix_handle == -1)
 	    return FALSE;
@@ -1530,7 +1535,6 @@
 	    SetLastError(ERROR_INVALID_PARAMETER);
 	    return FALSE;
 	}
-	break;
     }

     /* code for synchronous reads */
@@ -1689,9 +1693,8 @@

     unix_handle = FILE_GetUnixHandleType( hFile, GENERIC_WRITE, &type );

-    switch (type)
+    if ( FD_TYPE_IS_OVERLAPPED (type) )
     {
-    case FD_TYPE_OVERLAPPED:
 	if (unix_handle == -1) return FALSE;
         if ( (overlapped==NULL) || NtResetEvent( overlapped->hEvent, NULL ) )
         {
@@ -1741,11 +1744,17 @@
         SetLastError(ERROR_IO_PENDING);
         return FALSE;

-    case FD_TYPE_CONSOLE:
+    }
+
+    else if ( FD_TYPE (type) == FD_TYPE_CONSOLE )
+    {
         TRACE("%d %s %ld %p %p\n", hFile, debugstr_an(buffer, bytesToWrite), bytesToWrite,
 	      bytesWritten, overlapped );
 	return WriteConsoleA(hFile, buffer, bytesToWrite, bytesWritten, NULL);
-    default:
+    }
+
+    else
+    {
 	if (unix_handle == -1)
 	    return FALSE;
     }
diff -ruX diffignore CVS/wine/server/device.c MW/wine/server/device.c
--- CVS/wine/server/device.c	Mon Jan  7 15:45:26 2002
+++ MW/wine/server/device.c	Mon Jan  7 16:00:33 2002
@@ -83,7 +83,7 @@
         reply->index_low   = 0;
         reply->serial      = 0;
     }
-    return FD_TYPE_DEFAULT;
+    return FD_TYPE_DEVICE;
 }

 /* create a device */
diff -ruX diffignore CVS/wine/server/file.c MW/wine/server/file.c
--- CVS/wine/server/file.c	Mon Jan  7 15:58:22 2002
+++ MW/wine/server/file.c	Mon Jan  7 16:00:33 2002
@@ -308,6 +308,7 @@
 {
     struct stat st;
     struct file *file = (struct file *)obj;
+    int fd_type = FD_TYPE_DEFAULT;
     assert( obj->ops == &file_ops );

     if (reply)
@@ -342,9 +343,10 @@
     }

     if (file->flags & FILE_FLAG_OVERLAPPED)
-	return FD_TYPE_OVERLAPPED;
+ 	fd_type |= FD_TYPE_FLAG_OVERLAPPED;
+
+    return fd_type;

-    return FD_TYPE_DEFAULT;
 }

 static struct async_queue *file_queue_async(struct object *obj, struct async *async, int type, int count)
diff -ruX diffignore CVS/wine/server/named_pipe.c MW/wine/server/named_pipe.c
--- CVS/wine/server/named_pipe.c	Mon Jan  7 15:45:26 2002
+++ MW/wine/server/named_pipe.c	Mon Jan  7 16:00:33 2002
@@ -197,7 +197,7 @@
         reply->index_low   = 0;
         reply->serial      = 0;
     }
-    return FD_TYPE_DEFAULT;
+    return FD_TYPE_NAMED_PIPE;
 }

 static struct named_pipe *create_named_pipe( const WCHAR *name, size_t len )
diff -ruX diffignore CVS/wine/server/pipe.c MW/wine/server/pipe.c
--- CVS/wine/server/pipe.c	Mon Jan  7 15:45:26 2002
+++ MW/wine/server/pipe.c	Mon Jan  7 16:00:33 2002
@@ -140,7 +140,7 @@
         reply->index_low   = 0;
         reply->serial      = 0;
     }
-    return FD_TYPE_DEFAULT;
+    return FD_TYPE_PIPE;
 }

 static void pipe_destroy( struct object *obj )
diff -ruX diffignore CVS/wine/server/protocol.def MW/wine/server/protocol.def
--- CVS/wine/server/protocol.def	Mon Jan  7 15:45:26 2002
+++ MW/wine/server/protocol.def	Mon Jan  7 16:00:33 2002
@@ -544,12 +544,22 @@
     int          fd;            /* file descriptor */
     int          type;          /* the type of file */
 @END
+#define FD_TYPE(x) ((x) & 0xff)
+
 #define FD_TYPE_INVALID    0
 #define FD_TYPE_DEFAULT    1
 #define FD_TYPE_CONSOLE    2
-#define FD_TYPE_OVERLAPPED 3
-#define FD_TYPE_TIMEOUT    4
+#define FD_TYPE_DEVICE     3
+#define FD_TYPE_NAMED_PIPE 4
+#define FD_TYPE_PIPE       5
+#define FD_TYPE_SERIAL     6
+#define FD_TYPE_SOCKET     7
+
+#define FD_TYPE_FLAG_OVERLAPPED 0x100
+#define FD_TYPE_FLAG_TIMEOUT    0x200

+#define FD_TYPE_IS_OVERLAPPED(x) ((x) & FD_TYPE_FLAG_OVERLAPPED)
+#define FD_TYPE_HAS_TIMEOUT(x)   ((x) & FD_TYPE_FLAG_TIMEOUT)

 /* Set a file current position */
 @REQ(set_file_pointer)
diff -ruX diffignore CVS/wine/server/serial.c MW/wine/server/serial.c
--- CVS/wine/server/serial.c	Mon Jan  7 15:45:26 2002
+++ MW/wine/server/serial.c	Mon Jan  7 16:00:33 2002
@@ -192,6 +192,7 @@
 static int serial_get_info( struct object *obj, struct get_file_info_reply *reply )
 {
     struct serial *serial = (struct serial *) obj;
+    int fd_type = FD_TYPE_SERIAL;
     assert( obj->ops == &serial_ops );

     if (reply)
@@ -209,13 +210,13 @@
     }

     if(serial->attrib & FILE_FLAG_OVERLAPPED)
-        return FD_TYPE_OVERLAPPED;
+        fd_type |= FD_TYPE_FLAG_OVERLAPPED;

-    if( (serial->readinterval == MAXDWORD) &&
-        (serial->readmult == 0) && (serial->readconst == 0) )
-        return FD_TYPE_DEFAULT;
+    else if( !((serial->readinterval == MAXDWORD) &&
+	       (serial->readmult == 0) && (serial->readconst == 0)) )
+	fd_type |= FD_TYPE_FLAG_TIMEOUT;

-    return FD_TYPE_TIMEOUT;
+    return fd_type;
 }

 static void serial_poll_event(struct object *obj, int event)
diff -ruX diffignore CVS/wine/server/sock.c MW/wine/server/sock.c
--- CVS/wine/server/sock.c	Mon Jan  7 15:45:26 2002
+++ MW/wine/server/sock.c	Mon Jan  7 16:00:33 2002
@@ -288,7 +288,7 @@
         reply->index_low   = 0;
         reply->serial      = 0;
     }
-    return FD_TYPE_DEFAULT;
+    return FD_TYPE_SOCKET;
 }

 static void sock_destroy( struct object *obj )





More information about the wine-patches mailing list