chiark / gitweb /
fix rc when using udev --daemon
[elogind.git] / udev_utils.c
index c7292d0f045765a24241ca3044e2157e2b993278..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,30 +56,7 @@ int log_priority(const char *priority)
        return 0;
 }
 
-int kernel_release_satisfactory(unsigned int version, unsigned int patchlevel, unsigned int sublevel)
-{
-       static unsigned int kversion = 0;
-       static unsigned int kpatchlevel;
-       static unsigned int ksublevel;
-
-       if (kversion == 0) {
-               struct utsname uts;
-               if (uname(&uts) != 0)
-                       return -1;
-
-               if (sscanf (uts.release, "%u.%u.%u", &kversion, &kpatchlevel, &ksublevel) != 3) {
-                       kversion = 0;
-                       return -1;
-               }
-       }
-
-       if (kversion >= version && kpatchlevel >= patchlevel && ksublevel >= sublevel)
-               return 1;
-       else
-               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;
@@ -89,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;
                }
        }
 
@@ -100,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;
@@ -122,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)
@@ -162,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'", dirname);
+               err("unable to open '%s': %s", dirname, strerror(errno));
                return -1;
        }
 
@@ -192,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;
+}
+