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