Fetch a handle type in FILE_GetUnixHandle.

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 );
     }
 }