chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
rule-generator: net - whitelist NICs that violate MAC local scheme
[elogind.git]
/
udev
/
udev-node.c
diff --git
a/udev/udev-node.c
b/udev/udev-node.c
index 18a9d11017b3cf3bc2641140f6a6cd094f3c19af..322e0b88de3624b5c60746d6fab97cf85303a9fe 100644
(file)
--- a/
udev/udev-node.c
+++ b/
udev/udev-node.c
@@
-68,7
+68,7
@@
static int name_index(struct udev *udev, const char *devpath, const char *name,
int udev_node_mknod(struct udev_device *dev, const char *file, dev_t devnum, mode_t mode, uid_t uid, gid_t gid)
{
struct udev *udev = udev_device_get_udev(dev);
int udev_node_mknod(struct udev_device *dev, const char *file, dev_t devnum, mode_t mode, uid_t uid, gid_t gid)
{
struct udev *udev = udev_device_get_udev(dev);
- char file
_tmp[UTIL_PATH_SIZE + sizeof(TMP_FILE_EXT)
];
+ char file
name[UTIL_PATH_SIZE
];
struct stat stats;
int preserve = 0;
int err = 0;
struct stat stats;
int preserve = 0;
int err = 0;
@@
-81,8
+81,14
@@
int udev_node_mknod(struct udev_device *dev, const char *file, dev_t devnum, mod
else
mode |= S_IFCHR;
else
mode |= S_IFCHR;
- if (file == NULL)
+ if (file == NULL)
{
file = udev_device_get_devnode(dev);
file = udev_device_get_devnode(dev);
+ } else if (file[0] != '/') {
+ util_strlcpy(filename, udev_get_dev_path(udev), sizeof(filename));
+ util_strlcat(filename, "/", sizeof(filename));
+ util_strlcat(filename, file, sizeof(filename));
+ file = filename;
+ }
if (lstat(file, &stats) == 0) {
if (((stats.st_mode & S_IFMT) == (mode & S_IFMT)) && (stats.st_rdev == devnum)) {
if (lstat(file, &stats) == 0) {
if (((stats.st_mode & S_IFMT) == (mode & S_IFMT)) && (stats.st_rdev == devnum)) {
@@
-90,6
+96,8
@@
int udev_node_mknod(struct udev_device *dev, const char *file, dev_t devnum, mod
preserve = 1;
udev_selinux_lsetfilecon(udev, file, mode);
} else {
preserve = 1;
udev_selinux_lsetfilecon(udev, file, mode);
} else {
+ char file_tmp[UTIL_PATH_SIZE + sizeof(TMP_FILE_EXT)];
+
info(udev, "atomically replace existing file '%s'\n", file);
util_strlcpy(file_tmp, file, sizeof(file_tmp));
util_strlcat(file_tmp, TMP_FILE_EXT, sizeof(file_tmp));
info(udev, "atomically replace existing file '%s'\n", file);
util_strlcpy(file_tmp, file, sizeof(file_tmp));
util_strlcat(file_tmp, TMP_FILE_EXT, sizeof(file_tmp));
@@
-384,21
+392,25
@@
void udev_node_update_old_links(struct udev_device *dev, struct udev_device *dev
if (found)
continue;
if (found)
continue;
- info(udev, "update old symlink '%s' no longer belonging to '%s'\n", name, udev_device_get_devpath(dev));
+ info(udev, "update old name, '%s' no longer belonging to '%s'\n",
+ name, udev_device_get_devpath(dev));
name_index(udev, udev_device_get_devpath(dev), name, 0);
update_link(dev, name);
}
/*
* if the node name has changed, delete the node,
name_index(udev, udev_device_get_devpath(dev), name, 0);
update_link(dev, name);
}
/*
* if the node name has changed, delete the node,
- * and possibly restore a symlink of a
nother
device
+ * and possibly restore a symlink of a
different
device
*/
devnode_old = udev_device_get_devnode(dev_old);
if (devnode_old != NULL) {
const char *devnode = udev_device_get_devnode(dev);
*/
devnode_old = udev_device_get_devnode(dev_old);
if (devnode_old != NULL) {
const char *devnode = udev_device_get_devnode(dev);
- if (devnode != NULL && strcmp(devnode_old, devnode) != 0)
+ if (devnode != NULL && strcmp(devnode_old, devnode) != 0) {
+ info(udev, "node has changed from '%s' to '%s'\n", devnode_old, devnode);
+ name_index(udev, udev_device_get_devpath(dev), devnode_old, 0);
update_link(dev, devnode_old);
update_link(dev, devnode_old);
+ }
}
}
}
}
@@
-450,7
+462,7
@@
exit:
return err;
}
return err;
}
-
extern
int udev_node_remove(struct udev_device *dev)
+int udev_node_remove(struct udev_device *dev)
{
struct udev *udev = udev_device_get_udev(dev);
struct udev_list_entry *list_entry;
{
struct udev *udev = udev_device_get_udev(dev);
struct udev_list_entry *list_entry;