X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibudev%2Flibudev-util.c;h=291829e6d89ce7ea8d7856b1a8b37f898586c2d5;hb=9c89c1cabd0357fa4e58a91c4d9233702896b709;hp=b5b9db67fc5dcb65cb9cd4ac1aa3d39e68cb231b;hpb=8f6ce71fe79d897b67157d92869db87ee2042af6;p=elogind.git diff --git a/src/libudev/libudev-util.c b/src/libudev/libudev-util.c index b5b9db67f..291829e6d 100644 --- a/src/libudev/libudev-util.c +++ b/src/libudev/libudev-util.c @@ -36,6 +36,7 @@ #include "libudev.h" #include "libudev-private.h" #include "utf8.h" +#include "MurmurHash2.h" /** * SECTION:libudev-util @@ -44,102 +45,6 @@ * Utilities useful when dealing with devices and device node names. */ -int util_delete_path(struct udev *udev, const char *path) -{ - char p[UTIL_PATH_SIZE]; - char *pos; - int err = 0; - - if (path[0] == '/') - while(path[1] == '/') - path++; - strscpy(p, sizeof(p), path); - pos = strrchr(p, '/'); - if (pos == p || pos == NULL) - return 0; - - for (;;) { - *pos = '\0'; - pos = strrchr(p, '/'); - - /* don't remove the last one */ - if ((pos == p) || (pos == NULL)) - break; - - err = rmdir(p); - if (err < 0) { - if (errno == ENOENT) - err = 0; - break; - } - } - return err; -} - -uid_t util_lookup_user(struct udev *udev, const char *user) -{ - char *endptr; - struct passwd pwbuf; - struct passwd *pw; - uid_t uid; - size_t buflen = sysconf(_SC_GETPW_R_SIZE_MAX); - char *buf = alloca(buflen); - - if (streq(user, "root")) - return 0; - uid = strtoul(user, &endptr, 10); - if (endptr[0] == '\0') - return uid; - - errno = getpwnam_r(user, &pwbuf, buf, buflen, &pw); - if (pw != NULL) - return pw->pw_uid; - if (errno == 0 || errno == ENOENT || errno == ESRCH) - udev_err(udev, "specified user '%s' unknown\n", user); - else - udev_err(udev, "error resolving user '%s': %m\n", user); - return 0; -} - -gid_t util_lookup_group(struct udev *udev, const char *group) -{ - char *endptr; - struct group grbuf; - struct group *gr; - gid_t gid = 0; - size_t buflen = sysconf(_SC_GETPW_R_SIZE_MAX); - char *buf = NULL; - - if (streq(group, "root")) - return 0; - gid = strtoul(group, &endptr, 10); - if (endptr[0] == '\0') - return gid; - gid = 0; - for (;;) { - char *newbuf; - - newbuf = realloc(buf, buflen); - if (!newbuf) - break; - buf = newbuf; - errno = getgrnam_r(group, &grbuf, buf, buflen, &gr); - if (gr != NULL) { - gid = gr->gr_gid; - } else if (errno == ERANGE) { - buflen *= 2; - continue; - } else if (errno == 0 || errno == ENOENT || errno == ESRCH) { - udev_err(udev, "specified group '%s' unknown\n", group); - } else { - udev_err(udev, "error resolving group '%s': %m\n", group); - } - break; - } - free(buf); - return gid; -} - /* handle "[/]" format */ int util_resolve_subsys_kernel(struct udev *udev, const char *string, char *result, size_t maxsize, int read_value) @@ -188,7 +93,7 @@ int util_resolve_subsys_kernel(struct udev *udev, const char *string, strscpy(result, maxsize, val); else result[0] = '\0'; - udev_dbg(udev, "value '[%s/%s]%s' is '%s'\n", subsys, sysname, attr, result); + log_debug("value '[%s/%s]%s' is '%s'", subsys, sysname, attr, result); } else { size_t l; char *s; @@ -197,11 +102,12 @@ int util_resolve_subsys_kernel(struct udev *udev, const char *string, l = strpcpyl(&s, maxsize, udev_device_get_syspath(dev), NULL); if (attr != NULL) strpcpyl(&s, l, "/", attr, NULL); - udev_dbg(udev, "path '[%s/%s]%s' is '%s'\n", subsys, sysname, attr, result); + log_debug("path '[%s/%s]%s' is '%s'", subsys, sysname, attr, result); } udev_device_unref(dev); return 0; } + ssize_t util_get_sys_core_link_value(struct udev *udev, const char *slink, const char *syspath, char *value, size_t size) { char path[UTIL_PATH_SIZE]; @@ -253,16 +159,15 @@ int util_log_priority(const char *priority) char *endptr; int prio; - prio = strtol(priority, &endptr, 10); - if (endptr[0] == '\0' || isspace(endptr[0])) - return prio; - if (startswith(priority, "err")) - return LOG_ERR; - if (startswith(priority, "info")) - return LOG_INFO; - if (startswith(priority, "debug")) - return LOG_DEBUG; - return 0; + prio = strtoul(priority, &endptr, 10); + if (endptr[0] == '\0' || isspace(endptr[0])) { + if (prio >= 0 && prio <= 7) + return prio; + else + return -ERANGE; + } + + return log_level_from_string(priority); } size_t util_path_encode(const char *src, char *dest, size_t size) @@ -396,64 +301,9 @@ _public_ int udev_util_encode_string(const char *str, char *str_enc, size_t len) return encode_devnode_name(str, str_enc, len); } -/* - * http://sites.google.com/site/murmurhash/ - * - * All code is released to the public domain. For business purposes, - * Murmurhash is under the MIT license. - * - */ -static unsigned int murmur_hash2(const char *key, size_t len, unsigned int seed) -{ - /* - * 'm' and 'r' are mixing constants generated offline. - * They're not really 'magic', they just happen to work well. - */ - const unsigned int m = 0x5bd1e995; - const int r = 24; - - /* initialize the hash to a 'random' value */ - unsigned int h = seed ^ len; - - /* mix 4 bytes at a time into the hash */ - const unsigned char * data = (const unsigned char *)key; - - while(len >= sizeof(unsigned int)) { - unsigned int k; - - memcpy(&k, data, sizeof(k)); - k *= m; - k ^= k >> r; - k *= m; - h *= m; - h ^= k; - - data += sizeof(k); - len -= sizeof(k); - } - - /* handle the last few bytes of the input array */ - switch(len) { - case 3: - h ^= data[2] << 16; - case 2: - h ^= data[1] << 8; - case 1: - h ^= data[0]; - h *= m; - }; - - /* do a few final mixes of the hash to ensure the last few bytes are well-incorporated */ - h ^= h >> 13; - h *= m; - h ^= h >> 15; - - return h; -} - unsigned int util_string_hash32(const char *str) { - return murmur_hash2(str, strlen(str), 0); + return MurmurHash2(str, strlen(str), 0); } /* get a bunch of bit numbers out of the hash, and set the bits in our bit field */ @@ -468,28 +318,3 @@ uint64_t util_string_bloom64(const char *str) bits |= 1LLU << ((hash >> 18) & 63); return bits; } - -ssize_t print_kmsg(const char *fmt, ...) -{ - int fd; - va_list ap; - char text[1024]; - ssize_t len; - ssize_t ret; - - fd = open("/dev/kmsg", O_WRONLY|O_NOCTTY|O_CLOEXEC); - if (fd < 0) - return -errno; - - len = snprintf(text, sizeof(text), "<30>systemd-udevd[%u]: ", getpid()); - - va_start(ap, fmt); - len += vsnprintf(text + len, sizeof(text) - len, fmt, ap); - va_end(ap); - - ret = write(fd, text, len); - if (ret < 0) - ret = -errno; - close(fd); - return ret; -}