chiark / gitweb /
[PATCH] remove the device node only if the major/minor number matches
authorkay.sievers@vrfy.org <kay.sievers@vrfy.org>
Fri, 18 Feb 2005 02:30:03 +0000 (03:30 +0100)
committerGreg KH <gregkh@suse.de>
Wed, 27 Apr 2005 06:36:13 +0000 (23:36 -0700)
test/udev-test.pl
udev_db.c
udev_remove.c

index 5f9c0cb9c503a46f56660e4d1082d61e0daf9a4f..fe7b932669e824d7eb29b0bf05fdd9c8da125922 100644 (file)
@@ -755,17 +755,6 @@ EOF
 BUS="scsi", KERNEL="sda", SYMLINK="symlink-only1"
 BUS="scsi", KERNEL="sda", SYMLINK="symlink-only2"
 BUS="scsi", KERNEL="sda", NAME="link", SYMLINK="symlink0"
 BUS="scsi", KERNEL="sda", SYMLINK="symlink-only1"
 BUS="scsi", KERNEL="sda", SYMLINK="symlink-only2"
 BUS="scsi", KERNEL="sda", NAME="link", SYMLINK="symlink0"
-EOF
-       },
-       {
-               desc            => "symlink name empty",
-               subsys          => "block",
-               devpath         => "/block/sda",
-               exp_name        => "",
-               exp_target      => "link",
-               exp_error       => "yes",
-               conf            => <<EOF
-BUS="scsi", KERNEL="sda", NAME="link", SYMLINK=""
 EOF
        },
        {
 EOF
        },
        {
@@ -774,7 +763,8 @@ EOF
                devpath         => "/block/sda",
                exp_name        => ".",
                exp_target      => "link",
                devpath         => "/block/sda",
                exp_name        => ".",
                exp_target      => "link",
-               exp_error       => "yes",
+               exp_add_error   => "yes",
+               exp_rem_error   => "yes",
                conf            => <<EOF
 BUS="scsi", KERNEL="sda", NAME="link", SYMLINK="."
 EOF
                conf            => <<EOF
 BUS="scsi", KERNEL="sda", NAME="link", SYMLINK="."
 EOF
@@ -785,7 +775,7 @@ EOF
                devpath         => "/block/sda",
                exp_name        => "symlink",
                exp_target      => "",
                devpath         => "/block/sda",
                exp_name        => "symlink",
                exp_target      => "",
-               exp_error       => "yes",
+               exp_add_error   => "yes",
                conf            => <<EOF
 BUS="scsi", KERNEL="sda", NAME="", SYMLINK="symlink"
 EOF
                conf            => <<EOF
 BUS="scsi", KERNEL="sda", NAME="", SYMLINK="symlink"
 EOF
@@ -796,7 +786,8 @@ EOF
                devpath         => "/block/sda",
                exp_name        => "",
                exp_target      => "",
                devpath         => "/block/sda",
                exp_name        => "",
                exp_target      => "",
-               exp_error       => "yes",
+               exp_add_error   => "yes",
+               exp_rem_error   => "yes",
                conf            => <<EOF
 BUS="scsi", KERNEL="sda", NAME="", SYMLINK=""
 EOF
                conf            => <<EOF
 BUS="scsi", KERNEL="sda", NAME="", SYMLINK=""
 EOF
@@ -807,6 +798,8 @@ EOF
                devpath         => "/class/tty/tty0",
                exp_name        => "link",
                exp_target      => "link",
                devpath         => "/class/tty/tty0",
                exp_name        => "link",
                exp_target      => "link",
+               exp_rem_error   => "yes",
+               option          => "clear",
                conf            => <<EOF
 KERNEL="tty0", NAME="link", SYMLINK="link"
 EOF
                conf            => <<EOF
 KERNEL="tty0", NAME="link", SYMLINK="link"
 EOF
@@ -1025,7 +1018,7 @@ EOF
                subsys          => "block",
                devpath         => "/block/sda",
                exp_name        => "node",
                subsys          => "block",
                devpath         => "/block/sda",
                exp_name        => "node",
-               exp_error       => "yes",
+               exp_add_error   => "yes",
                conf            => <<EOF
 BUS="scsi", KERNEL="sda", NAME="node", OPTIONS="ignore"
 EOF
                conf            => <<EOF
 BUS="scsi", KERNEL="sda", NAME="node", OPTIONS="ignore"
 EOF
@@ -1045,7 +1038,7 @@ EOF
                subsys          => "block",
                devpath         => "/block/sda/sda1",
                exp_name        => "node6",
                subsys          => "block",
                devpath         => "/block/sda/sda1",
                exp_name        => "node6",
-               exp_error       => "yes",
+               exp_add_error   => "yes",
                conf            => <<EOF
 SUBSYSTEM="block", OPTIONS="all_partitions"
 BUS="scsi", KERNEL="sda", NAME="node"
                conf            => <<EOF
 SUBSYSTEM="block", OPTIONS="all_partitions"
 BUS="scsi", KERNEL="sda", NAME="node"
@@ -1056,7 +1049,7 @@ EOF
                subsys          => "block",
                devpath         => "/block/sda",
                exp_name        => "node",
                subsys          => "block",
                devpath         => "/block/sda",
                exp_name        => "node",
-               exp_error       => "yes",
+               exp_rem_error   => "yes",
                conf            => <<EOF
 BUS="scsi", KERNEL="sda", NAME="node", OPTIONS="ignore_remove"
 EOF
                conf            => <<EOF
 BUS="scsi", KERNEL="sda", NAME="node", OPTIONS="ignore_remove"
 EOF
@@ -1066,7 +1059,7 @@ EOF
                subsys          => "block",
                devpath         => "/block/sda",
                exp_name        => "node14",
                subsys          => "block",
                devpath         => "/block/sda",
                exp_name        => "node14",
-               exp_error       => "yes",
+               exp_rem_error   => "yes",
                option          => "clear",
                conf            => <<EOF
 BUS="scsi", KERNEL="sda", NAME="node", OPTIONS="ignore_remove, all_partitions"
                option          => "clear",
                conf            => <<EOF
 BUS="scsi", KERNEL="sda", NAME="node", OPTIONS="ignore_remove, all_partitions"
@@ -1225,7 +1218,7 @@ sub symlink_test {
                } else {
                        print "expected symlink from: \'$config->{exp_name}\' to \'$config->{exp_target}\'\n";
                        print "created symlink from: \'$config->{exp_name}\' to \'$2\'\n";
                } else {
                        print "expected symlink from: \'$config->{exp_name}\' to \'$config->{exp_target}\'\n";
                        print "created symlink from: \'$config->{exp_name}\' to \'$2\'\n";
-                       if ($config->{exp_error}) {
+                       if ($config->{exp_add_error}) {
                                print "as expected    ";
                        } else {
                                $error++;
                                print "as expected    ";
                        } else {
                                $error++;
@@ -1234,7 +1227,7 @@ sub symlink_test {
        } else {
                print "expected symlink from: \'$config->{exp_name}\' to \'$config->{exp_target}\'\n";
                print "symlink: not created ";
        } else {
                print "expected symlink from: \'$config->{exp_name}\' to \'$config->{exp_target}\'\n";
                print "symlink: not created ";
-               if ($config->{exp_error}) {
+               if ($config->{exp_add_error}) {
                        print "as expected    ";
                } else {
                        $error++;
                        print "as expected    ";
                } else {
                        $error++;
@@ -1273,7 +1266,7 @@ sub run_test {
                print "add: ok    ";
        } else {
                print "add: error ";
                print "add: ok    ";
        } else {
                print "add: error ";
-               if ($config->{exp_error}) {
+               if ($config->{exp_add_error}) {
                        print "as expected    ";
                } else {
                        print "\n\n";
                        print "as expected    ";
                } else {
                        print "\n\n";
@@ -1292,7 +1285,7 @@ sub run_test {
        if ((-e "$PWD/$udev_root$config->{exp_name}") ||
            (-l "$PWD/$udev_root$config->{exp_name}")) {
                print "remove: error ";
        if ((-e "$PWD/$udev_root$config->{exp_name}") ||
            (-l "$PWD/$udev_root$config->{exp_name}")) {
                print "remove: error ";
-               if ($config->{exp_error}) {
+               if ($config->{exp_rem_error}) {
                        print "as expected\n\n";
                } else {
                        print "\n\n";
                        print "as expected\n\n";
                } else {
                        print "\n\n";
index df7cfbb259955a021c5f289668d3e7b67a827667..0be7620ad72e898517aad6ac87bf827e358e2931 100644 (file)
--- a/udev_db.c
+++ b/udev_db.c
@@ -79,6 +79,7 @@ int udev_db_add_device(struct udevice *udev)
        fprintf(f, "P:%s\n", udev->devpath);
        fprintf(f, "N:%s\n", udev->name);
        fprintf(f, "S:%s\n", udev->symlink);
        fprintf(f, "P:%s\n", udev->devpath);
        fprintf(f, "N:%s\n", udev->name);
        fprintf(f, "S:%s\n", udev->symlink);
+       fprintf(f, "M:%u:%u\n", udev->major, udev->minor);
        fprintf(f, "A:%u\n", udev->partitions);
        fprintf(f, "R:%u\n", udev->ignore_remove);
 
        fprintf(f, "A:%u\n", udev->partitions);
        fprintf(f, "R:%u\n", udev->ignore_remove);
 
@@ -90,6 +91,7 @@ int udev_db_add_device(struct udevice *udev)
 static int parse_db_file(struct udevice *udev, const char *filename)
 {
        char line[NAME_SIZE];
 static int parse_db_file(struct udevice *udev, const char *filename)
 {
        char line[NAME_SIZE];
+       char temp[NAME_SIZE];
        char *bufline;
        char *buf;
        size_t bufsize;
        char *bufline;
        char *buf;
        size_t bufsize;
@@ -120,6 +122,13 @@ static int parse_db_file(struct udevice *udev, const char *filename)
                        strncpy(udev->name, &bufline[2], count-2);
                        udev->name[count-2] = '\0';
                        break;
                        strncpy(udev->name, &bufline[2], count-2);
                        udev->name[count-2] = '\0';
                        break;
+               case 'M':
+                       if (count > NAME_SIZE)
+                               count = NAME_SIZE-1;
+                       strncpy(temp, &bufline[2], count-2);
+                       temp[count-2] = '\0';
+                       sscanf(temp, "%u:%u", &udev->major, &udev->minor);
+                       break;
                case 'S':
                        if (count > NAME_SIZE)
                                count = NAME_SIZE-1;
                case 'S':
                        if (count > NAME_SIZE)
                                count = NAME_SIZE-1;
index 172ec12690ac993f339444a1c711e8c8986213f3..baafdea51ae9020e67161c702709e33b432cb734 100644 (file)
@@ -71,6 +71,7 @@ static int delete_node(struct udevice *udev)
 {
        char filename[NAME_SIZE];
        char partitionname[NAME_SIZE];
 {
        char filename[NAME_SIZE];
        char partitionname[NAME_SIZE];
+       struct stat stats;
        int retval;
        int i;
        char *pos;
        int retval;
        int i;
        char *pos;
@@ -80,6 +81,15 @@ static int delete_node(struct udevice *udev)
        snprintf(filename, NAME_SIZE, "%s/%s", udev_root, udev->name);
        filename[NAME_SIZE-1] = '\0';
 
        snprintf(filename, NAME_SIZE, "%s/%s", udev_root, udev->name);
        filename[NAME_SIZE-1] = '\0';
 
+       dbg("checking major/minor of device node '%s'", filename);
+       if (stat(filename, &stats) != 0)
+               return -1;
+
+       if (udev->major && stats.st_rdev != makedev(udev->major, udev->minor)) {
+               info("device node '%s' points to a different device, skip removal", filename);
+               return -1;
+       }
+
        info("removing device node '%s'", filename);
        retval = unlink_secure(filename);
        if (retval)
        info("removing device node '%s'", filename);
        retval = unlink_secure(filename);
        if (retval)