diff options
-rw-r--r-- | namedev.c | 29 | ||||
-rw-r--r-- | test/udev-test.pl | 12 |
2 files changed, 35 insertions, 6 deletions
@@ -716,18 +716,35 @@ int namedev_name_device(struct udevice *udev, struct sysfs_class_device *class_d list_for_each_entry(dev, &config_device_list, node) { dbg("process rule"); if (match_rule(udev, dev, class_dev, sysfs_device) == 0) { - /* empty name and symlink will not create any node */ if (dev->name[0] == '\0' && dev->symlink[0] == '\0') { - info("configured rule in '%s' at line %i applied, '%s' is ignored", - dev->config_file, dev->config_line, udev->kernel_name); - return -1; + /* empty name, symlink, perms will not create any node */ + if (dev->mode == 0000 && dev->owner[0] == '\0' && dev->group[0] == '\0') { + info("configured rule in '%s[%i]' applied, '%s' is ignored", + dev->config_file, dev->config_line, udev->kernel_name); + return -1; + } + + if (dev->mode != 0000) { + udev->mode = dev->mode; + dbg("applied mode=%#o to '%s'", udev->mode, udev->kernel_name); + } + if (dev->owner[0] != '\0') { + strfieldcpy(udev->owner, dev->owner); + apply_format(udev, udev->owner, sizeof(udev->owner), class_dev, sysfs_device); + dbg("applied owner='%s' to '%s'", udev->owner, udev->kernel_name); + } + if (dev->group[0] != '\0') { + strfieldcpy(udev->group, dev->group); + apply_format(udev, udev->group, sizeof(udev->group), class_dev, sysfs_device); + dbg("applied group='%s' to '%s'", udev->group, udev->kernel_name); + } } /* collect symlinks for the final matching rule */ if (dev->symlink[0] != '\0') { char temp[NAME_SIZE]; - info("configured rule in '%s' at line %i applied, added symlink '%s'", + info("configured symlink-only rule in '%s[%i]' applied, added symlink '%s'", dev->config_file, dev->config_line, dev->symlink); strfieldcpy(temp, dev->symlink); apply_format(udev, temp, sizeof(temp), class_dev, sysfs_device); @@ -743,7 +760,7 @@ int namedev_name_device(struct udevice *udev, struct sysfs_class_device *class_d (udev->type != 'b' || udev->kernel_number[0] != '\0')) continue; - info("configured rule in '%s' at line %i applied, '%s' becomes '%s'", + info("configured rule in '%s[%i]' applied, '%s' becomes '%s'", dev->config_file, dev->config_line, udev->kernel_name, dev->name); strfieldcpy(udev->name, dev->name); diff --git a/test/udev-test.pl b/test/udev-test.pl index bc8c4560d3..578adc4df1 100644 --- a/test/udev-test.pl +++ b/test/udev-test.pl @@ -622,6 +622,18 @@ KERNEL="ttyUSB[0-9]*", NAME="ttyUSB%n", OWNER="5000", GROUP="100", MODE="0777" EOF }, { + desc => "permissions only rule", + subsys => "tty", + devpath => "/class/tty/ttyUSB0", + exp_name => "ttyUSB0", + exp_perms => "5000:100:0777", + conf => <<EOF +KERNEL="ttyUSB[0-9]*", OWNER="5000", GROUP="100", MODE="0777" +KERNEL="ttyUSX[0-9]*", OWNER="5001", GROUP="101", MODE="0444" +KERNEL="ttyUSB[0-9]*", NAME="ttyUSB%n" +EOF + }, + { desc => "major/minor number test", subsys => "block", devpath => "/block/sda", |