X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udev-add.c;h=8867c8f5afc2ee5d6e125df73ea6a2ce4fa1a08b;hb=bb7386472466e55f75df024d18e8da37a222bb41;hp=9aa8bdb3e91bb113edda18917ceef50a624424d4;hpb=54988802b795328ceba29480611102902e88f572;p=elogind.git diff --git a/udev-add.c b/udev-add.c index 9aa8bdb3e..8867c8f5a 100644 --- a/udev-add.c +++ b/udev-add.c @@ -87,7 +87,7 @@ static int create_path(char *file) *pos = 0x00; if (stat(p, &stats)) { retval = mkdir(p, 0755); - if (retval) { + if (retval != 0) { dbg("mkdir(%s) failed with error '%s'", p, strerror(errno)); return retval; @@ -99,7 +99,7 @@ static int create_path(char *file) return 0; } -static int create_node(struct udevice *dev) +static int create_node(struct udevice *dev, int fake) { struct stat stats; char filename[255]; @@ -109,19 +109,12 @@ static int create_node(struct udevice *dev) int retval = 0; uid_t uid = 0; gid_t gid = 0; - dev_t res; int i; int tail; strncpy(filename, udev_root, sizeof(filename)); strncat(filename, dev->name, sizeof(filename)); -#ifdef __KLIBC__ - res = (dev->major << 8) | (dev->minor); -#else - res = makedev(dev->major, dev->minor); -#endif - switch (dev->type) { case 'b': dev->mode |= S_IFBLK; @@ -144,55 +137,59 @@ static int create_node(struct udevice *dev) info("creating device node '%s'", filename); dbg("mknod(%s, %#o, %u, %u)", filename, dev->mode, dev->major, dev->minor); - retval = mknod(filename, dev->mode, res); - if (retval) - dbg("mknod(%s, %#o, %u, %u) failed with error '%s'", - filename, dev->mode, dev->major, dev->minor, strerror(errno)); + if (!fake) { + retval = mknod(filename, dev->mode, makedev(dev->major, dev->minor)); + if (retval != 0) + 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 (!fake) { + retval = chmod(filename, dev->mode); + if (retval != 0) + dbg("chmod(%s, %#o) failed with error '%s'", + filename, dev->mode, strerror(errno)); + } - if (*dev->owner) { + if (dev->owner[0] != '\0') { char *endptr; unsigned long id = strtoul(dev->owner, &endptr, 10); - if (*endptr == 0x00) + if (endptr[0] == '\0') uid = (uid_t) id; else { struct passwd *pw = getpwnam(dev->owner); - if (!pw) - dbg("user unknown '%s'", dev->owner); + if (pw == NULL) + dbg("specified user unknown '%s'", dev->owner); else uid = pw->pw_uid; } } - if (*dev->group) { + if (dev->group[0] != '\0') { char *endptr; unsigned long id = strtoul(dev->group, &endptr, 10); - if (*endptr == 0x00) + if (endptr[0] == '\0') gid = (gid_t) id; else { struct group *gr = getgrnam(dev->group); - if (!gr) - dbg("group unknown '%s'", dev->group); + if (gr == NULL) + dbg("specified group unknown '%s'", dev->group); else gid = gr->gr_gid; } } - if (uid || gid) { + if (uid != 0 || gid != 0) { dbg("chown(%s, %u, %u)", filename, uid, gid); retval = chown(filename, uid, gid); - if (retval) + if (retval != 0) dbg("chown(%s, %u, %u) failed with error '%s'", filename, uid, gid, strerror(errno)); } /* create symlink if requested */ - if (*dev->symlink) { + if (dev->symlink[0] != '\0') { symlinks = dev->symlink; while (1) { linkname = strsep(&symlinks, " "); @@ -202,8 +199,9 @@ static int create_node(struct udevice *dev) strncpy(filename, udev_root, sizeof(filename)); strncat(filename, linkname, sizeof(filename)); dbg("symlink '%s' to node '%s' requested", filename, dev->name); - if (strrchr(linkname, '/')) - create_path(filename); + if (!fake) + if (strrchr(linkname, '/')) + create_path(filename); /* optimize relative link */ linktarget[0] = '\0'; @@ -214,19 +212,19 @@ static int create_node(struct udevice *dev) tail = i+1; i++; } - while (linkname[i]) { + while (linkname[i] != '\0') { if (linkname[i] == '/') strcat(linktarget, "../"); i++; } - if (*linktarget == '\0') + if (linktarget[0] == '\0') strcpy(linktarget, "./"); strcat(linktarget, &dev->name[tail]); /* unlink existing non-directories to ensure that our symlink * is created */ - if (lstat(filename, &stats) == 0) { + if (!fake && (lstat(filename, &stats) == 0)) { if ((stats.st_mode & S_IFMT) != S_IFDIR) { if (unlink(filename)) dbg("unlink(%s) failed with error '%s'", @@ -235,10 +233,12 @@ static int create_node(struct udevice *dev) } dbg("symlink(%s, %s)", linktarget, filename); - retval = symlink(linktarget, filename); - if (retval) - dbg("symlink(%s, %s) failed with error '%s'", - linktarget, filename, strerror(errno)); + if (!fake) { + retval = symlink(linktarget, filename); + if (retval != 0) + dbg("symlink(%s, %s) failed with error '%s'", + linktarget, filename, strerror(errno)); + } } } @@ -285,7 +285,7 @@ static int sleep_for_dev(char *path) dbg("looking for '%s'", filename); retval = stat(filename, &buf); - if (!retval) + if (retval == 0) goto exit; /* sleep to give the kernel a chance to create the dev file */ @@ -296,7 +296,7 @@ exit: return retval; } -int udev_add_device(char *path, char *subsystem) +int udev_add_device(char *path, char *subsystem, int fake) { struct sysfs_class_device *class_dev = NULL; struct udevice dev; @@ -311,7 +311,7 @@ int udev_add_device(char *path, char *subsystem) dev.type = 'c'; retval = sleep_for_dev(path); - if (retval) + if (retval != 0) goto exit; class_dev = get_class_dev(path); @@ -319,24 +319,27 @@ int udev_add_device(char *path, char *subsystem) goto exit; retval = get_major_minor(class_dev, &dev); - if (retval) { + if (retval != 0) { dbg("get_major_minor failed"); goto exit; } retval = namedev_name_device(class_dev, &dev); - if (retval) + if (retval != 0) goto exit; - retval = udevdb_add_dev(path, &dev); - if (retval != 0) - dbg("udevdb_add_dev failed, but we are going to try to create the node anyway. " - "But remove might not work properly for this device."); + if (!fake) { + retval = udevdb_add_dev(path, &dev); + if (retval != 0) + dbg("udevdb_add_dev failed, but we are going to try " + "to create the node anyway. But remove might not " + "work properly for this device."); + } dbg("name='%s'", dev.name); - retval = create_node(&dev); + retval = create_node(&dev, fake); - if (retval == 0) + if ((retval == 0) && (!fake)) sysbus_send_create(&dev, path); exit: