chiark / gitweb /
fix rc when using udev --daemon
[elogind.git] / udev_utils.c
index a37c4dfe7492f2927b0f7d1660e791ec32ba5533..b198892c012f2ae8f95356845066336f92c1ba42 100644 (file)
@@ -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"
@@ -53,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;
@@ -62,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;
                }
        }
 
@@ -73,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;
@@ -95,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)
@@ -165,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;
+}
+