chiark / gitweb /
fix rc when using udev --daemon
[elogind.git] / udev_utils.c
index 04258a39c24c34249dd73f5ff0dba253d36f783a..b198892c012f2ae8f95356845066336f92c1ba42 100644 (file)
 #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_libc_wrapper.h"
 #include "udev.h"
-#include "logging.h"
-#include "udev_utils.h"
-#include "list.h"
 
 
 int log_priority(const char *priority)
@@ -57,7 +56,7 @@ int log_priority(const char *priority)
        return 0;
 }
 
-int name_list_add(struct list_head *name_list, const char *name, int sort)
+char *name_list_add(struct list_head *name_list, const char *name, int sort)
 {
        struct name_entry *loop_name;
        struct name_entry *new_name;
@@ -66,7 +65,7 @@ int name_list_add(struct list_head *name_list, const char *name, int sort)
                /* avoid doubles */
                if (strcmp(loop_name->name, name) == 0) {
                        dbg("'%s' is already in the list", name);
-                       return 0;
+                       return loop_name->name;
                }
        }
 
@@ -77,19 +76,17 @@ int name_list_add(struct list_head *name_list, const char *name, int sort)
                }
 
        new_name = malloc(sizeof(struct name_entry));
-       if (new_name == NULL) {
-               dbg("error malloc");
-               return -ENOMEM;
-       }
+       if (new_name == NULL)
+               return NULL;
 
        strlcpy(new_name->name, name, sizeof(new_name->name));
        dbg("adding '%s'", new_name->name);
        list_add_tail(&new_name->node, &loop_name->node);
 
-       return 0;
+       return new_name->name;
 }
 
-int name_list_key_add(struct list_head *name_list, const char *key, const char *value)
+char *name_list_key_add(struct list_head *name_list, const char *key, const char *value)
 {
        struct name_entry *loop_name;
        struct name_entry *new_name;
@@ -99,22 +96,20 @@ int name_list_key_add(struct list_head *name_list, const char *key, const char *
                        dbg("key already present '%s', replace it", loop_name->name);
                        snprintf(loop_name->name, sizeof(loop_name->name), "%s=%s", key, value);
                        loop_name->name[sizeof(loop_name->name)-1] = '\0';
-                       return 0;
+                       return loop_name->name;
                }
        }
 
        new_name = malloc(sizeof(struct name_entry));
-       if (new_name == NULL) {
-               dbg("error malloc");
-               return -ENOMEM;
-       }
+       if (new_name == NULL)
+               return NULL;
 
        snprintf(new_name->name, sizeof(new_name->name), "%s=%s", key, value);
        new_name->name[sizeof(new_name->name)-1] = '\0';
        dbg("adding '%s'", new_name->name);
        list_add_tail(&new_name->node, &loop_name->node);
 
-       return 0;
+       return new_name->name;
 }
 
 void name_list_cleanup(struct list_head *name_list)
@@ -139,7 +134,7 @@ int add_matching_files(struct list_head *name_list, const char *dirname, const c
        dbg("open directory '%s'", dirname);
        dir = opendir(dirname);
        if (dir == NULL) {
-               dbg("unable to open '%s': %s", dirname, strerror(errno));
+               err("unable to open '%s': %s", dirname, strerror(errno));
                return -1;
        }
 
@@ -169,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;
+}
+