X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Ffdset.c;h=31849272bd314e165d9937354c3cba97e84978bf;hp=a2c861de3f4b0486f7fbb742e717237555b16c09;hb=8eb444001b790b0c16369ceb1420afde4c1e5b24;hpb=03e334a1c7dc8c20c38902aa039440763acc9b17 diff --git a/src/shared/fdset.c b/src/shared/fdset.c index a2c861de3..31849272b 100644 --- a/src/shared/fdset.c +++ b/src/shared/fdset.c @@ -22,7 +22,6 @@ #include #include #include -#include #include "set.h" #include "util.h" @@ -38,10 +37,34 @@ #define PTR_TO_FD(p) (PTR_TO_INT(p)-1) FDSet *fdset_new(void) { - return MAKE_FDSET(set_new(trivial_hash_func, trivial_compare_func)); + return MAKE_FDSET(set_new(NULL)); } -void fdset_free(FDSet *s) { +int fdset_new_array(FDSet **ret, int *fds, unsigned n_fds) { + unsigned i; + FDSet *s; + int r; + + assert(ret); + + s = fdset_new(); + if (!s) + return -ENOMEM; + + for (i = 0; i < n_fds; i++) { + + r = fdset_put(s, fds[i]); + if (r < 0) { + set_free(MAKE_SET(s)); + return r; + } + } + + *ret = s; + return 0; +} + +FDSet* fdset_free(FDSet *s) { void *p; while ((p = set_steal_first(MAKE_SET(s)))) { @@ -61,6 +84,7 @@ void fdset_free(FDSet *s) { } set_free(MAKE_SET(s)); + return NULL; } int fdset_put(FDSet *s, int fd) { @@ -70,6 +94,19 @@ int fdset_put(FDSet *s, int fd) { return set_put(MAKE_SET(s), FD_TO_PTR(fd)); } +int fdset_consume(FDSet *s, int fd) { + int r; + + assert(s); + assert(fd >= 0); + + r = fdset_put(s, fd); + if (r <= 0) + safe_close(fd); + + return r; +} + int fdset_put_dup(FDSet *s, int fd) { int copy, r; @@ -104,7 +141,7 @@ int fdset_remove(FDSet *s, int fd) { } int fdset_new_fill(FDSet **_s) { - DIR *d; + _cleanup_closedir_ DIR *d = NULL; struct dirent *de; int r = 0; FDSet *s; @@ -127,7 +164,7 @@ int fdset_new_fill(FDSet **_s) { while ((de = readdir(d))) { int fd = -1; - if (ignore_file(de->d_name)) + if (hidden_file(de->d_name)) continue; r = safe_atoi(de->d_name, &fd); @@ -150,8 +187,6 @@ int fdset_new_fill(FDSet **_s) { s = NULL; finish: - closedir(d); - /* We won't close the fds here! */ if (s) set_free(MAKE_SET(s)); @@ -225,6 +260,10 @@ unsigned fdset_size(FDSet *fds) { return set_size(MAKE_SET(fds)); } +bool fdset_isempty(FDSet *fds) { + return set_isempty(MAKE_SET(fds)); +} + int fdset_iterate(FDSet *s, Iterator *i) { void *p; @@ -234,3 +273,13 @@ int fdset_iterate(FDSet *s, Iterator *i) { return PTR_TO_FD(p); } + +int fdset_steal_first(FDSet *fds) { + void *p; + + p = set_steal_first(MAKE_SET(fds)); + if (!p) + return -ENOENT; + + return PTR_TO_FD(p); +}