--- udev-039/namedev.h.norm 2004-10-16 00:08:29.000000000 +0200 +++ udev-039/namedev.h 2004-10-21 16:31:46.436124429 +0200 @@ -44,6 +44,7 @@ #define FIELD_KERNEL "KERNEL" #define FIELD_NAME "NAME" #define FIELD_SYMLINK "SYMLINK" +#define FIELD_NOREMOVE "NOREMOVE" #define FIELD_OWNER "OWNER" #define FIELD_GROUP "GROUP" #define FIELD_MODE "MODE" @@ -83,6 +84,7 @@ struct sysfs_pair sysfs_pair[MAX_SYSFS_PAIRS]; char owner[OWNER_SIZE]; char group[GROUP_SIZE]; + char noremove; unsigned int mode; int partitions; char config_file[NAME_SIZE]; --- udev-039/udev_remove.c.norm 2004-10-16 00:08:29.000000000 +0200 +++ udev-039/udev_remove.c 2004-10-21 16:31:46.438124139 +0200 @@ -113,6 +113,11 @@ strfieldcpy(filename, udev_root); strfieldcat(filename, dev->name); + + if ( dev->noremove != 0) { + info("not removing device node '%s', because of rule", filename); + return 0; + } info("removing device node '%s'", filename); retval = secure_unlink(filename); --- udev-039/namedev_parse.c.norm 2004-10-16 00:08:29.000000000 +0200 +++ udev-039/namedev_parse.c 2004-10-21 16:37:01.640537113 +0200 @@ -59,11 +59,11 @@ dbg_parse("name='%s', symlink='%s', bus='%s', place='%s', id='%s', " "sysfs_file[0]='%s', sysfs_value[0]='%s', " "kernel='%s', program='%s', result='%s'" - "owner='%s', group='%s', mode=%#o", + "owner='%s', group='%s', mode=%#o remove=%d", dev->name, dev->symlink, dev->bus, dev->place, dev->id, dev->sysfs_pair[0].file, dev->sysfs_pair[0].value, dev->kernel, dev->program, dev->result, - dev->owner, dev->group, dev->mode); + dev->owner, dev->group, dev->mode, dev->noremove); } void dump_config_dev_list(void) @@ -265,6 +265,12 @@ continue; } + if (strcasecmp(temp2, FIELD_NOREMOVE) == 0) { + dev.noremove = strtol(temp3, NULL, 10); + valid = 1; + continue; + } + if (strcasecmp(temp2, FIELD_RESULT) == 0) { strfieldcpy(dev.result, temp3); valid = 1; --- udev-039/namedev.c.norm 2004-10-16 00:08:30.000000000 +0200 +++ udev-039/namedev.c 2004-10-21 16:31:46.448122693 +0200 @@ -738,12 +738,15 @@ list_for_each_entry(dev, &config_device_list, node) { dbg("process rule"); if (match_rule(dev, class_dev, udev, sysfs_device) == 0) { - if (dev->name[0] == '\0' && dev->symlink[0] == '\0') { + if (dev->name[0] == '\0' && dev->symlink[0] == '\0' && dev->noremove == 0) { info("configured rule in '%s' at line %i applied, '%s' is ignored", dev->config_file, dev->config_line, udev->kernel_name); return -1; } + if (dev->noremove != 0) { + udev->noremove = dev->noremove; + } if (dev->symlink[0] != '\0') { char temp[NAME_SIZE]; --- udev-039/udev.h.norm 2004-10-21 16:31:46.393130647 +0200 +++ udev-039/udev.h 2004-10-21 16:31:46.442123561 +0200 @@ -52,6 +52,7 @@ char owner[OWNER_SIZE]; char group[GROUP_SIZE]; char type; + char noremove; int major; int minor; unsigned int mode; /* not mode_t due to conflicting definitions in different libcs */ --- udev-039/udevinfo.c.norm 2004-10-21 16:31:46.408128478 +0200 +++ udev-039/udevinfo.c 2004-10-21 16:31:46.443123416 +0200 @@ -116,6 +116,7 @@ printf("F: %s\n", dev->config_file); printf("L: %i\n", dev->config_line); printf("U: %li\n", dev->config_uptime); + printf("R: %d\n", dev->noremove); printf("\n"); return 0; }