Make serial fd blocking mode depend on FILE_FLAG_OVERLAPPED.

This commit is contained in:
Mike McCormack 2001-10-08 20:40:57 +00:00 committed by Alexandre Julliard
parent 58b299521d
commit 568c67e173
7 changed files with 30 additions and 10 deletions

View File

@ -705,13 +705,13 @@ const DOS_DEVICE *DOSFS_GetDeviceByHandle( HFILE hFile )
/************************************************************************** /**************************************************************************
* DOSFS_CreateCommPort * DOSFS_CreateCommPort
*/ */
static HANDLE DOSFS_CreateCommPort(LPCSTR name, DWORD access) static HANDLE DOSFS_CreateCommPort(LPCSTR name, DWORD access, DWORD attributes)
{ {
HANDLE ret; HANDLE ret;
char devname[40]; char devname[40];
size_t len; size_t len;
TRACE("%s %lx\n", name, access); TRACE_(file)("%s %lx %lx\n", name, access, attributes);
PROFILE_GetWineIniString("serialports",name,"",devname,sizeof devname); PROFILE_GetWineIniString("serialports",name,"",devname,sizeof devname);
if(!devname[0]) if(!devname[0])
@ -724,6 +724,7 @@ static HANDLE DOSFS_CreateCommPort(LPCSTR name, DWORD access)
{ {
req->access = access; req->access = access;
req->inherit = 0; /*FIXME*/ req->inherit = 0; /*FIXME*/
req->attributes = attributes;
req->sharing = FILE_SHARE_READ|FILE_SHARE_WRITE; req->sharing = FILE_SHARE_READ|FILE_SHARE_WRITE;
memcpy( server_data_ptr(req), devname, len ); memcpy( server_data_ptr(req), devname, len );
SetLastError(0); SetLastError(0);
@ -745,7 +746,7 @@ static HANDLE DOSFS_CreateCommPort(LPCSTR name, DWORD access)
* Open a DOS device. This might not map 1:1 into the UNIX device concept. * Open a DOS device. This might not map 1:1 into the UNIX device concept.
* Returns 0 on failure. * Returns 0 on failure.
*/ */
HANDLE DOSFS_OpenDevice( const char *name, DWORD access ) HANDLE DOSFS_OpenDevice( const char *name, DWORD access, DWORD attributes )
{ {
int i; int i;
const char *p; const char *p;
@ -790,7 +791,7 @@ HANDLE DOSFS_OpenDevice( const char *name, DWORD access )
return FILE_CreateDevice( i, access, NULL ); return FILE_CreateDevice( i, access, NULL );
} }
if( (handle=DOSFS_CreateCommPort(DOSFS_Devices[i].name,access)) ) if( (handle=DOSFS_CreateCommPort(DOSFS_Devices[i].name,access,attributes)) )
return handle; return handle;
FIXME("device open %s not supported (yet)\n",DOSFS_Devices[i].name); FIXME("device open %s not supported (yet)\n",DOSFS_Devices[i].name);
return 0; return 0;

View File

@ -488,7 +488,7 @@ HANDLE WINAPI CreateFileA( LPCSTR filename, DWORD access, DWORD sharing,
{ {
TRACE("opening device '%s'\n", filename ); TRACE("opening device '%s'\n", filename );
if (!(ret = DOSFS_OpenDevice( filename, access ))) if (!(ret = DOSFS_OpenDevice( filename, access, attributes )))
{ {
/* Do not silence this please. It is a critical error. -MM */ /* Do not silence this please. It is a critical error. -MM */
ERR("Couldn't open device '%s'!\n",filename); ERR("Couldn't open device '%s'!\n",filename);

View File

@ -98,7 +98,7 @@ extern time_t DOSFS_FileTimeToUnixTime( const FILETIME *ft, DWORD *remainder );
extern BOOL DOSFS_ToDosFCBFormat( LPCSTR name, LPSTR buffer ); extern BOOL DOSFS_ToDosFCBFormat( LPCSTR name, LPSTR buffer );
extern const DOS_DEVICE *DOSFS_GetDevice( const char *name ); extern const DOS_DEVICE *DOSFS_GetDevice( const char *name );
extern const DOS_DEVICE *DOSFS_GetDeviceByHandle( HFILE hFile ); extern const DOS_DEVICE *DOSFS_GetDeviceByHandle( HFILE hFile );
extern HANDLE DOSFS_OpenDevice( const char *name, DWORD access ); extern HANDLE DOSFS_OpenDevice( const char *name, DWORD access, DWORD attributes );
extern BOOL DOSFS_FindUnixName( LPCSTR path, LPCSTR name, LPSTR long_buf, extern BOOL DOSFS_FindUnixName( LPCSTR path, LPCSTR name, LPSTR long_buf,
INT long_len, LPSTR short_buf, INT long_len, LPSTR short_buf,
BOOL ignore_case ); BOOL ignore_case );

View File

@ -576,6 +576,7 @@ struct get_handle_fd_request
#define FD_TYPE_DEFAULT 1 #define FD_TYPE_DEFAULT 1
#define FD_TYPE_CONSOLE 2 #define FD_TYPE_CONSOLE 2
#define FD_TYPE_OVERLAPPED 3 #define FD_TYPE_OVERLAPPED 3
#define FD_TYPE_TIMEOUT 4
@ -1454,6 +1455,7 @@ struct create_serial_request
struct request_header __header; struct request_header __header;
unsigned int access; unsigned int access;
int inherit; int inherit;
unsigned int attributes;
unsigned int sharing; unsigned int sharing;
/* VARARG(name,string); */ /* VARARG(name,string); */
handle_t handle; handle_t handle;
@ -1917,6 +1919,6 @@ union generic_request
struct get_window_tree_request get_window_tree; struct get_window_tree_request get_window_tree;
}; };
#define SERVER_PROTOCOL_VERSION 54 #define SERVER_PROTOCOL_VERSION 55
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */ #endif /* __WINE_WINE_SERVER_PROTOCOL_H */

View File

@ -532,6 +532,7 @@ enum event_op { PULSE_EVENT, SET_EVENT, RESET_EVENT };
#define FD_TYPE_DEFAULT 1 #define FD_TYPE_DEFAULT 1
#define FD_TYPE_CONSOLE 2 #define FD_TYPE_CONSOLE 2
#define FD_TYPE_OVERLAPPED 3 #define FD_TYPE_OVERLAPPED 3
#define FD_TYPE_TIMEOUT 4
/* Set a file current position */ /* Set a file current position */
@ -1299,6 +1300,7 @@ enum message_type
@REQ(create_serial) @REQ(create_serial)
unsigned int access; /* wanted access rights */ unsigned int access; /* wanted access rights */
int inherit; /* inherit flag */ int inherit; /* inherit flag */
unsigned int attributes; /* eg. FILE_FLAG_OVERLAPPED */
unsigned int sharing; /* sharing flags */ unsigned int sharing; /* sharing flags */
VARARG(name,string); /* file name */ VARARG(name,string); /* file name */
@REPLY @REPLY

View File

@ -44,6 +44,7 @@ struct serial
{ {
struct object obj; struct object obj;
unsigned int access; unsigned int access;
unsigned int attrib;
/* timeout values */ /* timeout values */
unsigned int readinterval; unsigned int readinterval;
@ -78,7 +79,7 @@ static const struct object_ops serial_ops =
/* SERIAL PORT functions */ /* SERIAL PORT functions */
static struct serial *create_serial( const char *nameptr, size_t len, unsigned int access ) static struct serial *create_serial( const char *nameptr, size_t len, unsigned int access, int attributes )
{ {
struct serial *serial; struct serial *serial;
struct termios tios; struct termios tios;
@ -115,8 +116,14 @@ static struct serial *create_serial( const char *nameptr, size_t len, unsigned i
return NULL; return NULL;
} }
/* set the fd back to blocking if necessary */
if( ! (attributes & FILE_FLAG_OVERLAPPED) )
if(0>fcntl(fd, F_SETFL, 0))
perror("fcntl");
if ((serial = alloc_object( &serial_ops, fd ))) if ((serial = alloc_object( &serial_ops, fd )))
{ {
serial->attrib = attributes;
serial->access = access; serial->access = access;
serial->readinterval = 0; serial->readinterval = 0;
serial->readmult = 0; serial->readmult = 0;
@ -160,6 +167,9 @@ static int serial_get_fd( struct object *obj )
static int serial_get_info( struct object *obj, struct get_file_info_request *req ) static int serial_get_info( struct object *obj, struct get_file_info_request *req )
{ {
struct serial *serial = (struct serial *) obj;
assert( obj->ops == &serial_ops );
if (req) if (req)
{ {
req->type = FILE_TYPE_CHAR; req->type = FILE_TYPE_CHAR;
@ -173,7 +183,11 @@ static int serial_get_info( struct object *obj, struct get_file_info_request *re
req->index_low = 0; req->index_low = 0;
req->serial = 0; req->serial = 0;
} }
return FD_TYPE_DEFAULT;
if(serial->attrib & FILE_FLAG_OVERLAPPED)
return FD_TYPE_OVERLAPPED;
return FD_TYPE_TIMEOUT;
} }
/* these function calculates the timeout for an async operation /* these function calculates the timeout for an async operation
@ -202,7 +216,7 @@ DECL_HANDLER(create_serial)
struct serial *serial; struct serial *serial;
req->handle = 0; req->handle = 0;
if ((serial = create_serial( get_req_data(req), get_req_data_size(req), req->access ))) if ((serial = create_serial( get_req_data(req), get_req_data_size(req), req->access, req->attributes )))
{ {
req->handle = alloc_handle( current->process, serial, req->access, req->inherit ); req->handle = alloc_handle( current->process, serial, req->access, req->inherit );
release_object( serial ); release_object( serial );

View File

@ -1556,6 +1556,7 @@ static void dump_create_serial_request( const struct create_serial_request *req
{ {
fprintf( stderr, " access=%08x,", req->access ); fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " inherit=%d,", req->inherit ); fprintf( stderr, " inherit=%d,", req->inherit );
fprintf( stderr, " attributes=%08x,", req->attributes );
fprintf( stderr, " sharing=%08x,", req->sharing ); fprintf( stderr, " sharing=%08x,", req->sharing );
fprintf( stderr, " name=" ); fprintf( stderr, " name=" );
cur_pos += dump_varargs_string( req ); cur_pos += dump_varargs_string( req );