Fetch a handle type in FILE_GetUnixHandle.

This commit is contained in:
Mike McCormack 2001-10-04 16:18:15 +00:00 committed by Alexandre Julliard
parent 840434acd0
commit ff58be5c7f
11 changed files with 130 additions and 78 deletions

View File

@ -201,12 +201,12 @@ HANDLE FILE_DupUnixHandle( int fd, DWORD access )
/*********************************************************************** /***********************************************************************
* FILE_GetUnixHandle * FILE_GetUnixHandleType
* *
* Retrieve the Unix handle corresponding to a file handle. * Retrieve the Unix handle corresponding to a file handle.
* Returns -1 on failure. * Returns -1 on failure.
*/ */
int FILE_GetUnixHandle( HANDLE handle, DWORD access ) int FILE_GetUnixHandleType( HANDLE handle, DWORD access, DWORD *type )
{ {
int ret, fd = -1; int ret, fd = -1;
@ -216,7 +216,11 @@ int FILE_GetUnixHandle( HANDLE handle, DWORD access )
{ {
req->handle = handle; req->handle = handle;
req->access = access; req->access = access;
if (!(ret = SERVER_CALL_ERR())) fd = req->fd; if (!(ret = SERVER_CALL_ERR()))
{
fd = req->fd;
if (type) *type = req->type;
}
} }
SERVER_END_REQ; SERVER_END_REQ;
if (ret) return -1; if (ret) return -1;
@ -234,6 +238,16 @@ int FILE_GetUnixHandle( HANDLE handle, DWORD access )
return fd; return fd;
} }
/***********************************************************************
* FILE_GetUnixHandle
*
* Retrieve the Unix handle corresponding to a file handle.
* Returns -1 on failure.
*/
int FILE_GetUnixHandle( HANDLE handle, DWORD access )
{
return FILE_GetUnixHandleType(handle, access, NULL);
}
/************************************************************************* /*************************************************************************
* FILE_OpenConsole * FILE_OpenConsole

View File

@ -570,7 +570,12 @@ struct get_handle_fd_request
handle_t handle; handle_t handle;
unsigned int access; unsigned int access;
int fd; int fd;
int type;
}; };
#define FD_TYPE_INVALID 0
#define FD_TYPE_DEFAULT 1
#define FD_TYPE_CONSOLE 2
#define FD_TYPE_OVERLAPPED 3
@ -1912,6 +1917,6 @@ union generic_request
struct get_window_tree_request get_window_tree; struct get_window_tree_request get_window_tree;
}; };
#define SERVER_PROTOCOL_VERSION 53 #define SERVER_PROTOCOL_VERSION 54
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */ #endif /* __WINE_WINE_SERVER_PROTOCOL_H */

View File

@ -355,6 +355,8 @@ static int console_input_get_fd( struct object *obj )
static int console_get_info( struct object *obj, struct get_file_info_request *req ) static int console_get_info( struct object *obj, struct get_file_info_request *req )
{ {
if (req)
{
req->type = FILE_TYPE_CHAR; req->type = FILE_TYPE_CHAR;
req->attr = 0; req->attr = 0;
req->access_time = 0; req->access_time = 0;
@ -365,7 +367,8 @@ static int console_get_info( struct object *obj, struct get_file_info_request *r
req->index_high = 0; req->index_high = 0;
req->index_low = 0; req->index_low = 0;
req->serial = 0; req->serial = 0;
return 1; }
return FD_TYPE_CONSOLE;
} }
static void console_input_destroy( struct object *obj ) static void console_input_destroy( struct object *obj )

View File

@ -68,6 +68,9 @@ static int device_get_info( struct object *obj, struct get_file_info_request *re
{ {
struct device *dev = (struct device *)obj; struct device *dev = (struct device *)obj;
assert( obj->ops == &device_ops ); assert( obj->ops == &device_ops );
if (req)
{
req->type = FILE_TYPE_UNKNOWN; req->type = FILE_TYPE_UNKNOWN;
req->attr = dev->id; /* hack! */ req->attr = dev->id; /* hack! */
req->access_time = 0; req->access_time = 0;
@ -78,7 +81,8 @@ static int device_get_info( struct object *obj, struct get_file_info_request *re
req->index_high = 0; req->index_high = 0;
req->index_low = 0; req->index_low = 0;
req->serial = 0; req->serial = 0;
return 1; }
return FD_TYPE_DEFAULT;
} }
/* create a device */ /* create a device */

View File

@ -268,10 +268,12 @@ static int file_get_info( struct object *obj, struct get_file_info_request *req
struct file *file = (struct file *)obj; struct file *file = (struct file *)obj;
assert( obj->ops == &file_ops ); assert( obj->ops == &file_ops );
if (req)
{
if (fstat( file->obj.fd, &st ) == -1) if (fstat( file->obj.fd, &st ) == -1)
{ {
file_set_error(); file_set_error();
return 0; return FD_TYPE_INVALID;
} }
if (S_ISCHR(st.st_mode) || S_ISFIFO(st.st_mode) || if (S_ISCHR(st.st_mode) || S_ISFIFO(st.st_mode) ||
S_ISSOCK(st.st_mode) || isatty(file->obj.fd)) req->type = FILE_TYPE_CHAR; S_ISSOCK(st.st_mode) || isatty(file->obj.fd)) req->type = FILE_TYPE_CHAR;
@ -295,7 +297,8 @@ static int file_get_info( struct object *obj, struct get_file_info_request *req
req->index_high = st.st_dev; req->index_high = st.st_dev;
req->index_low = st.st_ino; req->index_low = st.st_ino;
req->serial = 0; /* FIXME */ req->serial = 0; /* FIXME */
return 1; }
return FD_TYPE_DEFAULT;
} }
static void file_destroy( struct object *obj ) static void file_destroy( struct object *obj )
@ -501,6 +504,7 @@ DECL_HANDLER(get_handle_fd)
if ((fd = obj->ops->get_fd( obj )) != -1) if ((fd = obj->ops->get_fd( obj )) != -1)
send_client_fd( current->process, fd, req->handle ); send_client_fd( current->process, fd, req->handle );
} }
req->type = obj->ops->get_file_info( obj, NULL );
release_object( obj ); release_object( obj );
} }
} }

