Added an inode object to keep track of all file descriptors open for a
given file.
Plugged a couple of potential file descriptor leaks.

diff --git a/server/serial.c b/server/serial.c
index 2f9130b..3831b7e 100644
--- a/server/serial.c
+++ b/server/serial.c
@@ -150,25 +150,27 @@
        if(0>fcntl(fd, F_SETFL, 0))
            perror("fcntl");
 
-    if ((serial = alloc_object( &serial_ops )))
+    if (!(serial = alloc_object( &serial_ops )))
     {
-        serial->attrib       = attributes;
-        serial->access       = access;
-        serial->readinterval = 0;
-        serial->readmult     = 0;
-        serial->readconst    = 0;
-        serial->writemult    = 0;
-        serial->writeconst   = 0;
-        serial->eventmask    = 0;
-        serial->commerror    = 0;
-        init_async_queue(&serial->read_q);
-        init_async_queue(&serial->write_q);
-        init_async_queue(&serial->wait_q);
-        if (!(serial->fd = alloc_fd( &serial_fd_ops, fd, &serial->obj )))
-        {
-            release_object( serial );
-            return NULL;
-        }
+        close( fd );
+        return NULL;
+    }
+    serial->attrib       = attributes;
+    serial->access       = access;
+    serial->readinterval = 0;
+    serial->readmult     = 0;
+    serial->readconst    = 0;
+    serial->writemult    = 0;
+    serial->writeconst   = 0;
+    serial->eventmask    = 0;
+    serial->commerror    = 0;
+    init_async_queue(&serial->read_q);
+    init_async_queue(&serial->write_q);
+    init_async_queue(&serial->wait_q);
+    if (!(serial->fd = create_anonymous_fd( &serial_fd_ops, fd, &serial->obj )))
+    {
+        release_object( serial );
+        return NULL;
     }
     return serial;
 }