diff options
-rw-r--r-- | udev.h | 2 | ||||
-rw-r--r-- | udev_sysdeps.c | 139 | ||||
-rw-r--r-- | udev_sysdeps.h | 3 | ||||
-rw-r--r-- | udev_utils.c | 40 |
4 files changed, 43 insertions, 141 deletions
@@ -139,6 +139,8 @@ extern char *name_list_add(struct list_head *name_list, const char *name, int so extern char *name_list_key_add(struct list_head *name_list, const char *key, const char *value); extern void name_list_cleanup(struct list_head *name_list); extern int add_matching_files(struct list_head *name_list, const char *dirname, const char *suffix); +extern uid_t lookup_user(const char *user); +extern gid_t lookup_group(const char *group); /* udev_utils_string.c */ extern int strcmp_pattern(const char *p, const char *s); diff --git a/udev_sysdeps.c b/udev_sysdeps.c index 9ec5a73ed9..3cd12277cf 100644 --- a/udev_sysdeps.c +++ b/udev_sysdeps.c @@ -29,19 +29,7 @@ #include "udev.h" -#ifndef __GLIBC__ -#define __OWN_USERDB_PARSER__ -#endif - #ifdef __GLIBC__ -#define __OWN_STRLCPYCAT__ -#endif - -#ifdef USE_STATIC -#define __OWN_USERDB_PARSER__ -#endif - -#ifdef __OWN_STRLCPYCAT__ size_t strlcpy(char *dst, const char *src, size_t size) { size_t bytes = 0; @@ -85,129 +73,4 @@ size_t strlcat(char *dst, const char *src, size_t size) *q = '\0'; return bytes; } -#endif /* __OWN_STRLCPYCAT__ */ - -#ifndef __OWN_USERDB_PARSER__ -#include <sys/types.h> -#include <pwd.h> -#include <grp.h> - -uid_t lookup_user(const char *user) -{ - struct passwd *pw; - uid_t uid = 0; - - pw = getpwnam(user); - if (pw == NULL) { - if (errno == 0 || errno == ENOENT || errno == ESRCH) - err("specified user unknown '%s'", user); - else - err("error resolving user '%s': %s", user, strerror(errno)); - } else - uid = pw->pw_uid; - - return uid; -} - -gid_t lookup_group(const char *group) -{ - struct group *gr; - gid_t gid = 0; - - gr = getgrnam(group); - if (gr == NULL) { - if (errno == 0 || errno == ENOENT || errno == ESRCH) - err("specified group unknown '%s'", group); - else - err("error resolving group '%s': %s", group, strerror(errno)); - } else - gid = gr->gr_gid; - - return gid; -} - -#else /* __OWN_USERDB_PARSER__ */ - -#define PASSWD_FILE "/etc/passwd" -#define GROUP_FILE "/etc/group" - -/* return the id of a passwd style line, selected by the users name */ -static unsigned long get_id_by_name(const char *uname, const char *dbfile) -{ - unsigned long id = 0; - char line[LINE_SIZE]; - char *buf; - char *bufline; - size_t bufsize; - size_t cur; - size_t count; - char *pos; - char *name; - char *idstr; - char *tail; - - if (file_map(dbfile, &buf, &bufsize) != 0) { - err("can't open '%s' as db file: %s", dbfile, strerror(errno)); - return 0; - } - dbg("search '%s' in '%s'", uname, dbfile); - - /* loop through the whole file */ - cur = 0; - while (cur < bufsize) { - count = buf_get_line(buf, bufsize, cur); - bufline = &buf[cur]; - cur += count+1; - - if (count >= sizeof(line)) - continue; - - memcpy(line, bufline, count-1); - line[count-1] = '\0'; - pos = line; - - /* get name */ - name = strsep(&pos, ":"); - if (name == NULL) - continue; - - /* skip pass */ - if (strsep(&pos, ":") == NULL) - continue; - - /* get id */ - idstr = strsep(&pos, ":"); - if (idstr == NULL) - continue; - - if (strcmp(uname, name) == 0) { - id = strtoul(idstr, &tail, 10); - if (tail[0] != '\0') { - id = 0; - dbg("no id found for '%s'", name); - } else - dbg("id for '%s' is '%li'", name, id); - break; - } - } - - file_unmap(buf, bufsize); - return id; -} - -uid_t lookup_user(const char *user) -{ - unsigned long id; - - id = get_id_by_name(user, PASSWD_FILE); - return (uid_t) id; -} - -gid_t lookup_group(const char *group) -{ - unsigned long id; - - id = get_id_by_name(group, GROUP_FILE); - return (gid_t) id; -} -#endif /* __OWN_USERDB_PARSER__ */ +#endif /* __GLIBC__ */ diff --git a/udev_sysdeps.h b/udev_sysdeps.h index 530218f7b9..36c86f3356 100644 --- a/udev_sysdeps.h +++ b/udev_sysdeps.h @@ -162,9 +162,6 @@ static inline int inotify_add_watch(int fd, const char *name, uint32_t mask) #endif #endif -extern uid_t lookup_user(const char *user); -extern gid_t lookup_group(const char *group); - extern size_t strlcpy(char *dst, const char *src, size_t size); extern size_t strlcat(char *dst, const char *src, size_t size); diff --git a/udev_utils.c b/udev_utils.c index 003d7bded9..b198892c01 100644 --- a/udev_utils.c +++ b/udev_utils.c @@ -28,6 +28,9 @@ #include <ctype.h> #include <dirent.h> #include <syslog.h> +#include <pwd.h> +#include <grp.h> +#include <sys/types.h> #include <sys/utsname.h> #include "udev.h" @@ -161,3 +164,40 @@ int add_matching_files(struct list_head *name_list, const char *dirname, const c closedir(dir); return 0; } + +uid_t lookup_user(const char *user) +{ + struct passwd *pw; + uid_t uid = 0; + + errno = 0; + pw = getpwnam(user); + if (pw == NULL) { + if (errno == 0 || errno == ENOENT || errno == ESRCH) + err("specified user unknown '%s'", user); + else + err("error resolving user '%s': %s", user, strerror(errno)); + } else + uid = pw->pw_uid; + + return uid; +} + +extern gid_t lookup_group(const char *group) +{ + struct group *gr; + gid_t gid = 0; + + errno = 0; + gr = getgrnam(group); + if (gr == NULL) { + if (errno == 0 || errno == ENOENT || errno == ESRCH) + err("specified group unknown '%s'", group); + else + err("error resolving group '%s': %s", group, strerror(errno)); + } else + gid = gr->gr_gid; + + return gid; +} + |