All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kay Sievers <kay.sievers@vrfy.org>
To: linux-hotplug@vger.kernel.org
Subject: [PATCH] udev - drop all methods :)
Date: Sat, 10 Jan 2004 18:15:07 +0000	[thread overview]
Message-ID: <20040110181507.GA3969@vrfy.org> (raw)

[-- Attachment #1: Type: text/plain, Size: 1200 bytes --]


Hi,
as promised yesterday, here is a patch that drops the explicit methods
given in the udev config and implement only one type of rule.

A rule now consists only of a number of keys to match. All known keys
are valid in any combination. The former configs should work with a few
changes:

  o the "<METHOD>, " at the beginning of the line should be removed

  o the result of the externel program is matched with RESULT= instead if ID=
    the PROGRAM= key is only valid if the program exits with zero
    (just exit with nozero in a script if the rule should not match)

  o rules are processed in order they appear in the file, no priority

  o if NAME="" is given, udev is instructed to ignore this device,
    no node will be created


  EXAMPLE:

  # combined BUS, SYSFS and KERNEL
  BUS="usb", KERNEL="video*", SYSFS_model="Creative Labs WebCam*", NAME="test/webcam%n"

  # exec script only for the first ide drive (hda), all other will be skipped
  BUS="ide", KERNEL="hda*", PROGRAM="/home/kay/src/udev.kay/extras/ide-devfs.sh %k %b %n", RESULT="hd*", NAME="%1c", SYMLINK="%2c %3c"


The udev-test.pl and test.block works fine here.
Please adapt your config and give it a try.

thanks,
Kay


[-- Attachment #2: 00-drop-explicit-method-logic.diff --]
[-- Type: text/plain, Size: 32702 bytes --]

diff -Nru a/namedev.c b/namedev.c
--- a/namedev.c	Sat Jan 10 18:49:38 2004
+++ b/namedev.c	Sat Jan 10 18:49:38 2004
@@ -213,27 +213,27 @@
 				dbg("substitute major number '%u'", udev->major);
 				break;
 			case 'c':
-				if (strlen(udev->callout_value) == 0)
+				if (strlen(udev->program_result) == 0)
 					break;
 				if (num) {
 					/* get part of return string */
-					strncpy(temp, udev->callout_value, sizeof(temp));
+					strncpy(temp, udev->program_result, sizeof(temp));
 					pos2 = temp;
 					while (num) {
 						num--;
 						pos3 = strsep(&pos2, " ");
 						if (pos3 == NULL) {
-							dbg("requested part of callout string not found");
+							dbg("requested part of result string not found");
 							break;
 						}
 					}
 					if (pos3) {
 						strcat(pos, pos3);
-						dbg("substitute partial callout output '%s'", pos3);
+						dbg("substitute part of result string '%s'", pos3);
 					}
 				} else {
-					strcat(pos, udev->callout_value);
-					dbg("substitute callout output '%s'", udev->callout_value);
+					strcat(pos, udev->program_result);
+					dbg("substitute result string '%s'", udev->program_result);
 				}
 				break;
 			default:
@@ -298,28 +298,7 @@
 	return; /* here to prevent compiler warning... */
 }
 
-static int do_ignore(struct sysfs_class_device *class_dev, struct udevice *udev, struct sysfs_device *sysfs_device)
-{
-	struct config_device *dev;
-	struct list_head *tmp;
-
-	list_for_each(tmp, &config_device_list) {
-		dev = list_entry(tmp, struct config_device, node);
-		if (dev->type != IGNORE)
-			continue;
-
-		dbg("compare name '%s' with '%s'", dev->kernel_name, class_dev->name);
-		if (strcmp_pattern(dev->kernel_name, class_dev->name) != 0)
-			continue;
-
-		dbg("found name, '%s' will be ignored", dev->kernel_name);
-
-		return 0;
-	}
-	return -ENODEV;
-}
-
-static int exec_program(char *path, char *value, int len)
+static int execute_program(char *path, char *value, int len)
 {
 	int retval;
 	int res;
@@ -332,7 +311,7 @@
 	char *args[CALLOUT_MAXARG];
 	int i;
 
-	dbg("callout to '%s'", path);
+	dbg("executing '%s'", path);
 	retval = pipe(fds);
 	if (retval != 0) {
 		dbg("pipe failed");
@@ -349,7 +328,7 @@
 		close(STDOUT_FILENO);
 		dup(fds[1]);	/* dup write side of pipe to STDOUT */
 		if (strchr(path, ' ')) {
-			/* callout with arguments */
+			/* exec with arguments */
 			pos = path;
 			for (i=0; i < CALLOUT_MAXARG-1; i++) {
 				args[i] = strsep(&pos, " ");
@@ -379,11 +358,11 @@
 				break;
 			buffer[res] = '\0';
 			if (res > len) {
-				dbg("callout len %d too short", len);
+				dbg("result len %d too short", len);
 				retval = -1;
 			}
 			if (value_set) {
-				dbg("callout value already set");
+				dbg("result value already set");
 				retval = -1;
 			} else {
 				value_set = 1;
@@ -391,7 +370,7 @@
 				pos = value + strlen(value)-1;
 				if (pos[0] == '\n')
 				pos[0] = '\0';
-				dbg("callout returned '%s'", value);
+				dbg("result is '%s'", value);
 			}
 		}
 		close(fds[0]);
@@ -402,46 +381,14 @@
 		}
 
 		if (!WIFEXITED(status) || (WEXITSTATUS(status) != 0)) {
-			dbg("callout program status 0x%x", status);
+			dbg("exec program status 0x%x", status);
 			retval = -1;
 		}
 	}
 	return retval;
 }
 
-static int do_callout(struct sysfs_class_device *class_dev, struct udevice *udev, struct sysfs_device *sysfs_device)
-{
-	struct config_device *dev;
-
-	list_for_each_entry(dev, &config_device_list, node) {
-		if (dev->type != CALLOUT)
-			continue;
-
-		if (dev->bus[0] != '\0') {
-			/* as the user specified a bus, we must match it up */
-			if (!sysfs_device)
-				continue;
-			dbg("dev->bus='%s' sysfs_device->bus='%s'", dev->bus, sysfs_device->bus);
-			if (strcasecmp(dev->bus, sysfs_device->bus) != 0)
-				continue;
-		}
-
-		/* substitute anything that needs to be in the program name */
-		apply_format(udev, dev->exec_program);
-		if (exec_program(dev->exec_program, udev->callout_value, NAME_SIZE))
-			continue;
-		if (strcmp_pattern(dev->id, udev->callout_value) != 0)
-			continue;
-		strfieldcpy(udev->name, dev->name);
-		strfieldcpy(udev->symlink, dev->symlink);
-		dbg("callout returned matching value '%s', '%s' becomes '%s'",
-		    dev->id, class_dev->name, udev->name);
-		return 0;
-	}
-	return -ENODEV;
-}
-
-static int match_pair(struct sysfs_class_device *class_dev, struct sysfs_device *sysfs_device, struct sysfs_pair *pair)
+static int compare_sysfs_attribute(struct sysfs_class_device *class_dev, struct sysfs_device *sysfs_device, struct sysfs_pair *pair)
 {
 	struct sysfs_attribute *tmpattr = NULL;
 	char *c;
@@ -461,7 +408,6 @@
 		if (tmpattr)
 			goto label_found;
 	}
-
 	return -ENODEV;
 
 label_found:
@@ -478,53 +424,26 @@
 	return 0;
 }
 
