===== udev.8.in 1.77 vs edited ===== --- 1.77/udev.8.in 2005-02-10 01:03:54 +01:00 +++ edited/udev.8.in 2005-02-11 09:41:11 +01:00 @@ -59,6 +59,21 @@ The switch to enable/disable logging of udev information The default value is .IR yes . +.TP +.B udev_remove +Configure the behaviour for remove events. Possible values are +.IR all , +.IR symlinks_only , +.IR none . +When set to +.IR all , +udev will remove all device information (this is the default). When +set to +.IR symlinks_only , +udev will remove all symlinks but leave the device node +intact. When set to +.IR none , +udev will not remove any device information. .P .RI "A sample " udev.conf " file might look like this: .sp ===== udev_config.c 1.31 vs edited ===== --- 1.31/udev_config.c 2005-01-04 21:37:01 +01:00 +++ edited/udev_config.c 2005-02-11 10:04:16 +01:00 @@ -48,6 +48,7 @@ int udev_log; int udev_dev_d; int udev_hotplug_d; +int udev_remove_mode = UDEV_REMOVE_ALL; static int string_is_true(const char *str) @@ -164,6 +165,17 @@ if (strcasecmp(variable, "udev_log") == 0) { udev_log = string_is_true(value); + continue; + } + + if (strcasecmp(variable, "udev_remove") == 0) { + if (strcasecmp(value,"all") == 0) { + udev_remove_mode=UDEV_REMOVE_ALL; + } else if (strcasecmp(value,"symlinks_only") == 0) { + udev_remove_mode=UDEV_REMOVE_SYMLINKS; + } else if (strcasecmp(value,"none")) { + udev_remove_mode=UDEV_REMOVE_NONE; + } continue; } } ===== udev_db.c 1.41 vs edited ===== --- 1.41/udev_db.c 2005-02-04 18:38:55 +01:00 +++ edited/udev_db.c 2005-02-11 09:45:54 +01:00 @@ -165,6 +165,11 @@ get_db_filename(udev, filename, SYSFS_PATH_MAX); unlink(filename); + if (udev_remove_mode == UDEV_REMOVE_SYMLINKS) { + memset(udev->symlink, 0, NAME_SIZE); + udev_db_add_device(udev); + } + return 0; } ===== udev.h 1.84 vs edited ===== --- 1.84/udev.h 2005-02-09 00:43:18 +01:00 +++ edited/udev.h 2005-02-11 09:32:14 +01:00 @@ -48,6 +48,11 @@ #define DEFAULT_PARTITIONS_COUNT 15 +/* Removal modes to keep whiners happy */ +#define UDEV_REMOVE_ALL 0 +#define UDEV_REMOVE_SYMLINKS 1 +#define UDEV_REMOVE_NONE 2 + struct udevice { char devpath[DEVPATH_SIZE]; char subsystem[SUBSYSTEM_SIZE]; @@ -89,5 +94,6 @@ extern int udev_log; extern int udev_dev_d; extern int udev_hotplug_d; +extern int udev_remove_mode; #endif ===== udev_remove.c 1.45 vs edited ===== --- 1.45/udev_remove.c 2005-02-09 00:43:18 +01:00 +++ edited/udev_remove.c 2005-02-11 10:07:52 +01:00 @@ -80,6 +80,11 @@ snprintf(filename, NAME_SIZE, "%s/%s", udev_root, udev->name); filename[NAME_SIZE-1] = '\0'; + if (udev_remove_mode == UDEV_REMOVE_SYMLINKS) { + dbg("remove device nodes for '%s' requested to be ignored by config", udev->name); + goto remove_symlinks; + } + info("removing device node '%s'", filename); retval = unlink_secure(filename); if (retval) @@ -104,6 +109,7 @@ if (strchr(udev->name, '/')) delete_path(filename); + remove_symlinks: foreach_strpart(udev->symlink, " ", pos, len) { char linkname[NAME_SIZE]; @@ -152,6 +158,11 @@ if (udev->ignore_remove) { dbg("remove event for '%s' requested to be ignored by rule", udev->name); + return 0; + } + + if (udev_remove_mode == UDEV_REMOVE_NONE) { + dbg("remove event for '%s' requested to be ignored by config", udev->name); return 0; }