#include <sys/stat.h>
#include <sys/param.h>
+#include "device-nodes.h"
#include "libudev.h"
#include "libudev-private.h"
#include "utf8.h"
+#include "MurmurHash2.h"
/**
* SECTION:libudev-util
* 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 "[<SUBSYSTEM>/<KERNEL>]<attribute>" format */
int util_resolve_subsys_kernel(struct udev *udev, const char *string,
char *result, size_t maxsize, int read_value)
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];
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;
+
+ return log_level_from_string(priority);
}
size_t util_path_encode(const char *src, char *dest, size_t size)
while (str[i] != '\0') {
int len;
- if (is_utf8_encoding_whitelisted(str[i], white)) {
+ if (whitelisted_char_for_devnode(str[i], white)) {
i++;
continue;
}
**/
_public_ int udev_util_encode_string(const char *str, char *str_enc, size_t len)
{
- return udev_encode_string(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;
+ return encode_devnode_name(str, str_enc, len);
}
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 */
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;
-}