udev-node.c | udev-node.c | |||
---|---|---|---|---|
skipping to change at line 35 | skipping to change at line 35 | |||
#include <errno.h> | #include <errno.h> | |||
#include <grp.h> | #include <grp.h> | |||
#include <dirent.h> | #include <dirent.h> | |||
#include <sys/time.h> | #include <sys/time.h> | |||
#include <sys/stat.h> | #include <sys/stat.h> | |||
#include <sys/types.h> | #include <sys/types.h> | |||
#include "udev.h" | #include "udev.h" | |||
#include "smack-util.h" | #include "smack-util.h" | |||
static int node_symlink(struct udev_device *dev, const char *node, const ch | static int node_symlink(struct udev_device *dev, const char *node, const ch | |||
ar *slink) | ar *slink) { | |||
{ | ||||
struct stat stats; | struct stat stats; | |||
char target[UTIL_PATH_SIZE]; | char target[UTIL_PATH_SIZE]; | |||
char *s; | char *s; | |||
size_t l; | size_t l; | |||
char slink_tmp[UTIL_PATH_SIZE + 32]; | char slink_tmp[UTIL_PATH_SIZE + 32]; | |||
int i = 0; | int i = 0; | |||
int tail = 0; | int tail = 0; | |||
int err = 0; | int err = 0; | |||
/* use relative link */ | /* use relative link */ | |||
skipping to change at line 129 | skipping to change at line 128 | |||
err = rename(slink_tmp, slink); | err = rename(slink_tmp, slink); | |||
if (err != 0) { | if (err != 0) { | |||
log_error("rename '%s' '%s' failed: %m", slink_tmp, slink); | log_error("rename '%s' '%s' failed: %m", slink_tmp, slink); | |||
unlink(slink_tmp); | unlink(slink_tmp); | |||
} | } | |||
exit: | exit: | |||
return err; | return err; | |||
} | } | |||
/* find device node of device with highest priority */ | /* find device node of device with highest priority */ | |||
static const char *link_find_prioritized(struct udev_device *dev, bool add, | static const char *link_find_prioritized(struct udev_device *dev, bool add, | |||
const char *stackdir, char *buf, size_t bufsize) | const char *stackdir, char *buf, size_t bufsize) { | |||
{ | ||||
struct udev *udev = udev_device_get_udev(dev); | struct udev *udev = udev_device_get_udev(dev); | |||
DIR *dir; | DIR *dir; | |||
int priority = 0; | int priority = 0; | |||
const char *target = NULL; | const char *target = NULL; | |||
if (add) { | if (add) { | |||
priority = udev_device_get_devlink_priority(dev); | priority = udev_device_get_devlink_priority(dev); | |||
strscpy(buf, bufsize, udev_device_get_devnode(dev)); | strscpy(buf, bufsize, udev_device_get_devnode(dev)); | |||
target = buf; | target = buf; | |||
} | } | |||
skipping to change at line 183 | skipping to change at line 181 | |||
} | } | |||
} | } | |||
udev_device_unref(dev_db); | udev_device_unref(dev_db); | |||
} | } | |||
} | } | |||
closedir(dir); | closedir(dir); | |||
return target; | return target; | |||
} | } | |||
/* manage "stack of names" with possibly specified device priorities */ | /* manage "stack of names" with possibly specified device priorities */ | |||
static void link_update(struct udev_device *dev, const char *slink, bool ad | static void link_update(struct udev_device *dev, const char *slink, bool ad | |||
d) | d) { | |||
{ | ||||
struct udev *udev = udev_device_get_udev(dev); | struct udev *udev = udev_device_get_udev(dev); | |||
char name_enc[UTIL_PATH_SIZE]; | char name_enc[UTIL_PATH_SIZE]; | |||
char filename[UTIL_PATH_SIZE * 2]; | char filename[UTIL_PATH_SIZE * 2]; | |||
char dirname[UTIL_PATH_SIZE]; | char dirname[UTIL_PATH_SIZE]; | |||
const char *target; | const char *target; | |||
char buf[UTIL_PATH_SIZE]; | char buf[UTIL_PATH_SIZE]; | |||
util_path_encode(slink + strlen("/dev"), name_enc, sizeof(name_enc) ); | util_path_encode(slink + strlen("/dev"), name_enc, sizeof(name_enc) ); | |||
strscpyl(dirname, sizeof(dirname), "/run/udev/links/", name_enc, NU LL); | strscpyl(dirname, sizeof(dirname), "/run/udev/links/", name_enc, NU LL); | |||
strscpyl(filename, sizeof(filename), dirname, "/", udev_device_get_ id_filename(dev), NULL); | strscpyl(filename, sizeof(filename), dirname, "/", udev_device_get_ id_filename(dev), NULL); | |||
skipping to change at line 227 | skipping to change at line 224 | |||
break; | break; | |||
fd = open(filename, O_WRONLY|O_CREAT|O_CLOEXEC|O_TR UNC|O_NOFOLLOW, 0444); | fd = open(filename, O_WRONLY|O_CREAT|O_CLOEXEC|O_TR UNC|O_NOFOLLOW, 0444); | |||
if (fd >= 0) | if (fd >= 0) | |||
close(fd); | close(fd); | |||
else | else | |||
err = -errno; | err = -errno; | |||
} while (err == -ENOENT); | } while (err == -ENOENT); | |||
} | } | |||
} | } | |||
void udev_node_update_old_links(struct udev_device *dev, struct udev_device | void udev_node_update_old_links(struct udev_device *dev, struct udev_device | |||
*dev_old) | *dev_old) { | |||
{ | ||||
struct udev_list_entry *list_entry; | struct udev_list_entry *list_entry; | |||
/* update possible left-over symlinks */ | /* update possible left-over symlinks */ | |||
udev_list_entry_foreach(list_entry, udev_device_get_devlinks_list_e ntry(dev_old)) { | udev_list_entry_foreach(list_entry, udev_device_get_devlinks_list_e ntry(dev_old)) { | |||
const char *name = udev_list_entry_get_name(list_entry); | const char *name = udev_list_entry_get_name(list_entry); | |||
struct udev_list_entry *list_entry_current; | struct udev_list_entry *list_entry_current; | |||
int found; | int found; | |||
/* check if old link name still belongs to this device */ | /* check if old link name still belongs to this device */ | |||
found = 0; | found = 0; | |||
skipping to change at line 356 | skipping to change at line 352 | |||
snprintf(filename, sizeof(filename), "/dev/%s/%u:%u", | snprintf(filename, sizeof(filename), "/dev/%s/%u:%u", | |||
streq(udev_device_get_subsystem(dev), "block") ? "block" : "char", | streq(udev_device_get_subsystem(dev), "block") ? "block" : "char", | |||
major(udev_device_get_devnum(dev)), minor(udev_device_get_ devnum(dev))); | major(udev_device_get_devnum(dev)), minor(udev_device_get_ devnum(dev))); | |||
node_symlink(dev, udev_device_get_devnode(dev), filename); | node_symlink(dev, udev_device_get_devnode(dev), filename); | |||
/* create/update symlinks, add symlinks to name index */ | /* create/update symlinks, add symlinks to name index */ | |||
udev_list_entry_foreach(list_entry, udev_device_get_devlinks_list_e ntry(dev)) | udev_list_entry_foreach(list_entry, udev_device_get_devlinks_list_e ntry(dev)) | |||
link_update(dev, udev_list_entry_get_name(list_entr y), true); | link_update(dev, udev_list_entry_get_name(list_entr y), true); | |||
} | } | |||
void udev_node_remove(struct udev_device *dev) | void udev_node_remove(struct udev_device *dev) { | |||
{ | ||||
struct udev_list_entry *list_entry; | struct udev_list_entry *list_entry; | |||
char filename[UTIL_PATH_SIZE]; | char filename[UTIL_PATH_SIZE]; | |||
/* remove/update symlinks, remove symlinks from name index */ | /* remove/update symlinks, remove symlinks from name index */ | |||
udev_list_entry_foreach(list_entry, udev_device_get_devlinks_list_e ntry(dev)) | udev_list_entry_foreach(list_entry, udev_device_get_devlinks_list_e ntry(dev)) | |||
link_update(dev, udev_list_entry_get_name(list_entry), fals e); | link_update(dev, udev_list_entry_get_name(list_entry), fals e); | |||
/* remove /dev/{block,char}/$major:$minor */ | /* remove /dev/{block,char}/$major:$minor */ | |||
snprintf(filename, sizeof(filename), "/dev/%s/%u:%u", | snprintf(filename, sizeof(filename), "/dev/%s/%u:%u", | |||
streq(udev_device_get_subsystem(dev), "block") ? "block" : "char", | streq(udev_device_get_subsystem(dev), "block") ? "block" : "char", | |||
End of changes. 5 change blocks. | ||||
14 lines changed or deleted | 9 lines changed or added | |||
This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |