X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Ffdset.c;h=a4823e6659623602d71227929e797d83d87e38ef;hp=46f7773a9ed198c87b3ac2b8db7df27004322f47;hb=86e97d599f8b1ca379dce64fadac9b8f6b002ac5;hpb=a34bf9db5da0fdd6bdb14459e203dbe41ee99614 diff --git a/src/shared/fdset.c b/src/shared/fdset.c index 46f7773a9..a4823e665 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" @@ -33,7 +32,7 @@ #define MAKE_SET(s) ((Set*) s) #define MAKE_FDSET(s) ((FDSet*) s) -/* Make sure we can distuingish fd 0 and NULL */ +/* Make sure we can distinguish fd 0 and NULL */ #define FD_TO_PTR(fd) INT_TO_PTR((fd)+1) #define PTR_TO_FD(p) (PTR_TO_INT(p)-1) @@ -41,7 +40,31 @@ FDSet *fdset_new(void) { 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; @@ -223,10 +260,23 @@ 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; - p = set_iterate(MAKE_SET(s), i); + if (!set_iterate(MAKE_SET(s), i, &p)) + return -ENOENT; + + return PTR_TO_FD(p); +} + +int fdset_steal_first(FDSet *fds) { + void *p; + + p = set_steal_first(MAKE_SET(fds)); if (!p) return -ENOENT;