X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Futil.c;h=2f0aba88ae6e1c443f54b1d821ed25d73649a069;hp=42a2e27308f9e42b46268a4b4de1dcf0d9fcffaf;hb=a9e12476ed32256690eb801099c41526834b6390;hpb=1d870ac769c70bae86fed63d9c5a1c42d2af9da3 diff --git a/src/shared/util.c b/src/shared/util.c index 42a2e2730..2f0aba88a 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -6069,3 +6069,27 @@ finish: return 0; } + +/* hey glibc, APIs with callbacks without a user pointer are so useless */ +void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size, + int (*compar) (const void *, const void *, void *), + void *arg) { + size_t l, u, idx; + const void *p; + int comparison; + + l = 0; + u = nmemb; + while (l < u) { + idx = (l + u) / 2; + p = (void *)(((const char *) base) + (idx * size)); + comparison = compar(key, p, arg); + if (comparison < 0) + u = idx; + else if (comparison > 0) + l = idx + 1; + else + return (void *)p; + } + return NULL; +}