summaryrefslogtreecommitdiff
path: root/src/libudev/libudev-util.c
diff options
context:
space:
mode:
authorTom Gundersen <teg@jklm.no>2014-08-01 22:32:12 +0200
committerTom Gundersen <teg@jklm.no>2014-08-01 22:33:20 +0200
commitac9c87dbc4c3950c55f6685db669f5f34957e09d (patch)
tree059877829c4b528e4fcee011485e8986f4633964 /src/libudev/libudev-util.c
parent7b4c2ee75faf08b7a415337b46efc670f986128a (diff)
Revert "libudev: use get_*_creds from shared rather than util_lookup_*"
This reverts commit a56ba6158b9649e01226dfaf3ff7082c82571090. The commit was pushed in error.
Diffstat (limited to 'src/libudev/libudev-util.c')
-rw-r--r--src/libudev/libudev-util.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/libudev/libudev-util.c b/src/libudev/libudev-util.c
index 93e78d5d07..d9cdde1751 100644
--- a/src/libudev/libudev-util.c
+++ b/src/libudev/libudev-util.c
@@ -77,6 +77,70 @@ int util_delete_path(struct udev *udev, const char *path)
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)