/*
- * 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
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;
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))
return -1;
}
- 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)) {
- /* 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);
+ if (udev_device_get_ignore_remove(dev)) {
+ info(udev, "ignore_remove for '%s'\n", udev_device_get_devnode(dev));
} else {
- info(udev, "removing device node '%s'\n", devnode);
- err = util_unlink_secure(udev, devnode);
- }
- 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);
+ struct udev_device *dev_check;
+
+ 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)) {
+ /* 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);
}
+
util_delete_path(udev, devnode);
return err;
}