Moved all references to file descriptors out of the generic object
structure.
Changed the poll()-related routines to deal with file descriptors
instead of objects and integrated poll support into fd.c.

diff --git a/server/request.c b/server/request.c
index d13c761..a47827b 100644
--- a/server/request.c
+++ b/server/request.c
@@ -73,11 +73,13 @@
 
 struct master_socket
 {
-    struct object        obj;         /* object header */
+    struct object        obj;        /* object header */
+    struct fd           *fd;         /* file descriptor of the master socket */
     struct timeout_user *timeout;    /* timeout on last process exit */
 };
 
 static void master_socket_dump( struct object *obj, int verbose );
+static void master_socket_destroy( struct object *obj );
 static void master_socket_poll_event( struct fd *fd, int event );
 
 static const struct object_ops master_socket_ops =
@@ -89,7 +91,7 @@
     NULL,                          /* signaled */
     NULL,                          /* satisfied */
     no_get_fd,                     /* get_fd */
-    no_destroy                     /* destroy */
+    master_socket_destroy          /* destroy */
 };
 
 static const struct fd_ops master_socket_fd_ops =
@@ -188,7 +190,7 @@
 {
     int ret;
 
-    if ((ret = write( thread->reply_fd,
+    if ((ret = write( get_unix_fd( thread->reply_fd ),
                       (char *)thread->reply_data + thread->reply_size - thread->reply_towrite,
                       thread->reply_towrite )) >= 0)
     {
@@ -197,7 +199,8 @@
             free( thread->reply_data );
             thread->reply_data = NULL;
             /* sent everything, can go back to waiting for requests */
-            change_select_fd( &thread->obj, thread->request_fd, POLLIN );
+            set_fd_events( thread->request_fd, POLLIN );
+            set_fd_events( thread->reply_fd, 0 );
         }
         return;
     }
@@ -214,7 +217,8 @@
 
     if (!current->reply_size)
     {
-        if ((ret = write( current->reply_fd, reply, sizeof(*reply) )) != sizeof(*reply)) goto error;
+        if ((ret = write( get_unix_fd( current->reply_fd ),
+                          reply, sizeof(*reply) )) != sizeof(*reply)) goto error;
     }
     else
     {
@@ -225,12 +229,13 @@
         vec[1].iov_base = current->reply_data;
         vec[1].iov_len  = current->reply_size;
 
-        if ((ret = writev( current->reply_fd, vec, 2 )) < sizeof(*reply)) goto error;
+        if ((ret = writev( get_unix_fd( current->reply_fd ), vec, 2 )) < sizeof(*reply)) goto error;
 
         if ((current->reply_towrite = current->reply_size - (ret - sizeof(*reply))))
         {
             /* couldn't write it all, wait for POLLOUT */
-            change_select_fd( &current->obj, current->reply_fd, POLLOUT );
+            set_fd_events( current->reply_fd, POLLOUT );
+            set_fd_events( current->request_fd, 0 );
             return;
         }
     }
@@ -286,7 +291,7 @@
 
     if (!thread->req_toread)  /* no pending request */
     {
-        if ((ret = read( thread->obj.fd, &thread->req,
+        if ((ret = read( get_unix_fd( thread->request_fd ), &thread->req,
                          sizeof(thread->req) )) != sizeof(thread->req)) goto error;
         if (!(thread->req_toread = thread->req.request_header.request_size))
         {
@@ -301,8 +306,9 @@
     /* read the variable sized data */
     for (;;)
     {
-        ret = read( thread->obj.fd, ((char *)thread->req_data +
-                                     thread->req.request_header.request_size - thread->req_toread),
+        ret = read( get_unix_fd( thread->request_fd ),
+                    (char *)thread->req_data + thread->req.request_header.request_size
+                      - thread->req_toread,
                     thread->req_toread );
         if (ret <= 0) break;
         if (!(thread->req_toread -= ret))
@@ -341,7 +347,7 @@
     myiovec.iov_base = (void *)&data;
     myiovec.iov_len  = sizeof(data);
 
-    ret = recvmsg( process->obj.fd, &msghdr, 0 );
+    ret = recvmsg( get_unix_fd( process->msg_fd ), &msghdr, 0 );
 #ifndef HAVE_MSGHDR_ACCRIGHTS
     fd = cmsg.fd;
 #endif
@@ -411,7 +417,7 @@
     myiovec.iov_base = (void *)&handle;
     myiovec.iov_len  = sizeof(handle);
 
-    ret = sendmsg( process->obj.fd, &msghdr, 0 );
+    ret = sendmsg( get_unix_fd( process->msg_fd ), &msghdr, 0 );
 
     if (ret == sizeof(handle)) return 0;
 
@@ -445,7 +451,14 @@
 {
     struct master_socket *sock = (struct master_socket *)obj;
     assert( obj->ops == &master_socket_ops );
-    fprintf( stderr, "Master socket fd=%p\n", sock->obj.fd_obj );
+    fprintf( stderr, "Master socket fd=%p\n", sock->fd );
+}
+
+static void master_socket_destroy( struct object *obj )
+{
+    struct master_socket *sock = (struct master_socket *)obj;
+    assert( obj->ops == &master_socket_ops );
+    release_object( sock->fd );
 }
 
 /* handle a socket event */
@@ -466,7 +479,7 @@
     {
         struct sockaddr_un dummy;
         int len = sizeof(dummy);
-        int client = accept( master_socket->obj.fd, (struct sockaddr *) &dummy, &len );
+        int client = accept( get_unix_fd( master_socket->fd ), (struct sockaddr *) &dummy, &len );
         if (client == -1) return;
         if (sock->timeout)
         {
@@ -682,10 +695,11 @@
     chmod( server_socket_name, 0600 );  /* make sure no other user can connect */
     if (listen( fd, 5 ) == -1) fatal_perror( "listen" );
 
-    if (!(master_socket = alloc_fd_object( &master_socket_ops, &master_socket_fd_ops, fd )))
+    if (!(master_socket = alloc_object( &master_socket_ops )) ||
+        !(master_socket->fd = alloc_fd( &master_socket_fd_ops, fd, &master_socket->obj )))
         fatal_error( "out of memory\n" );
     master_socket->timeout = NULL;
-    set_select_events( &master_socket->obj, POLLIN );
+    set_fd_events( master_socket->fd, POLLIN );
 }
 
 /* open the master server socket and start waiting for new clients */
@@ -748,7 +762,7 @@
     flush_registry();
 
     /* if a new client is waiting, we keep on running */
-    if (check_fd_events( master_socket->obj.fd_obj, POLLIN )) return;
+    if (check_fd_events( master_socket->fd, POLLIN )) return;
 
     if (debug_level) fprintf( stderr, "wineserver: exiting (pid=%ld)\n", (long) getpid() );
 
@@ -783,5 +797,5 @@
 /* lock/unlock the master socket to stop accepting new clients */
 void lock_master_socket( int locked )
 {
-    set_select_events( &master_socket->obj, locked ? 0 : POLLIN );
+    set_fd_events( master_socket->fd, locked ? 0 : POLLIN );
 }