chiark / gitweb /
selinux: more context settings
[elogind.git] / udev_db.c
index 00d68d6d13f125badb08b8a78eca4de802ee309e..444725329f22c2de490a8d933478fa117191985d 100644 (file)
--- a/udev_db.c
+++ b/udev_db.c
@@ -37,7 +37,7 @@ static size_t devpath_to_db_path(const char *devpath, char *filename, size_t len
 {
        size_t start;
 
-       /* add location of db files */
+       /* translate to location of db file */
        strlcpy(filename, udev_root, len);
        start = strlcat(filename, "/"DB_DIR"/", len);
        strlcat(filename, devpath, len);
@@ -117,6 +117,16 @@ out:
        return rc;
 }
 
+int udev_db_rename(const char *devpath_old, const char *devpath)
+{
+       char filename[PATH_SIZE];
+       char filename_old[PATH_SIZE];
+
+       devpath_to_db_path(devpath_old, filename_old, sizeof(filename_old));
+       devpath_to_db_path(devpath, filename, sizeof(filename));
+       return rename(filename_old, filename);
+}
+
 int udev_db_add_device(struct udevice *udev)
 {
        char filename[PATH_SIZE];
@@ -134,8 +144,12 @@ int udev_db_add_device(struct udevice *udev)
         */
        if (list_empty(&udev->symlink_list) && list_empty(&udev->env_list) &&
            !udev->partitions && !udev->ignore_remove) {
+               int ret;
                dbg("nothing interesting to store, create symlink");
-               if (symlink(udev->name, filename) != 0) {
+               selinux_setfscreatecon(filename, NULL, S_IFLNK);        
+               ret = symlink(udev->name, filename);
+               selinux_resetfscreatecon();
+               if (ret != 0) {
                        err("unable to create db link '%s': %s", filename, strerror(errno));
                        return -1;
                }
@@ -157,9 +171,9 @@ int udev_db_add_device(struct udevice *udev)
                        name_index(udev->dev->devpath, name_loop->name, 1);
                }
                fprintf(f, "M:%u:%u\n", major(udev->devt), minor(udev->devt));
-               if (udev->link_priority)
+               if (udev->link_priority != 0)
                        fprintf(f, "L:%u\n", udev->link_priority);
-               if (udev->partitions)
+               if (udev->partitions != 0)
                        fprintf(f, "A:%u\n", udev->partitions);
                if (udev->ignore_remove)
                        fprintf(f, "R:%u\n", udev->ignore_remove);
@@ -186,7 +200,7 @@ int udev_db_get_device(struct udevice *udev, const char *devpath)
        size_t cur;
        size_t count;
 
-       strlcpy(udev->dev->devpath, devpath, sizeof(udev->dev->devpath));
+       sysfs_device_set_values(udev->dev, devpath, NULL, NULL);
        devpath_to_db_path(devpath, filename, sizeof(filename));
 
        if (lstat(filename, &stats) != 0) {