From 9d99a7699d7021a1c219d6553e037ac7ba4a5a37 Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Fri, 21 Aug 2009 16:06:11 +0200 Subject: conntrackd: allow to remove file descriptors from set With this patch, we can remove file descriptors dinamically from our own file descriptor pool. Signed-off-by: Pablo Neira Ayuso --- src/fds.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) (limited to 'src') diff --git a/src/fds.c b/src/fds.c index fac3482..6304fcd 100644 --- a/src/fds.c +++ b/src/fds.c @@ -27,20 +27,66 @@ struct fds *create_fds(void) if (fds == NULL) return NULL; + INIT_LIST_HEAD(&fds->list); + return fds; } void destroy_fds(struct fds *fds) { + struct fds_item *this, *tmp; + + list_for_each_entry_safe(this, tmp, &fds->list, head) { + list_del(&this->head); + FD_CLR(this->fd, &fds->readfds); + free(this); + } free(fds); } int register_fd(int fd, struct fds *fds) { + struct fds_item *item; + FD_SET(fd, &fds->readfds); if (fd > fds->maxfd) fds->maxfd = fd; + item = calloc(sizeof(struct fds_item), 1); + if (item == NULL) + return -1; + + item->fd = fd; + list_add(&item->head, &fds->list); + return 0; } + +int unregister_fd(int fd, struct fds *fds) +{ + int found = 0, maxfd = -1; + struct fds_item *this, *tmp; + + list_for_each_entry_safe(this, tmp, &fds->list, head) { + if (this->fd == fd) { + list_del(&this->head); + FD_CLR(this->fd, &fds->readfds); + free(this); + found = 1; + /* ... and recalculate maxfd, see below. */ + } + } + /* not found, report an error. */ + if (!found) + return -1; + + /* calculate the new maximum fd. */ + list_for_each_entry(this, &fds->list, head) { + if (maxfd < this->fd) { + maxfd = this->fd; + } + } + return 0; +} + -- cgit v1.2.3