Fetch a handle type in FILE_GetUnixHandle.
diff --git a/server/console.c b/server/console.c
index 1561070..6aab563 100644
--- a/server/console.c
+++ b/server/console.c
@@ -355,17 +355,20 @@
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 )
diff --git a/server/device.c b/server/device.c
index 5c19734..80c6af5 100644
--- a/server/device.c
+++ b/server/device.c
@@ -68,17 +68,21 @@
{
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 */
diff --git a/server/file.c b/server/file.c
index 8a96630..c79efa6 100644
--- a/server/file.c
+++ b/server/file.c
@@ -268,34 +268,37 @@
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 (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 */
}
- 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 */
- return 1;
+ return FD_TYPE_DEFAULT;
}
static void file_destroy( struct object *obj )
@@ -501,6 +504,7 @@
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 );
}
}
diff --git a/server/mapping.c b/server/mapping.c
index c87c6d3..8dbe2e0 100644
--- a/server/mapping.c
+++ b/server/mapping.c
@@ -33,6 +33,7 @@
};
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 @@
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 @@
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;
diff --git a/server/object.c b/server/object.c
index ba2bce8..a6dd908 100644
--- a/server/object.c
+++ b/server/object.c
@@ -266,7 +266,7 @@
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 )
diff --git a/server/pipe.c b/server/pipe.c
index 8ade625..d1b2d42 100644
--- a/server/pipe.c
+++ b/server/pipe.c
@@ -126,17 +126,20 @@
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 )
diff --git a/server/protocol.def b/server/protocol.def
index 010d2ed..e519beb 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -526,7 +526,12 @@
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 */
diff --git a/server/serial.c b/server/serial.c
index 614be00..d6a1ea4 100644
--- a/server/serial.c
+++ b/server/serial.c
@@ -160,18 +160,20 @@
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
diff --git a/server/trace.c b/server/trace.c
index 66d58f9..eeb323c 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -713,7 +713,8 @@
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 )