/*
- * Copyright (C) 2003-2009 Kay Sievers <kay.sievers@vrfy.org>
+ * Copyright (C) 2003-2010 Kay Sievers <kay.sievers@vrfy.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
dbg(udev, "found existing symlink '%s'\n", slink);
len = readlink(slink, buf, sizeof(buf));
- if (len > 0) {
+ if (len > 0 && len < (int)sizeof(buf)) {
buf[len] = '\0';
if (strcmp(target, buf) == 0) {
info(udev, "preserve already existing symlink '%s' to '%s'\n",
err = util_create_path(udev, filename);
if (err != 0 && err != -ENOENT)
break;
- fd = open(filename, O_WRONLY|O_CREAT, 0444);
+ fd = open(filename, O_WRONLY|O_CREAT|O_NOFOLLOW, 0444);
if (fd >= 0)
close(fd);
else
int udev_node_add(struct udev_device *dev, mode_t mode, uid_t uid, gid_t gid)
{
struct udev *udev = udev_device_get_udev(dev);
- int i;
- int num;
struct udev_list_entry *list_entry;
int err = 0;
goto exit;
}
- /* create all_partitions if requested */
- num = udev_device_get_num_fake_partitions(dev);
- if (num > 0) {
- info(udev, "creating device partition nodes '%s[1-%i]'\n", udev_device_get_devnode(dev), num);
- for (i = 1; i <= num; i++) {
- char partitionname[UTIL_PATH_SIZE];
- dev_t part_devnum;
-
- snprintf(partitionname, sizeof(partitionname), "%s%d",
- udev_device_get_devnode(dev), i);
- partitionname[sizeof(partitionname)-1] = '\0';
- part_devnum = makedev(major(udev_device_get_devnum(dev)),
- minor(udev_device_get_devnum(dev)) + i);
- udev_node_mknod(dev, partitionname, part_devnum, mode, uid, gid);
- }
- }
-
/* create/update symlinks, add symlinks to name index */
udev_list_entry_foreach(list_entry, udev_device_get_devlinks_list_entry(dev)) {
if (udev_list_entry_get_flags(list_entry))
struct udev *udev = udev_device_get_udev(dev);
struct udev_list_entry *list_entry;
const char *devnode;
- char partitionname[UTIL_PATH_SIZE];
struct stat stats;
struct udev_device *dev_check;
+ char filename[UTIL_PATH_SIZE];
int err = 0;
- int num;
/* remove/update symlinks, remove symlinks from name index */
udev_list_entry_foreach(list_entry, udev_device_get_devlinks_list_entry(dev))
devnode = udev_device_get_devnode(dev);
if (devnode == NULL)
- return 0;
+ goto out;
+
if (stat(devnode, &stats) != 0) {
info(udev, "device node '%s' not found\n", devnode);
- return 0;
+ goto out;
}
+
if (stats.st_rdev != udev_device_get_devnum(dev)) {
info(udev, "device node '%s' points to a different device, skip removal\n", devnode);
- return -1;
+ err = -1;
+ goto out;
}
dev_check = udev_device_new_from_syspath(udev, udev_device_get_syspath(dev));
- if (dev_check != NULL && stats.st_rdev == udev_device_get_devnum(dev_check)) {
+ if (dev_check != NULL) {
/* do not remove device node if the same sys-device is re-created in the meantime */
info(udev, "keeping device node of existing device'%s'\n", devnode);
- } else {
- info(udev, "removing device node '%s'\n", devnode);
- err = util_unlink_secure(udev, devnode);
+ udev_device_unref(dev_check);
+ goto out;
}
- udev_device_unref(dev_check);
-
- num = udev_device_get_num_fake_partitions(dev);
- if (num > 0) {
- int i;
-
- info(udev, "removing all_partitions '%s[1-%i]'\n", devnode, num);
- if (num > 255)
- return -1;
- for (i = 1; i <= num; i++) {
- snprintf(partitionname, sizeof(partitionname), "%s%d", devnode, i);
- partitionname[sizeof(partitionname)-1] = '\0';
- util_unlink_secure(udev, partitionname);
- }
+
+ util_strscpyl(filename, sizeof(filename), LIBEXECDIR "/devices", &devnode[strlen(udev_get_dev_path(udev))], NULL);
+ if (stat(filename, &stats) == 0 && stats.st_rdev == udev_device_get_devnum(dev)) {
+ info(udev, "static device entry found '%s', skip removal\n", devnode);
+ goto out;
}
+
+ info(udev, "removing device node '%s'\n", devnode);
+ err = util_unlink_secure(udev, devnode);
util_delete_path(udev, devnode);
+out:
return err;
}