--- udev-add.c.orig 2003-10-22 03:03:34.000000000 +0200 +++ udev-add.c 2003-10-22 05:02:02.000000000 +0200 @@ -27,6 +27,8 @@ #include #include #include +#include +#include #include "udev.h" #include "udev_version.h" @@ -98,7 +100,63 @@ dbg("mknod(%s, %#o, %u, %u) failed with error '%s'", filename, dev->mode, dev->major, dev->minor, strerror(errno)); - // FIXME set the ownership of the node + /* set the ownership of the node if requested */ + if ((*dev->owner == 0x00) && (*dev->group == 0x00)) + return retval; + + uid_t uid; + gid_t gid; + + /* get current ownership */ + struct stat file_stat; + lstat (filename, &file_stat); + uid = file_stat.st_uid; + gid = file_stat.st_gid; + + if (*dev->owner != 0x00) { + char *endptr; + unsigned long id = strtoul(dev->owner, &endptr, 10); + /* if id is not numeric, ask system */ + if (*endptr) { + dbg("got ascii owner: %s", dev->owner); + struct passwd *pwd = getpwnam (dev->owner); + if (pwd) + uid = pwd->pw_uid; + else + dbg("unable to resolve uid from string: %s", + dev->owner); + endpwent(); + } else { + uid = (uid_t) id; + dbg("got numeric owner: %u", uid); + } + } + + if (*dev->group != 0x00) { + char *endptr; + unsigned long id = strtoul(dev->group, &endptr, 10); + /* if id is not numeric, ask system */ + if (*endptr) { + dbg("got ascii group: %s", dev->group); + struct group *grp = getgrnam (dev->group); + if (grp) + gid = grp->gr_gid; + else + dbg("unable to resolve gid from string: %s", + dev->group); + endgrent(); + } else { + gid = (gid_t) id; + dbg("got numeric group: %u", gid); + } + } + + dbg("chown(%s, %u, %u)", filename, uid, gid); + retval = chown(filename, uid, gid); + if (retval) + dbg("chown(%s, %u, %u) failed with error '%s'", filename, + uid, gid, strerror(errno)); + return retval; }