- /* get a line */
- temp = fgets(line, sizeof(line), fd);
- if (temp == NULL)
- break;
-
- dbg_parse("read %s", temp);
-
- /* eat the whitespace at the beginning of the line */
- while (isspace(*temp))
- ++temp;
-
- /* no more line? */
- if (*temp == 0x00)
- continue;
-
- /* see if this is a comment */
- if (*temp == COMMENT_CHARACTER)
- continue;
-
- memset(&dev, 0x00, sizeof(struct config_device));
-
- /* parse the line */
- temp2 = strsep(&temp, ",");
- if (strcasecmp(temp2, TYPE_LABEL) == 0) {
- /* label type */
- dev.type = LABEL;
-
- /* BUS="bus" */
- retval = get_value("BUS", &temp, &temp3);
- if (retval)
- continue;
- strcpy(dev.bus, temp3);
-
- /* file="value" */
- temp2 = strsep(&temp, ",");
- retval = get_pair(&temp, &temp2, &temp3);
- if (retval)
- continue;
- strcpy(dev.sysfs_file, temp2);
- strcpy(dev.sysfs_value, temp3);
-
- /* NAME="new_name" */
- temp2 = strsep(&temp, ",");
- retval = get_value("NAME", &temp, &temp3);
- if (retval)
- continue;
- strcpy(dev.name, temp3);
-
- dbg_parse("LABEL name = '%s', bus = '%s', "
- "sysfs_file = '%s', sysfs_value = '%s'",
- dev.name, dev.bus, dev.sysfs_file,
- dev.sysfs_value);
- }
-
- if (strcasecmp(temp2, TYPE_NUMBER) == 0) {
- /* number type */
- dev.type = NUMBER;
-
- /* BUS="bus" */
- retval = get_value("BUS", &temp, &temp3);
- if (retval)
- continue;
- strcpy(dev.bus, temp3);
-
- /* ID="id" */
- temp2 = strsep(&temp, ",");
- retval = get_value("id", &temp, &temp3);
- if (retval)
- continue;
- strcpy(dev.id, temp3);
-
- /* NAME="new_name" */
- temp2 = strsep(&temp, ",");
- retval = get_value("NAME", &temp, &temp3);
- if (retval)
- continue;
- strcpy(dev.name, temp3);
-
- dbg_parse("NUMBER name = '%s', bus = '%s', id = '%s'",
- dev.name, dev.bus, dev.id);
- }
-
- if (strcasecmp(temp2, TYPE_TOPOLOGY) == 0) {
- /* number type */
- dev.type = TOPOLOGY;
-
- /* BUS="bus" */
- retval = get_value("BUS", &temp, &temp3);
- if (retval)
- continue;
- strcpy(dev.bus, temp3);
-
- /* PLACE="place" */
- temp2 = strsep(&temp, ",");
- retval = get_value("place", &temp, &temp3);
- if (retval)
- continue;
- strcpy(dev.place, temp3);
-
- /* NAME="new_name" */
- temp2 = strsep(&temp, ",");
- retval = get_value("NAME", &temp, &temp3);
- if (retval)
- continue;
- strcpy(dev.name, temp3);
-
- dbg_parse("TOPOLOGY name = '%s', bus = '%s', place = '%s'",
- dev.name, dev.bus, dev.place);
- }
-
- if (strcasecmp(temp2, TYPE_REPLACE) == 0) {
- /* number type */
- dev.type = REPLACE;
-
- /* KERNEL="kernel_name" */
- retval = get_value("KERNEL", &temp, &temp3);
- if (retval)
- continue;
- strcpy(dev.kernel_name, temp3);
-
- /* NAME="new_name" */
- temp2 = strsep(&temp, ",");
- retval = get_value("NAME", &temp, &temp3);
- if (retval)
- continue;
- strcpy(dev.name, temp3);
- dbg_parse("REPLACE name = %s, kernel_name = %s",
- dev.name, dev.kernel_name);
- }
- if (strcasecmp(temp2, TYPE_CALLOUT) == 0) {
- /* number type */
- dev.type = CALLOUT;
-
- /* PROGRAM="executable" */
- retval = get_value("PROGRAM", &temp, &temp3);
- if (retval)
- continue;
- strcpy(dev.exec_program, temp3);
-
- /* BUS="bus" */
- temp2 = strsep(&temp, ",");
- retval = get_value("BUS", &temp, &temp3);
- if (retval)
- continue;
- strcpy(dev.bus, temp3);
-
- /* ID="id" */
- temp2 = strsep(&temp, ",");
- retval = get_value("ID", &temp, &temp3);
- if (retval)
- continue;
- strcpy(dev.id, temp3);
-
- /* NAME="new_name" */
- temp2 = strsep(&temp, ",");
- retval = get_value("NAME", &temp, &temp3);
- if (retval)
- continue;
- strcpy(dev.name, temp3);
- dbg_parse("CALLOUT name = %s, program = %s",
- dev.name, dev.exec_program);
- }
-
- retval = add_dev(&dev);
- if (retval) {
- dbg("add_dev returned with error %d", retval);
- goto exit;
- }
- }
-
-exit:
- fclose(fd);
- return retval;
-}
-
-
-static int namedev_init_permissions(void)
-{
- char line[255];
- char *temp;
- char *temp2;
- FILE *fd;
- int retval = 0;
- struct config_device dev;
-
- dbg("opening %s to read as permissions config", udev_config_permission_filename);
- fd = fopen(udev_config_permission_filename, "r");
- if (fd == NULL) {
- dbg("Can't open %s", udev_config_permission_filename);
- return -ENODEV;
- }
-
- /* loop through the whole file */
- while (1) {
- /* get a line */
- temp = fgets(line, sizeof(line), fd);
- if (temp == NULL)
+ pos = strchr(string, '%');
+
+ if (pos) {
+ strfieldcpy(name, pos+2);
+ *pos = 0x00;
+ switch (pos[1]) {
+ case 'b':
+ if (strlen(udev->bus_id) == 0)
+ break;
+ strcat(pos, udev->bus_id);
+ dbg("substitute bus_id '%s'", udev->bus_id);
+ break;
+ case 'n':
+ if (strlen(udev->kernel_number) == 0)
+ break;
+ strcat(pos, udev->kernel_number);
+ dbg("substitute kernel number '%s'", udev->kernel_number);
+ break;
+ case 'D':
+ if (strlen(udev->kernel_number) == 0) {
+ strcat(pos, "disk");
+ break;
+ }
+ strcat(pos, "part");
+ strcat(pos, udev->kernel_number);
+ dbg("substitute kernel number '%s'", udev->kernel_number);
+ break;
+ case 'm':
+ sprintf(pos, "%u", udev->minor);
+ dbg("substitute minor number '%u'", udev->minor);
+ break;
+ case 'M':
+ sprintf(pos, "%u", udev->major);
+ dbg("substitute major number '%u'", udev->major);
+ break;
+ case 'c':
+ if (strlen(udev->callout_value) == 0)
+ break;
+ strcat(pos, udev->callout_value);
+ dbg("substitute callout output '%s'", udev->callout_value);
+ break;
+ default:
+ dbg("unknown substitution type '%%%c'", pos[1]);
+ break;
+ }
+ strcat(string, name);
+ } else