chiark / gitweb /
[PATCH] get rid of functions in klibc_fixups that are now in klibc
[elogind.git] / udev-add.c
index 6f0e3bf10521d6e3f480262c24acb3b93ec90f29..068fd46f2746bb299b2d5739fc5144556861ff22 100644 (file)
 #include <unistd.h>
 #include <errno.h>
 #include <sys/stat.h>
+#include <sys/types.h>
+#include <grp.h>
+#ifndef __KLIBC__
+#include <pwd.h>
+#endif
 
 #include "udev.h"
 #include "udev_version.h"
 #include "namedev.h"
 #include "udevdb.h"
 #include "libsysfs/libsysfs.h"
+#include "klibc_fixups.h"
 
 /* 
  * Right now the major/minor of a device is stored in a file called
@@ -135,13 +141,24 @@ static int create_node(struct udevice *dev)
                dbg("mknod(%s, %#o, %u, %u) failed with error '%s'",
                    filename, dev->mode, dev->major, dev->minor, strerror(errno));
 
+       dbg("chmod(%s, %#o)", filename, dev->mode);
+       retval = chmod(filename, dev->mode);
+       if (retval)
+               dbg("chmod(%s, %#o) failed with error '%s'",
+                   filename, dev->mode, strerror(errno));
+
        if (*dev->owner) {
                char *endptr;
                unsigned long id = strtoul(dev->owner, &endptr, 10);
                if (*endptr == 0x00)
                        uid = (uid_t) id;
-               else
-                       dbg("only numeric owner id supported: %s", dev->owner);
+               else {
+                       struct passwd *pw = getpwnam(dev->owner);
+                       if (!pw)
+                               dbg("user unknown: %s", dev->owner);
+                       else
+                               uid = pw->pw_uid;
+               }
        }
 
        if (*dev->group) {
@@ -149,8 +166,13 @@ static int create_node(struct udevice *dev)
                unsigned long id = strtoul(dev->group, &endptr, 10);
                if (*endptr == 0x00)
                        gid = (gid_t) id;
-               else
-                       dbg("only numeric group id supported: %s", dev->group);
+               else {
+                       struct group *gr = getgrnam(dev->group);
+                       if (!gr)
+                               dbg("group unknown: %s", dev->group);
+                       else
+                               gid = gr->gr_gid;
+               }
        }
 
        if (uid || gid) {
@@ -223,6 +245,8 @@ int udev_add_device(char *path, char *subsystem)
        struct udevice dev;
        int retval = -EINVAL;
 
+       memset(&dev, 0x00, sizeof(dev));
+
        /* for now, the block layer is the only place where block devices are */
        if (strcmp(subsystem, "block") == 0)
                dev.type = 'b';