View File

@ -33,6 +33,7 @@ struct mapping
}; };
static int mapping_get_fd( struct object *obj ); static int mapping_get_fd( struct object *obj );
static int mapping_get_info( struct object *obj, struct get_file_info_request *req );
static void mapping_dump( struct object *obj, int verbose ); static void mapping_dump( struct object *obj, int verbose );
static void mapping_destroy( struct object *obj ); static void mapping_destroy( struct object *obj );
@ -48,7 +49,7 @@ static const struct object_ops mapping_ops =
NULL, /* poll_event */ NULL, /* poll_event */
mapping_get_fd, /* get_fd */ mapping_get_fd, /* get_fd */
no_flush, /* flush */ no_flush, /* flush */
no_get_file_info, /* get_file_info */ mapping_get_info, /* get_file_info */
mapping_destroy /* destroy */ mapping_destroy /* destroy */
}; };
@ -309,6 +310,16 @@ static int mapping_get_fd( struct object *obj )
return get_mmap_fd( mapping->file ); return get_mmap_fd( mapping->file );
} }
static int mapping_get_info( struct object *obj, struct get_file_info_request *req )
{
struct mapping *mapping = (struct mapping *)obj;
struct object *file = (struct object *)mapping->file;
assert( obj->ops == &mapping_ops );
assert( file );
return file->ops->get_file_info( file, req );
}
static void mapping_destroy( struct object *obj ) static void mapping_destroy( struct object *obj )
{ {
struct mapping *mapping = (struct mapping *)obj; struct mapping *mapping = (struct mapping *)obj;

View File

@ -266,7 +266,7 @@ int no_flush( struct object *obj )
int no_get_file_info( struct object *obj, struct get_file_info_request *info ) int no_get_file_info( struct object *obj, struct get_file_info_request *info )
{ {
set_error( STATUS_OBJECT_TYPE_MISMATCH ); set_error( STATUS_OBJECT_TYPE_MISMATCH );
return 0; return FD_TYPE_INVALID;
} }
void no_destroy( struct object *obj ) void no_destroy( struct object *obj )

View File

@ -126,6 +126,8 @@ static int pipe_get_fd( struct object *obj )
static int pipe_get_info( struct object *obj, struct get_file_info_request *req ) static int pipe_get_info( struct object *obj, struct get_file_info_request *req )
{ {
if (req)
{
req->type = FILE_TYPE_PIPE; req->type = FILE_TYPE_PIPE;
req->attr = 0; req->attr = 0;
req->access_time = 0; req->access_time = 0;
@ -136,7 +138,8 @@ static int pipe_get_info( struct object *obj, struct get_file_info_request *req
req->index_high = 0; req->index_high = 0;
req->index_low = 0; req->index_low = 0;
req->serial = 0; req->serial = 0;
return 1; }
return FD_TYPE_DEFAULT;
} }
static void pipe_destroy( struct object *obj ) static void pipe_destroy( struct object *obj )

View File

@ -526,7 +526,12 @@ enum event_op { PULSE_EVENT, SET_EVENT, RESET_EVENT };
unsigned int access; /* wanted access rights */ unsigned int access; /* wanted access rights */
@REPLY @REPLY
int fd; /* file descriptor */ int fd; /* file descriptor */
int type; /* the type of file */
@END @END
#define FD_TYPE_INVALID 0
#define FD_TYPE_DEFAULT 1
#define FD_TYPE_CONSOLE 2
#define FD_TYPE_OVERLAPPED 3
/* Set a file current position */ /* Set a file current position */

View File

@ -160,7 +160,8 @@ 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 )
{ {
assert( obj->ops == &serial_ops ); if (req)
{
req->type = FILE_TYPE_CHAR; req->type = FILE_TYPE_CHAR;
req->attr = 0; req->attr = 0;
req->access_time = 0; req->access_time = 0;
@ -171,7 +172,8 @@ static int serial_get_info( struct object *obj, struct get_file_info_request *re
req->index_high = 0; req->index_high = 0;
req->index_low = 0; req->index_low = 0;
req->serial = 0; req->serial = 0;
return 1; }
return FD_TYPE_DEFAULT;
} }
/* these function calculates the timeout for an async operation /* these function calculates the timeout for an async operation

View File

@ -713,7 +713,8 @@ static void dump_get_handle_fd_request( const struct get_handle_fd_request *req
static void dump_get_handle_fd_reply( const struct get_handle_fd_request *req ) static void dump_get_handle_fd_reply( const struct get_handle_fd_request *req )
{ {
fprintf( stderr, " fd=%d", req->fd ); fprintf( stderr, " fd=%d,", req->fd );
fprintf( stderr, " type=%d", req->type );
} }
static void dump_set_file_pointer_request( const struct set_file_pointer_request *req ) static void dump_set_file_pointer_request( const struct set_file_pointer_request *req )