-static int do_label(struct sysfs_class_device *class_dev, struct udevice *udev, struct sysfs_device *sysfs_device)
+static int match_sysfs_pairs(struct config_device *dev, struct sysfs_class_device *class_dev, struct sysfs_device *sysfs_device)
 {
 	struct sysfs_pair *pair;
-	struct config_device *dev;
 	int i;
-	int match;
-
-	list_for_each_entry(dev, &config_device_list, node) {
-		if (dev->type != LABEL)
-			continue;
-
-		if (dev->bus[0] != '\0') {
-			/* as the user specified a bus, we must match it up */
-			if (!sysfs_device)
-				continue;
-			dbg("dev->bus='%s' sysfs_device->bus='%s'", dev->bus, sysfs_device->bus);
-			if (strcasecmp(dev->bus, sysfs_device->bus) != 0)
-				continue;
-		}
 
-		match = 1;
-		for (i = 0; i < MAX_SYSFS_PAIRS; ++i) {
-			pair = &dev->sysfs_pair[i];
-			if ((pair->file[0] == '\0') || (pair->value[0] == '\0'))
-				break;
-			if (match_pair(class_dev, sysfs_device, pair) != 0) {
-				match = 0;
-				break;
-			}
+	for (i = 0; i < MAX_SYSFS_PAIRS; ++i) {
+		pair = &dev->sysfs_pair[i];
+		if ((pair->file[0] == '\0') || (pair->value[0] == '\0'))
+			break;
+		if (compare_sysfs_attribute(class_dev, sysfs_device, pair) != 0) {
+			dbg("sysfs attribute doesn't match");
+			return -ENODEV;
 		}
-		if (match == 0)
-			continue;
-
-		/* found match */
-		strfieldcpy(udev->name, dev->name);
-		strfieldcpy(udev->symlink, dev->symlink);
-		dbg("found matching attribute, '%s' becomes '%s' ",
-		    class_dev->name, udev->name);
-
-		return 0;
 	}
-	return -ENODEV;
+
+	return 0;
 }
 
-static int do_number(struct sysfs_class_device *class_dev, struct udevice *udev, struct sysfs_device *sysfs_device)
+static int match_id(struct config_device *dev, struct sysfs_class_device *class_dev, struct sysfs_device *sysfs_device)
 {
-	struct config_device *dev;
 	char path[SYSFS_PATH_MAX];
 	int found;
 	char *temp = NULL;
@@ -533,107 +452,56 @@
 	if (!sysfs_device)
 		return -ENODEV;
 
-	list_for_each_entry(dev, &config_device_list, node) {
-		if (dev->type != NUMBER)
-			continue;
-
-		dbg("dev->bus='%s' sysfs_device->bus='%s'", dev->bus, sysfs_device->bus);
-		if (strcasecmp(dev->bus, sysfs_device->bus) != 0)
-			continue;
-
-		found = 0;
-		strfieldcpy(path, sysfs_device->path);
+	found = 0;
+	strfieldcpy(path, sysfs_device->path);
+	temp = strrchr(path, '/');
+	dbg("search '%s' in '%s', path='%s'", dev->id, temp, path);
+	if (strstr(temp, dev->id) != NULL) {
+		found = 1;
+	} else {
+		*temp = 0x00;
 		temp = strrchr(path, '/');
 		dbg("search '%s' in '%s', path='%s'", dev->id, temp, path);
-		if (strstr(temp, dev->id) != NULL) {
+		if (strstr(temp, dev->id) != NULL)
 			found = 1;
-		} else {
-			*temp = 0x00;
-			temp = strrchr(path, '/');
-			dbg("search '%s' in '%s', path='%s'", dev->id, temp, path);
-			if (strstr(temp, dev->id) != NULL)
-				found = 1;
-		}
-		if (!found)
-			continue;
-		strfieldcpy(udev->name, dev->name);
-		strfieldcpy(udev->symlink, dev->symlink);
-		dbg("found matching id '%s', '%s' becomes '%s'",
-		    dev->id, class_dev->name, udev->name);
-		return 0;
 	}
-	return -ENODEV;
+	if (!found) {
+		dbg("id doesn't match");
+		return -ENODEV;
+	}
+
+	return 0;
 }
 
-static int do_topology(struct sysfs_class_device *class_dev, struct udevice *udev, struct sysfs_device *sysfs_device)
+static int match_place(struct config_device *dev, struct sysfs_class_device *class_dev, struct sysfs_device *sysfs_device)
 {
-	struct config_device *dev;
 	char path[SYSFS_PATH_MAX];
 	int found;
 	char *temp = NULL;
 
-	/* we have to have a sysfs device for TOPOLOGY to work */
+	/* we have to have a sysfs device for NUMBER to work */
 	if (!sysfs_device)
 		return -ENODEV;
 
-	list_for_each_entry(dev, &config_device_list, node) {
-		if (dev->type != TOPOLOGY)
-			continue;
-
-		dbg("dev->bus='%s' sysfs_device->bus='%s'", dev->bus, sysfs_device->bus);
-		if (strcasecmp(dev->bus, sysfs_device->bus) != 0)
-			continue;
-
-		found = 0;
-		strfieldcpy(path, sysfs_device->path);
+	found = 0;
+	strfieldcpy(path, sysfs_device->path);
+	temp = strrchr(path, '/');
+	dbg("search '%s' in '%s', path='%s'", dev->place, temp, path);
+	if (strstr(temp, dev->place) != NULL) {
+		found = 1;
+	} else {
+		*temp = 0x00;
 		temp = strrchr(path, '/');
 		dbg("search '%s' in '%s', path='%s'", dev->place, temp, path);
-		if (strstr(temp, dev->place) != NULL) {
+		if (strstr(temp, dev->place) != NULL)
 			found = 1;
-		} else {
-			*temp = 0x00;
-			temp = strrchr(path, '/');
-			dbg("search '%s' in '%s', path='%s'", dev->place, temp, path);
-			if (strstr(temp, dev->place) != NULL)
-				found = 1;
-		}
-		if (!found)
-			continue;
-
-		strfieldcpy(udev->name, dev->name);
-		strfieldcpy(udev->symlink, dev->symlink);
-		dbg("found matching place '%s', '%s' becomes '%s'",
-		    dev->place, class_dev->name, udev->name);
-		return 0;
 	}
-	return -ENODEV;
-}
-
-static int do_replace(struct sysfs_class_device *class_dev, struct udevice *udev, struct sysfs_device *sysfs_device)
-{
-	struct config_device *dev;
-
-	list_for_each_entry(dev, &config_device_list, node) {
-		if (dev->type != REPLACE)
-			continue;
-
-		dbg("compare name '%s' with '%s'", dev->kernel_name, class_dev->name);
-		if (strcmp_pattern(dev->kernel_name, class_dev->name) != 0)
-			continue;
-
-		strfieldcpy(udev->name, dev->name);
-		strfieldcpy(udev->symlink, dev->symlink);
-		dbg("found name, '%s' becomes '%s'", dev->kernel_name, udev->name);
-		
-		return 0;
+	if (!found) {
+		dbg("place doesn't match");
+		return -ENODEV;
 	}
-	return -ENODEV;
-}
 
-static void do_kernelname(struct sysfs_class_device *class_dev, struct udevice *udev)
-{
-	/* heh, this is pretty simple... */
-	strfieldcpy(udev->name, class_dev->name);
+	return 0;
 }
 
 static struct sysfs_device *get_sysfs_device(struct sysfs_class_device *class_dev)
@@ -725,7 +593,7 @@
 int namedev_name_device(struct sysfs_class_device *class_dev, struct udevice *udev)
 {
 	struct sysfs_device *sysfs_device = NULL;
-	int retval = 0;
+	struct config_device *dev;
 	struct perm_device *perm;
 	char *pos;
 
@@ -752,34 +620,108 @@
 	strfieldcpy(udev->kernel_number, pos);
 	dbg("kernel_number='%s'", udev->kernel_number);
 
-	/* rules are looked at in priority order */
-	retval = do_ignore(class_dev, udev, sysfs_device);
-	if (retval == 0) {
-		dbg("name, '%s' is being ignored", class_dev->name);
-		return 1;
-	}
+	/* look for a matching rule to apply */
+	list_for_each_entry(dev, &config_device_list, node) {
 
-	retval = do_callout(class_dev, udev, sysfs_device);
-	if (retval == 0)
-		goto found;
+		/* check for matching bus value */
+		if (dev->bus[0] != '\0') {
+			if (sysfs_device == NULL) {
+				dbg("device has no bus");
+				continue;
+			}
+			dbg("check for " FIELD_BUS " dev->bus='%s' sysfs_device->bus='%s'", dev->bus, sysfs_device->bus);
+			if (strcmp_pattern(dev->bus, sysfs_device->bus) != 0) {
+				dbg(FIELD_BUS " is not matching");
+				continue;
+			} else {
+				dbg(FIELD_BUS " matches");
+			}
+		}
 
-	retval = do_label(class_dev, udev, sysfs_device);
-	if (retval == 0)
-		goto found;
+		/* check for matching kernel name*/
+		if (dev->kernel[0] != '\0') {
+			dbg("check for " FIELD_KERNEL " dev->kernel='%s' class_dev->name='%s'", dev->kernel, class_dev->name);
+			if (strcmp_pattern(dev->kernel, class_dev->name) != 0) {
+				dbg(FIELD_KERNEL " is not matching");
+				continue;
+			} else {
+				dbg(FIELD_KERNEL " matches");
+			}
+		}
 
-	retval = do_number(class_dev, udev, sysfs_device);
-	if (retval == 0)
-		goto found;
+		/* check for matching sysfs pairs */
+		if (dev->sysfs_pair != NULL) {
+			dbg("check " FIELD_SYSFS " pairs");
+			if (match_sysfs_pairs(dev, class_dev, sysfs_device) != 0) {
+				dbg(FIELD_SYSFS " is not matching");
+				continue;
+			} else {
+				dbg(FIELD_SYSFS " matches");
+			}
+		}
 
-	retval = do_topology(class_dev, udev, sysfs_device);
-	if (retval == 0)
-		goto found;
+		/* check for matching bus id */
+		if (dev->id[0] != '\0') {
+			dbg("check " FIELD_ID);
+			if (match_id(dev, class_dev, sysfs_device) != 0) {
+				dbg(FIELD_ID " is not matching");
+				continue;
+			} else {
+				dbg(FIELD_ID " matches");
+			}
+		}
+
+		/* check for matching place of device */
+		if (dev->place[0] != '\0') {
+			dbg("check " FIELD_PLACE);
+			if (match_place(dev, class_dev, sysfs_device) != 0) {
+				dbg(FIELD_PLACE " is not matching");
+				continue;
+			} else {
+				dbg(FIELD_PLACE " matches");
+			}
+		}
 
-	retval = do_replace(class_dev, udev, sysfs_device);
-	if (retval == 0)
+		/* execute external program */
+		if (dev->program[0] != '\0') {
+			dbg("check " FIELD_PROGRAM);
+			apply_format(udev, dev->program);
+			if (execute_program(dev->program, udev->program_result, NAME_SIZE) != 0) {
+				dbg(FIELD_PROGRAM " returned nozero");
+				continue;
+			} else {
+				dbg(FIELD_PROGRAM " returned successful");
+			}
+		}
+
+		/* check for matching result of external program */
+		if (dev->result[0] != '\0') {
+			dbg("check for " FIELD_RESULT
+			    " dev->result='%s', udev->program_result='%s'",
+			    dev->result, udev->program_result);
+			if (strcmp_pattern(dev->result, udev->program_result) != 0) {
+				dbg(FIELD_RESULT " is not matching");
+				continue;
+			} else {
+				dbg(FIELD_RESULT " matches");
+			}
+		}
+
+		/* check if we are instructed to ignore this device */
+		if (dev->name[0] == '\0') {
+			dbg("instructed to ignore this device");
+			return -1;
+		}
+
+		/* Yup, this rule belongs to us! */
+		dbg("found matching rule, '%s' becomes '%s'", dev->kernel, udev->name);
+		strfieldcpy(udev->name, dev->name);
+		strfieldcpy(udev->symlink, dev->symlink);
 		goto found;
+	}
 
-	do_kernelname(class_dev, udev);
+	/* no rule was found so we use the kernel name */
+	strfieldcpy(udev->name, class_dev->name);
 	goto done;
 
 found:
diff -Nru a/namedev.h b/namedev.h
--- a/namedev.h	Sat Jan 10 18:49:38 2004
+++ b/namedev.h	Sat Jan 10 18:49:38 2004
@@ -28,17 +28,6 @@
 
 struct sysfs_class_device;
 
-
-enum config_type {
-	KERNEL_NAME	= 0,	/* must be 0 to let memset() default to this value */
-	LABEL		= 1,
-	NUMBER		= 2,
-	TOPOLOGY	= 3,
-	REPLACE		= 4,
-	CALLOUT		= 5,
-	IGNORE		= 6,
-};
-
 #define BUS_SIZE	30
 #define FILE_SIZE	50
 #define VALUE_SIZE	100
@@ -46,23 +35,17 @@
 #define PLACE_SIZE	50
 #define PROGRAM_SIZE	100
 
-#define TYPE_LABEL	"LABEL"
-#define TYPE_NUMBER	"NUMBER"
-#define TYPE_TOPOLOGY	"TOPOLOGY"
-#define TYPE_REPLACE	"REPLACE"
-#define TYPE_CALLOUT	"CALLOUT"
-#define TYPE_IGNORE	"IGNORE"
-
 #define FIELD_BUS	"BUS"
-#define FIELD_ID	"ID"
 #define FIELD_SYSFS	"SYSFS_"
+#define FIELD_ID	"ID"
 #define FIELD_PLACE	"PLACE"
 #define FIELD_PROGRAM	"PROGRAM"
+#define FIELD_RESULT	"RESULT"
 #define FIELD_KERNEL	"KERNEL"
 #define FIELD_NAME	"NAME"
 #define FIELD_SYMLINK	"SYMLINK"
 
-#define CALLOUT_MAXARG	8
+#define CALLOUT_MAXARG	10
 #define MAX_SYSFS_PAIRS	5
 
 struct sysfs_pair {
@@ -73,12 +56,12 @@
 struct config_device {
 	struct list_head node;
 
-	enum config_type type;
 	char bus[BUS_SIZE];
 	char id[ID_SIZE];
 	char place[PLACE_SIZE];
-	char kernel_name[NAME_SIZE];
-	char exec_program[PROGRAM_SIZE];
+	char kernel[NAME_SIZE];
+	char program[PROGRAM_SIZE];
+	char result[PROGRAM_SIZE];
 	char name[NAME_SIZE];
 	char symlink[NAME_SIZE];
 	struct sysfs_pair sysfs_pair[MAX_SYSFS_PAIRS];
diff -Nru a/namedev_parse.c b/namedev_parse.c
--- a/namedev_parse.c	Sat Jan 10 18:49:38 2004
+++ b/namedev_parse.c	Sat Jan 10 18:49:38 2004
@@ -86,37 +86,13 @@
 
 void dump_config_dev(struct config_device *dev)
 {
-	switch (dev->type) {
-	case KERNEL_NAME:
-		dbg_parse("KERNEL name='%s'", dev->name);
-		break;
-	case LABEL:
-		dbg_parse("LABEL name='%s', bus='%s', sysfs_file[0]='%s', sysfs_value[0]='%s'",
-			  dev->name, dev->bus, dev->sysfs_pair[0].file, dev->sysfs_pair[0].value);
-		break;
-	case NUMBER:
-		dbg_parse("NUMBER name='%s', bus='%s', id='%s'",
-			  dev->name, dev->bus, dev->id);
-		break;
-	case TOPOLOGY:
-		dbg_parse("TOPOLOGY name='%s', bus='%s', place='%s'",
-			  dev->name, dev->bus, dev->place);
-		break;
-	case REPLACE:
-		dbg_parse("REPLACE name='%s', kernel_name='%s'",
-			  dev->name, dev->kernel_name);
-		break;
-	case CALLOUT:
-		dbg_parse("CALLOUT name='%s', bus='%s', program='%s', id='%s'",
-			  dev->name, dev->bus, dev->exec_program, dev->id);
-		break;
-	case IGNORE:
-		dbg_parse("IGNORE name='%s', kernel_name='%s'",
-			  dev->name, dev->kernel_name);
-		break;
-	default:
-		dbg_parse("unknown type of method");
-	}
+	/*FIXME dump all sysfs's */
+	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'",
+		  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);
 }
 
 void dump_config_dev_list(void)
@@ -185,42 +161,6 @@
 
 		memset(&dev, 0x00, sizeof(struct config_device));
 
-		/* get the method */
-		temp2 = strsep(&temp, ",");
-
-		if (strcasecmp(temp2, TYPE_LABEL) == 0) {
-			dev.type = LABEL;
-			goto keys;
-		}
-
-		if (strcasecmp(temp2, TYPE_NUMBER) == 0) {
-			dev.type = NUMBER;
-			goto keys;
-		}
-
-		if (strcasecmp(temp2, TYPE_TOPOLOGY) == 0) {
-			dev.type = TOPOLOGY;
-			goto keys;
-		}
-
-		if (strcasecmp(temp2, TYPE_REPLACE) == 0) {
-			dev.type = REPLACE;
-			goto keys;
-		}
-
-		if (strcasecmp(temp2, TYPE_CALLOUT) == 0) {
-			dev.type = CALLOUT;
-			goto keys;
-		}
-
-		if (strcasecmp(temp2, TYPE_IGNORE) == 0) {
-			dev.type = IGNORE;
-			goto keys;
-		}
-
-		dbg_parse("unknown type of method '%s'", temp2);
-		goto error;
-keys:
 		/* get all known keys */
 		while (1) {
 			retval = get_pair(&temp, &temp2, &temp3);
@@ -264,12 +204,17 @@
 			}
 
 			if (strcasecmp(temp2, FIELD_KERNEL) == 0) {
-				strfieldcpy(dev.kernel_name, temp3);
+				strfieldcpy(dev.kernel, temp3);
 				continue;
 			}
 
 			if (strcasecmp(temp2, FIELD_PROGRAM) == 0) {
-				strfieldcpy(dev.exec_program, temp3);
+				strfieldcpy(dev.program, temp3);
+				continue;
+			}
+
+			if (strcasecmp(temp2, FIELD_RESULT) == 0) {
+				strfieldcpy(dev.result, temp3);
 				continue;
 			}
 
@@ -286,62 +231,20 @@
 			dbg_parse("unknown type of field '%s'", temp2);
 		}
 
-		/* check presence of keys according to method type */
-		switch (dev.type) {
-		case LABEL:
-			dbg_parse(TYPE_LABEL " name='%s', bus='%s', "
-				  "sysfs_file[0]='%s', sysfs_value[0]='%s', symlink='%s'",
-				  dev.name, dev.bus, dev.sysfs_pair[0].file,
-				  dev.sysfs_pair[0].value, dev.symlink);
-			if ((*dev.name == '\0') ||
-			    (*dev.sysfs_pair[0].file == '\0') ||
-			    (*dev.sysfs_pair[0].value == '\0'))
-				goto error;
-			break;
-		case NUMBER:
-			dbg_parse(TYPE_NUMBER " name='%s', bus='%s', id='%s', symlink='%s'",
-				  dev.name, dev.bus, dev.id, dev.symlink);
-			if ((*dev.name == '\0') ||
-			    (*dev.bus == '\0') ||
-			    (*dev.id == '\0'))
-				goto error;
-			break;
-		case TOPOLOGY:
-			dbg_parse(TYPE_TOPOLOGY " name='%s', bus='%s', "
-				  "place='%s', symlink='%s'",
-				  dev.name, dev.bus, dev.place, dev.symlink);
-			if ((*dev.name == '\0') ||
-			    (*dev.bus == '\0') ||
-			    (*dev.place == '\0'))
-				goto error;
-			break;
-		case REPLACE:
-			dbg_parse(TYPE_REPLACE " name='%s', kernel_name='%s', symlink='%s'",
-				  dev.name, dev.kernel_name, dev.symlink);
-			if ((*dev.name == '\0') ||
-			    (*dev.kernel_name == '\0'))
-				goto error;
-			break;
-		case CALLOUT:
-			dbg_parse(TYPE_CALLOUT " name='%s', bus='%s', program='%s', "
-				  "id='%s', symlink='%s'",
-				  dev.name, dev.bus, dev.exec_program,
-				  dev.id, dev.symlink);
-			if ((*dev.name == '\0') ||
-			    (*dev.id == '\0') ||
-			    (*dev.exec_program == '\0'))
-				goto error;
-			break;
-		case IGNORE:
-			dbg_parse(TYPE_IGNORE "name='%s', kernel_name='%s'",
-				  dev.name, dev.kernel_name);
-			if ((*dev.kernel_name == '\0'))
-				goto error;
-			break;
-		default:
-			dbg_parse("unknown type of method");
+		/* simple plausibility check for given keys */
+		if ((dev.sysfs_pair[0].file[0] == '\0') ^
+		    (dev.sysfs_pair[0].value[0] == '\0')) {
+			dbg("inconsistency in SYSFS_ key");
 			goto error;
 		}
+
+		if ((dev.result[0] != '\0') &&
+		    (dev.program[0] == '\0')) {
+			dbg("RESULT is only useful when PROGRAM is set");
+			goto error;
+		}
+
+		/* FIXME: add more checks */
 
 		retval = add_config_dev(&dev);
 		if (retval) {
diff -Nru a/test/udev-test.pl b/test/udev-test.pl
--- a/test/udev-test.pl	Sat Jan 10 18:49:38 2004
+++ b/test/udev-test.pl	Sat Jan 10 18:49:38 2004
@@ -38,8 +38,8 @@
 		devpath  => "block/sda",
 		expected => "boot_disk" ,
 		conf     => <<EOF
-LABEL, BUS="scsi", SYSFS_vendor="IBM-ESXS", NAME="boot_disk%n"
-REPLACE, KERNEL="ttyUSB0", NAME="visor"
+BUS="scsi", SYSFS_vendor="IBM-ESXS", NAME="boot_disk%n"
+KERNEL="ttyUSB0", NAME="visor"
 EOF
 	},
 	{
@@ -48,7 +48,7 @@
 		devpath  => "block/sda/sda1",
 		expected => "boot_disk1" ,
 		conf     => <<EOF
-LABEL, BUS="scsi", SYSFS_vendor="IBM-ESXS", NAME="boot_disk%n"
+BUS="scsi", SYSFS_vendor="IBM-ESXS", NAME="boot_disk%n"
 EOF
 	},
 	{
@@ -57,10 +57,10 @@
 		devpath  => "block/sda/sda1",
 		expected => "boot_disk1" ,
 		conf     => <<EOF
-LABEL, BUS="scsi", SYSFS_vendor="?IBM-ESXS", NAME="boot_disk%n-1"
-LABEL, BUS="scsi", SYSFS_vendor="IBM-ESXS?", NAME="boot_disk%n-2"
-LABEL, BUS="scsi", SYSFS_vendor="IBM-ES??", NAME="boot_disk%n"
-LABEL, BUS="scsi", SYSFS_vendor="IBM-ESXSS", NAME="boot_disk%n-3"
+BUS="scsi", SYSFS_vendor="?IBM-ESXS", NAME="boot_disk%n-1"
+BUS="scsi", SYSFS_vendor="IBM-ESXS?", NAME="boot_disk%n-2"
+BUS="scsi", SYSFS_vendor="IBM-ES??", NAME="boot_disk%n"
+BUS="scsi", SYSFS_vendor="IBM-ESXSS", NAME="boot_disk%n-3"
 EOF
 	},
 	{
@@ -69,8 +69,8 @@
 		devpath  => "block/sda/sda1",
 		expected => "boot_disk1" ,
 		conf     => <<EOF
-LABEL, BUS="scsi", SYSFS_vendor="IBM-ESXS", SYSFS_model="ST336605LW   !#", NAME="boot_diskX%n"
-LABEL, BUS="scsi", SYSFS_vendor="IBM-ESXS", SYSFS_model="ST336605LW    !#", NAME="boot_disk%n"
+BUS="scsi", SYSFS_vendor="IBM-ESXS", SYSFS_model="ST336605LW   !#", NAME="boot_diskX%n"
+BUS="scsi", SYSFS_vendor="IBM-ESXS", SYSFS_model="ST336605LW    !#", NAME="boot_disk%n"
 EOF
 	},
 	{
@@ -79,8 +79,8 @@
 		devpath  => "block/sda/sda1",
 		expected => "boot_disk1" ,
 		conf     => <<EOF
-LABEL, BUS="scsi", SYSFS_vendor="IBM-ESXS", SYSFS_model="ST336605LW    !#", SYSFS_scsi_level="4", SYSFS_rev="B245", SYSFS_type="2", SYSFS_queue_depth="32", NAME="boot_diskXX%n"
-LABEL, BUS="scsi", SYSFS_vendor="IBM-ESXS", SYSFS_model="ST336605LW    !#", SYSFS_scsi_level="4", SYSFS_rev="B245", SYSFS_type="0", NAME="boot_disk%n"
+BUS="scsi", SYSFS_vendor="IBM-ESXS", SYSFS_model="ST336605LW    !#", SYSFS_scsi_level="4", SYSFS_rev="B245", SYSFS_type="2", SYSFS_queue_depth="32", NAME="boot_diskXX%n"
+BUS="scsi", SYSFS_vendor="IBM-ESXS", SYSFS_model="ST336605LW    !#", SYSFS_scsi_level="4", SYSFS_rev="B245", SYSFS_type="0", NAME="boot_disk%n"
 EOF
 	},
 	{
@@ -89,7 +89,7 @@
 		devpath  => "class/tty/ttyUSB0",
 		expected => "visor/0" ,
 		conf     => <<EOF
-REPLACE, KERNEL="ttyUSB*", NAME="visor/%n"
+KERNEL="ttyUSB*", NAME="visor/%n"
 EOF
 	},
 	{
@@ -98,9 +98,9 @@
 		devpath  => "class/tty/ttyUSB0",
 		expected => "visor/0" ,
 		conf     => <<EOF
-REPLACE, KERNEL="ttyUSB??*", NAME="visor/%n-1"
-REPLACE, KERNEL="ttyUSB??", NAME="visor/%n-2"
-REPLACE, KERNEL="ttyUSB?", NAME="visor/%n"
+KERNEL="ttyUSB??*", NAME="visor/%n-1"
+KERNEL="ttyUSB??", NAME="visor/%n-2"
+KERNEL="ttyUSB?", NAME="visor/%n"
 EOF
 	},
 	{
@@ -109,9 +109,9 @@
 		devpath  => "class/tty/ttyUSB0",
 		expected => "visor/0" ,
 		conf     => <<EOF
-REPLACE, KERNEL="ttyUSB[A-Z]*", NAME="visor/%n-1"
-REPLACE, KERNEL="ttyUSB?[0-9]", NAME="visor/%n-2"
-REPLACE, KERNEL="ttyUSB[0-9]*", NAME="visor/%n"
+KERNEL="ttyUSB[A-Z]*", NAME="visor/%n-1"
+KERNEL="ttyUSB?[0-9]", NAME="visor/%n-2"
+KERNEL="ttyUSB[0-9]*", NAME="visor/%n"
 EOF
 	},
 	{
@@ -120,7 +120,7 @@
 		devpath  => "class/tty/ttyUSB0",
 		expected => "visor" ,
 		conf     => <<EOF
-REPLACE, KERNEL="ttyUSB0", NAME="visor"
+KERNEL="ttyUSB0", NAME="visor"
 EOF
 	},
 	{
@@ -130,7 +130,7 @@
 		expected => "visor" ,
 		conf     => <<EOF
 # this is a comment
-REPLACE, KERNEL="ttyUSB0", NAME="visor"
+KERNEL="ttyUSB0", NAME="visor"
 
 EOF
 	},
@@ -141,7 +141,7 @@
 		expected => "visor" ,
 		conf     => <<EOF
  # this is a comment with whitespace before the comment 
-REPLACE, KERNEL="ttyUSB0", NAME="visor"
+KERNEL="ttyUSB0", NAME="visor"
 
 EOF
 	},
@@ -152,7 +152,7 @@
 		expected => "visor" ,
 		conf     => <<EOF
 
-REPLACE, KERNEL="ttyUSB0", NAME="visor"
+KERNEL="ttyUSB0", NAME="visor"
 
 EOF
 	},
@@ -162,7 +162,7 @@
 		devpath  => "class/tty/ttyUSB0",
 		expected => "sub/direct/ory/visor" ,
 		conf     => <<EOF
-REPLACE, KERNEL="ttyUSB0", NAME="sub/direct/ory/visor"
+KERNEL="ttyUSB0", NAME="sub/direct/ory/visor"
 EOF
 	},
 	{
@@ -171,7 +171,7 @@
 		devpath  => "block/sda/sda3",
 		expected => "first_disk3" ,
 		conf     => <<EOF
-TOPOLOGY, BUS="scsi", PLACE="0:0:0:0", NAME="first_disk%n"
+BUS="scsi", PLACE="0:0:0:0", NAME="first_disk%n"
 EOF
 	},
 	{
@@ -180,58 +180,58 @@
 		devpath  => "block/sda/sda3",
 		expected => "Major:8:minor:3:kernelnumber:3:bus:0:0:0:0" ,
 		conf     => <<EOF
-TOPOLOGY, BUS="scsi", PLACE="0:0:0:0", NAME="Major:%M:minor:%m:kernelnumber:%n:bus:%b"
+BUS="scsi", PLACE="0:0:0:0", NAME="Major:%M:minor:%m:kernelnumber:%n:bus:%b"
 EOF
 	},
 	{
-		desc     => "callout result substitution",
+		desc     => "program result substitution",
 		subsys   => "block",
 		devpath  => "block/sda/sda3",
 		expected => "special-device-3" ,
 		conf     => <<EOF
-CALLOUT, BUS="scsi", PROGRAM="/bin/echo -n special-device", ID="-special-*", NAME="%c-1-%n"
-CALLOUT, BUS="scsi", PROGRAM="/bin/echo -n special-device", ID="special--*", NAME="%c-2-%n"
-CALLOUT, BUS="scsi", PROGRAM="/bin/echo -n special-device", ID="special-device-", NAME="%c-3-%n"
-CALLOUT, BUS="scsi", PROGRAM="/bin/echo -n special-device", ID="special-devic", NAME="%c-4-%n"
-CALLOUT, BUS="scsi", PROGRAM="/bin/echo -n special-device", ID="special-*", NAME="%c-%n"
+BUS="scsi", PROGRAM="/bin/echo -n special-device", RESULT="-special-*", NAME="%c-1-%n"
+BUS="scsi", PROGRAM="/bin/echo -n special-device", RESULT="special--*", NAME="%c-2-%n"
+BUS="scsi", PROGRAM="/bin/echo -n special-device", RESULT="special-device-", NAME="%c-3-%n"
+BUS="scsi", PROGRAM="/bin/echo -n special-device", RESULT="special-devic", NAME="%c-4-%n"
+BUS="scsi", PROGRAM="/bin/echo -n special-device", RESULT="special-*", NAME="%c-%n"
 EOF
 	},
 	{
-		desc     => "callout program substitution",
+		desc     => "program result substitution",
 		subsys   => "block",
 		devpath  => "block/sda/sda3",
 		expected => "test-0:0:0:0" ,
 		conf     => <<EOF
-CALLOUT, BUS="scsi", PROGRAM="/bin/echo -n test-%b", ID="test-*", NAME="%c"
+BUS="scsi", PROGRAM="/bin/echo -n test-%b", RESULT="test-0:0*", NAME="%c"
 EOF
 	},
 	{
-		desc     => "callout program substitution (numbered part of)",
+		desc     => "program result substitution (numbered part of)",
 		subsys   => "block",
 		devpath  => "block/sda/sda3",
 		expected => "link1" ,
 		conf     => <<EOF
-CALLOUT, BUS="scsi", PROGRAM="/bin/echo -n node link1 link2", ID="node *", NAME="%1c", SYMLINK="%2c %3c"
+BUS="scsi", PROGRAM="/bin/echo -n node link1 link2", RESULT="node *", NAME="%1c", SYMLINK="%2c %3c"
 EOF
 	},
 	{
-		desc     => "invalid callout for device with no bus",
+		desc     => "invalid program for device with no bus",
 		subsys   => "tty",
 		devpath  => "class/tty/console",
 		expected => "TTY" ,
 		conf     => <<EOF
-CALLOUT, BUS="scsi", PROGRAM="/bin/echo -n foo", ID="foo", NAME="foo"
-REPLACE, KERNEL="console", NAME="TTY"
+BUS="scsi", PROGRAM="/bin/echo -n foo", RESULT="foo", NAME="foo"
+KERNEL="console", NAME="TTY"
 EOF
 	},
 	{
-		desc     => "valid callout for device with no bus",
+		desc     => "valid program for device with no bus",
 		subsys   => "tty",
 		devpath  => "class/tty/console",
 		expected => "foo" ,
 		conf     => <<EOF
-CALLOUT, PROGRAM="/bin/echo -n foo", ID="foo", NAME="foo"
-REPLACE, KERNEL="console", NAME="TTY"
+PROGRAM="/bin/echo -n foo", RESULT="foo", NAME="foo"
+KERNEL="console", NAME="TTY"
 EOF
 	},
 	{
@@ -240,8 +240,8 @@
 		devpath  => "class/tty/console",
 		expected => "TTY" ,
 		conf     => <<EOF
-LABEL, BUS="foo", SYSFS_dev="5:1", NAME="foo"
-REPLACE, KERNEL="console", NAME="TTY"
+BUS="foo", SYSFS_dev="5:1", NAME="foo"
+KERNEL="console", NAME="TTY"
 EOF
 	},
 	{
@@ -250,8 +250,8 @@
 		devpath  => "class/tty/console",
 		expected => "foo" ,
 		conf     => <<EOF
-LABEL, SYSFS_dev="5:1", NAME="foo"
-REPLACE, KERNEL="console", NAME="TTY"
+SYSFS_dev="5:1", NAME="foo"
+KERNEL="console", NAME="TTY"
 EOF
 	},
 	{
@@ -260,7 +260,7 @@
 		devpath  => "block/sda",
 		expected => "lun0/disc" ,
 		conf     => <<EOF
-LABEL, BUS="scsi", SYSFS_vendor="IBM-ESXS", NAME="lun0/%D"
+BUS="scsi", SYSFS_vendor="IBM-ESXS", NAME="lun0/%D"
 EOF
 	},
 	{
@@ -269,18 +269,18 @@
 		devpath  => "block/sda/sda2",
 		expected => "lun0/part2" ,
 		conf     => <<EOF
-LABEL, BUS="scsi", SYSFS_vendor="IBM-ESXS", NAME="lun0/%D"
+BUS="scsi", SYSFS_vendor="IBM-ESXS", NAME="lun0/%D"
 EOF
 	},
 	{
-		desc     => "callout bus type",
+		desc     => "program and bus type match",
 		subsys   => "block",
 		devpath  => "block/sda",
 		expected => "scsi-0:0:0:0" ,
 		conf     => <<EOF
-CALLOUT, BUS="usb", PROGRAM="/bin/echo -n usb-%b", ID="*", NAME="%c"
-CALLOUT, BUS="scsi", PROGRAM="/bin/echo -n scsi-%b", ID="*", NAME="%c"
-CALLOUT, BUS="foo", PROGRAM="/bin/echo -n foo-%b", ID="*", NAME="%c"
+BUS="usb", PROGRAM="/bin/echo -n usb-%b", NAME="%c"
+BUS="scsi", PROGRAM="/bin/echo -n scsi-%b", NAME="%c"
+BUS="foo", PROGRAM="/bin/echo -n foo-%b", NAME="%c"
 EOF
 	},
 	{
@@ -289,7 +289,7 @@
 		devpath  => "class/tty/ttyUSB0",
 		expected => "visor0" ,
 		conf     => <<EOF
-REPLACE, KERNEL="ttyUSB[0-9]*", NAME="ttyUSB%n", SYMLINK="visor%n"
+KERNEL="ttyUSB[0-9]*", NAME="ttyUSB%n", SYMLINK="visor%n"
 EOF
 	},
 	{
@@ -298,7 +298,7 @@
 		devpath  => "block/sda/sda2",
 		expected => "1/2/a/b/symlink" ,
 		conf     => <<EOF
-LABEL, BUS="scsi", SYSFS_vendor="IBM-ESXS", NAME="1/2/node", SYMLINK="1/2/a/b/symlink"
+BUS="scsi", SYSFS_vendor="IBM-ESXS", NAME="1/2/node", SYMLINK="1/2/a/b/symlink"
 EOF
 	},
 	{
@@ -307,7 +307,7 @@
 		devpath  => "block/sda/sda2",
 		expected => "1/2/symlink" ,
 		conf     => <<EOF
-LABEL, BUS="scsi", SYSFS_vendor="IBM-ESXS", NAME="1/2/a/b/node", SYMLINK="1/2/symlink"
+BUS="scsi", SYSFS_vendor="IBM-ESXS", NAME="1/2/a/b/node", SYMLINK="1/2/symlink"
 EOF
 	},
 	{
@@ -316,7 +316,7 @@
 		devpath  => "block/sda/sda2",
 		expected => "1/2/c/d/symlink" ,
 		conf     => <<EOF
-LABEL, BUS="scsi", SYSFS_vendor="IBM-ESXS", NAME="1/2/a/b/node", SYMLINK="1/2/c/d/symlink"
+BUS="scsi", SYSFS_vendor="IBM-ESXS", NAME="1/2/a/b/node", SYMLINK="1/2/c/d/symlink"
 EOF
 	},
 	{
@@ -325,7 +325,7 @@
 		devpath  => "class/tty/ttyUSB0",
 		expected => "second-0" ,
 		conf     => <<EOF
-REPLACE, KERNEL="ttyUSB0", NAME="visor", SYMLINK="first-%n second-%n third-%n"
+KERNEL="ttyUSB0", NAME="visor", SYMLINK="first-%n second-%n third-%n"
 EOF
 	},
 );
@@ -368,11 +368,8 @@
 close CONF;
 
 foreach my $config (@tests) {
-	$config->{conf} =~ m/([A-Z]+)\s*,/;
-	my $method  = $1;
-
 	print "TEST: $config->{desc}\n";
-	print "method \'$method\' for \'$config->{devpath}\' expecting node \'$config->{expected}\'\n";
+	print "device \'$config->{devpath}\' expecting node \'$config->{expected}\'\n";
 
 	udev("add", $config->{subsys}, $config->{devpath}, \$config->{conf});
 	if (-e "$PWD/$udev_root$config->{expected}") {
diff -Nru a/udev.h b/udev.h
--- a/udev.h	Sat Jan 10 18:49:38 2004
+++ b/udev.h	Sat Jan 10 18:49:38 2004
@@ -68,7 +68,7 @@
 
 	/* fields that help us in building strings */
 	unsigned char bus_id[SYSFS_NAME_LEN];
-	unsigned char callout_value[NAME_SIZE];
+	unsigned char program_result[NAME_SIZE];
 	unsigned char kernel_number[NAME_SIZE];
 	unsigned char kernel_name[NAME_SIZE];
 

             reply	other threads:[~2004-01-10 18:15 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-01-10 18:15 Kay Sievers [this message]
2004-01-11 22:56 ` [PATCH] udev - drop all methods :) Kay Sievers
2004-01-12 23:42 ` Greg KH
2004-01-12 23:53 ` Kay Sievers
2004-01-13 16:01 ` Patrick Mansfield

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20040110181507.GA3969@vrfy.org \
    --to=kay.sievers@vrfy.org \
    --cc=linux-hotplug@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.