X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udev%2Fudev-util.c;h=3d5eb7657c40b812e14b6a395e5e8a0629930710;hp=d17a151966d6aeded44865a3638f6c1c983edbc2;hb=c807ad918c7c61a8af3fcc930cc2a5ad4c978ea1;hpb=d0db192fa5a50eee27bce3e92c89f3ec1294638d diff --git a/udev/udev-util.c b/udev/udev-util.c index d17a15196..3d5eb7657 100644 --- a/udev/udev-util.c +++ b/udev/udev-util.c @@ -29,7 +29,7 @@ #include "udev.h" -int create_path(struct udev *udev, const char *path) +int util_create_path(struct udev *udev, const char *path) { char p[UTIL_PATH_SIZE]; char *pos; @@ -49,7 +49,7 @@ int create_path(struct udev *udev, const char *path) if (stat(p, &stats) == 0 && (stats.st_mode & S_IFMT) == S_IFDIR) return 0; - if (create_path(udev, p) != 0) + if (util_create_path(udev, p) != 0) return -1; dbg(udev, "mkdir '%s'\n", p); @@ -65,7 +65,7 @@ int create_path(struct udev *udev, const char *path) return -1; } -int delete_path(struct udev *udev, const char *path) +int util_delete_path(struct udev *udev, const char *path) { char p[UTIL_PATH_SIZE]; char *pos; @@ -102,7 +102,7 @@ int delete_path(struct udev *udev, const char *path) /* Reset permissions on the device node, before unlinking it to make sure, * that permisions of possible hard links will be removed too. */ -int unlink_secure(struct udev *udev, const char *filename) +int util_unlink_secure(struct udev *udev, const char *filename) { int retval; @@ -124,44 +124,123 @@ int unlink_secure(struct udev *udev, const char *filename) return retval; } -uid_t lookup_user(struct udev *udev, const char *user) +uid_t util_lookup_user(struct udev *udev, const char *user) { + char *endptr; + int buflen = sysconf(_SC_GETPW_R_SIZE_MAX); + char buf[buflen]; + struct passwd pwbuf; struct passwd *pw; - uid_t uid = 0; + uid_t uid; - errno = 0; - pw = getpwnam(user); - if (pw == NULL) { - if (errno == 0 || errno == ENOENT || errno == ESRCH) - err(udev, "specified user '%s' unknown\n", user); - else - err(udev, "error resolving user '%s': %m\n", user); - } else - uid = pw->pw_uid; + if (strcmp(user, "root") == 0) + return 0; + uid = strtoul(user, &endptr, 10); + if (endptr[0] == '\0') + return uid; - return uid; + errno = 0; + getpwnam_r(user, &pwbuf, buf, buflen, &pw); + if (pw != NULL) + return pw->pw_uid; + if (errno == 0 || errno == ENOENT || errno == ESRCH) + err(udev, "specified user '%s' unknown\n", user); + else + err(udev, "error resolving user '%s': %m\n", user); + return 0; } -extern gid_t lookup_group(struct udev *udev, const char *group) +extern gid_t util_lookup_group(struct udev *udev, const char *group) { + char *endptr; + int buflen = sysconf(_SC_GETGR_R_SIZE_MAX); + char buf[buflen]; + struct group grbuf; struct group *gr; gid_t gid = 0; + if (strcmp(group, "root") == 0) + return 0; + gid = strtoul(group, &endptr, 10); + if (endptr[0] == '\0') + return gid; + errno = 0; - gr = getgrnam(group); - if (gr == NULL) { - if (errno == 0 || errno == ENOENT || errno == ESRCH) - err(udev, "specified group '%s' unknown\n", group); - else - err(udev, "error resolving group '%s': %m\n", group); - } else - gid = gr->gr_gid; + getgrnam_r(group, &grbuf, buf, buflen, &gr); + if (gr != NULL) + return gr->gr_gid; + if (errno == 0 || errno == ENOENT || errno == ESRCH) + err(udev, "specified group '%s' unknown\n", group); + else + err(udev, "error resolving group '%s': %m\n", group); + return 0; +} + +/* handle "[/]" format */ +int util_resolve_subsys_kernel(struct udev *udev, const char *string, + char *result, size_t maxsize, int read_value) +{ + char temp[UTIL_PATH_SIZE]; + char *subsys; + char *sysname; + struct udev_device *dev; + char *attr; + + if (string == NULL) + string = result; + if (string[0] != '[') + return -1; + + util_strlcpy(temp, string, sizeof(temp)); - return gid; + subsys = &temp[1]; + + sysname = strchr(subsys, '/'); + if (sysname == NULL) + return -1; + sysname[0] = '\0'; + sysname = &sysname[1]; + + attr = strchr(sysname, ']'); + if (attr == NULL) + return -1; + attr[0] = '\0'; + attr = &attr[1]; + if (attr[0] == '/') + attr = &attr[1]; + if (attr[0] == '\0') + attr = NULL; + + if (read_value && attr == NULL) + return -1; + + dev = udev_device_new_from_subsystem_sysname(udev, subsys, sysname); + if (dev == NULL) + return -1; + + if (read_value) { + const char *val; + + val = udev_device_get_sysattr_value(dev, attr); + if (val != NULL) + util_strlcpy(result, val, maxsize); + else + result[0] = '\0'; + info(udev, "value '[%s/%s]%s' is '%s'\n", subsys, sysname, attr, result); + } else { + util_strlcpy(result, udev_device_get_syspath(dev), maxsize); + if (attr != NULL) { + util_strlcat(result, "/", maxsize); + util_strlcat(result, attr, maxsize); + } + info(udev, "path '[%s/%s]%s' is '%s'\n", subsys, sysname, attr, result); + } + udev_device_unref(dev); + return 0; } -int run_program(struct udev *udev, const char *command, char **envp, - char *result, size_t ressize, size_t *reslen) +int util_run_program(struct udev *udev, const char *command, char **envp, + char *result, size_t ressize, size_t *reslen) { int status; int outpipe[2] = {-1, -1}; @@ -365,7 +444,7 @@ int run_program(struct udev *udev, const char *command, char **envp, if (WEXITSTATUS(status) != 0) err = -1; } else { - err(udev, "'%s' abnormal exit\n", argv[0]); + err(udev, "'%s' abnormal exit\n", command); err = -1; } }