Commit ff58be5c authored by Mike McCormack's avatar Mike McCormack Committed by Alexandre Julliard

Fetch a handle type in FILE_GetUnixHandle.

parent 840434ac
......@@ -201,12 +201,12 @@ HANDLE FILE_DupUnixHandle( int fd, DWORD access )
/***********************************************************************
* FILE_GetUnixHandle
* FILE_GetUnixHandleType
*
* Retrieve the Unix handle corresponding to a file handle.
* Returns -1 on failure.
*/
int FILE_GetUnixHandle( HANDLE handle, DWORD access )
int FILE_GetUnixHandleType( HANDLE handle, DWORD access, DWORD *type )
{
int ret, fd = -1;
......@@ -216,7 +216,11 @@ int FILE_GetUnixHandle( HANDLE handle, DWORD access )
{
req->handle = handle;
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;
if (ret) return -1;
......@@ -234,6 +238,16 @@ int FILE_GetUnixHandle( HANDLE handle, DWORD access )
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
......
......@@ -570,7 +570,12 @@ struct get_handle_fd_request
handle_t handle;
unsigned int access;
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;
};
#define SERVER_PROTOCOL_VERSION 53
#define SERVER_PROTOCOL_VERSION 54
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */
......@@ -355,17 +355,20 @@ static int console_input_get_fd( struct object *obj )
static int console_get_info( struct object *obj, struct get_file_info_request *req )
{
req->type = FILE_TYPE_CHAR;
req->attr = 0;
req->access_time = 0;
req->write_time = 0;
req->size_high = 0;
req->size_low = 0;
req->links = 0;
req->index_high = 0;
req->index_low = 0;
req->serial = 0;
return 1;
if (req)
{
req->type = FILE_TYPE_CHAR;
req->attr = 0;
req->access_time = 0;
req->write_time = 0;
req->size_high = 0;
req->size_low = 0;
req->links = 0;
req->index_high = 0;
req->index_low = 0;
req->serial = 0;
}
return FD_TYPE_CONSOLE;
}
static void console_input_destroy( struct object *obj )
......
......@@ -68,17 +68,21 @@ static int device_get_info( struct object *obj, struct get_file_info_request *re
{
struct device *dev = (struct device *)obj;
assert( obj->ops == &device_ops );
req->type = FILE_TYPE_UNKNOWN;
req->attr = dev->id; /* hack! */
req->access_time = 0;
req->write_time = 0;
req->size_high = 0;
req->size_low = 0;
req->links = 0;
req->index_high = 0;
req->index_low = 0;
req->serial = 0;
return 1;
if (req)
{
req->type = FILE_TYPE_UNKNOWN;
req->attr = dev->id; /* hack! */
req->access_time = 0;
req->write_time = 0;
req->size_high = 0;
req->size_low = 0;
req->links = 0;
req->index_high = 0;
req->index_low = 0;
req->serial = 0;
}
return FD_TYPE_DEFAULT;
}
/* create a device */
......
......@@ -268,34 +268,37 @@ static int file_get_info( struct object *obj, struct get_file_info_request *req
struct file *file = (struct file *)obj;
assert( obj->ops == &file_ops );
if (fstat( file->obj.fd, &st ) == -1)
if (req)
{
file_set_error();
return 0;
}
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;
else req->type = FILE_TYPE_DISK;
if (S_ISDIR(st.st_mode)) req->attr = FILE_ATTRIBUTE_DIRECTORY;
else req->attr = FILE_ATTRIBUTE_ARCHIVE;
if (!(st.st_mode & S_IWUSR)) req->attr |= FILE_ATTRIBUTE_READONLY;
req->access_time = st.st_atime;
req->write_time = st.st_mtime;
if (S_ISDIR(st.st_mode))
{
req->size_high = 0;
req->size_low = 0;
}
else
{
req->size_high = st.st_size >> 32;
req->size_low = st.st_size & 0xffffffff;
if (fstat( file->obj.fd, &st ) == -1)
{
file_set_error();
return FD_TYPE_INVALID;
}
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;
else req->type = FILE_TYPE_DISK;
if (S_ISDIR(st.st_mode)) req->attr = FILE_ATTRIBUTE_DIRECTORY;
else req->attr = FILE_ATTRIBUTE_ARCHIVE;
if (!(st.st_mode & S_IWUSR)) req->attr |= FILE_ATTRIBUTE_READONLY;
req->access_time = st.st_atime;
req->write_time = st.st_mtime;
if (S_ISDIR(st.st_mode))
{
req->size_high = 0;
req->size_low = 0;
}
else
{
req->size_high = st.st_size >> 32;
req->size_low = st.st_size & 0xffffffff;
}
req->links = st.st_nlink;
req->index_high = st.st_dev;
req->index_low = st.st_ino;
req->serial = 0; /* FIXME */
}
req->links = st.st_nlink;
req->index_high = st.st_dev;
req->index_low = st.st_ino;
req->serial = 0; /* FIXME */
return 1;
return FD_TYPE_DEFAULT;
}
static void file_destroy( struct object *obj )
......@@ -501,6 +504,7 @@ DECL_HANDLER(get_handle_fd)
if ((fd = obj->ops->get_fd( obj )) != -1)
send_client_fd( current->process, fd, req->handle );
}
req->type = obj->ops->get_file_info( obj, NULL );
release_object( obj );
}
}
......
......@@ -33,6 +33,7 @@ struct mapping
};
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_destroy( struct object *obj );
......@@ -48,7 +49,7 @@ static const struct object_ops mapping_ops =
NULL, /* poll_event */
mapping_get_fd, /* get_fd */
no_flush, /* flush */
no_get_file_info, /* get_file_info */
mapping_get_info, /* get_file_info */
mapping_destroy /* destroy */
};
......@@ -309,6 +310,16 @@ static int mapping_get_fd( struct object *obj )
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 )
{
struct mapping *mapping = (struct mapping *)obj;
......
......@@ -266,7 +266,7 @@ int no_flush( struct object *obj )
int no_get_file_info( struct object *obj, struct get_file_info_request *info )
{
set_error( STATUS_OBJECT_TYPE_MISMATCH );
return 0;
return FD_TYPE_INVALID;
}
void no_destroy( struct object *obj )
......
......@@ -126,17 +126,20 @@ static int pipe_get_fd( struct object *obj )
static int pipe_get_info( struct object *obj, struct get_file_info_request *req )
{
req->type = FILE_TYPE_PIPE;
req->attr = 0;
req->access_time = 0;
req->write_time = 0;
req->size_high = 0;
req->size_low = 0;
req->links = 0;
req->index_high = 0;
req->index_low = 0;
req->serial = 0;
return 1;
if (req)
{
req->type = FILE_TYPE_PIPE;
req->attr = 0;
req->access_time = 0;
req->write_time = 0;
req->size_high = 0;
req->size_low = 0;
req->links = 0;
req->index_high = 0;
req->index_low = 0;
req->serial = 0;
}
return FD_TYPE_DEFAULT;
}
static void pipe_destroy( struct object *obj )
......
......@@ -526,7 +526,12 @@ enum event_op { PULSE_EVENT, SET_EVENT, RESET_EVENT };
unsigned int access; /* wanted access rights */
@REPLY
int fd; /* file descriptor */
int type; /* the type of file */
@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 */
......
......@@ -160,18 +160,20 @@ static int serial_get_fd( struct object *obj )
static int serial_get_info( struct object *obj, struct get_file_info_request *req )
{
assert( obj->ops == &serial_ops );
req->type = FILE_TYPE_CHAR;
req->attr = 0;
req->access_time = 0;
req->write_time = 0;
req->size_high = 0;
req->size_low = 0;
req->links = 0;
req->index_high = 0;
req->index_low = 0;
req->serial = 0;
return 1;
if (req)
{
req->type = FILE_TYPE_CHAR;
req->attr = 0;
req->access_time = 0;
req->write_time = 0;
req->size_high = 0;
req->size_low = 0;
req->links = 0;
req->index_high = 0;
req->index_low = 0;
req->serial = 0;
}
return FD_TYPE_DEFAULT;
}
/* these function calculates the timeout for an async operation
......
......@@ -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 )
{
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 )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment