summaryrefslogtreecommitdiff
path: root/src/ipcpd/unicast/pff/pft.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ipcpd/unicast/pff/pft.c')
-rw-r--r--src/ipcpd/unicast/pff/pft.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/ipcpd/unicast/pff/pft.c b/src/ipcpd/unicast/pff/pft.c
index d0e562d6..2a295a40 100644
--- a/src/ipcpd/unicast/pff/pft.c
+++ b/src/ipcpd/unicast/pff/pft.c
@@ -91,6 +91,43 @@ void pft_destroy(struct pft * pft)
free(pft);
}
+void pft_del_fd(struct pft * pft,
+ int fd)
+{
+ unsigned int i;
+ struct list_head * p;
+ struct list_head * h;
+ struct pft_entry * entry;
+ size_t j;
+ size_t n;
+
+ assert(pft);
+
+ for (i = 0; i < pft->buckets_size; i++) {
+ list_for_each_safe(p, h, &(pft->buckets[i])) {
+ entry = list_entry(p, struct pft_entry, next);
+
+ n = 0;
+ for (j = 0; j < entry->len; j++) {
+ if (entry->fds[j] != fd)
+ entry->fds[n++] = entry->fds[j];
+ }
+
+ if (n == entry->len)
+ continue;
+
+ if (n > 0) {
+ entry->len = n;
+ continue;
+ }
+
+ list_del(&entry->next);
+ free(entry->fds);
+ free(entry);
+ }
+ }
+}
+
void pft_flush(struct pft * pft)
{
unsigned int i;