remove built-in /etc/passwd /etc/group parser
This commit is contained in:
@@ -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);
|
||||
|
||||
+1
-138
@@ -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__ */
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user