X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=namedev.c;h=226c1d313f65ef989ee5c72f58c9615759e329a5;hp=1e600bbe6d2b997112325133dbc03c980c2d12d7;hb=f1db055ab2e349ce22254562faaece66d6a4a873;hpb=07562d6ecf64f708a3a20388200ec8bd9c5a3774 diff --git a/namedev.c b/namedev.c index 1e600bbe6..226c1d313 100644 --- a/namedev.c +++ b/namedev.c @@ -104,12 +104,11 @@ static int strcmp_pattern(const char *p, const char *s) int add_perm_dev(struct perm_device *new_dev) { - struct list_head *tmp; + struct perm_device *dev; struct perm_device *tmp_dev; /* update the values if we already have the device */ - list_for_each(tmp, &perm_device_list) { - struct perm_device *dev = list_entry(tmp, struct perm_device, node); + list_for_each_entry(dev, &perm_device_list, node) { if (strcmp_pattern(new_dev->name, dev->name)) continue; copy_var(dev, new_dev, mode); @@ -130,11 +129,9 @@ int add_perm_dev(struct perm_device *new_dev) static struct perm_device *find_perm(char *name) { - struct list_head *tmp; - struct perm_device *perm = NULL; + struct perm_device *perm; - list_for_each(tmp, &perm_device_list) { - perm = list_entry(tmp, struct perm_device, node); + list_for_each_entry(perm, &perm_device_list, node) { if (strcmp_pattern(perm->name, name)) continue; return perm; @@ -200,11 +197,12 @@ static void apply_format(struct udevice *udev, unsigned char *string) case 'D': if (strlen(udev->kernel_number) == 0) { strcat(pos, "disc"); + dbg("substitute devfs disc"); break; } strcat(pos, "part"); strcat(pos, udev->kernel_number); - dbg("substitute kernel number '%s'", udev->kernel_number); + dbg("substitute devfs part '%s'", udev->kernel_number); break; case 'm': sprintf(pos, "%u", udev->minor); @@ -229,8 +227,10 @@ static void apply_format(struct udevice *udev, unsigned char *string) break; } } - strcat(pos, pos3); - dbg("substitute partial callout output '%s'", pos3); + if (pos3) { + strcat(pos, pos3); + dbg("substitute partial callout output '%s'", pos3); + } } else { strcat(pos, udev->callout_value); dbg("substitute callout output '%s'", udev->callout_value); @@ -252,6 +252,8 @@ static struct bus_file { } bus_files[] = { { .bus = "scsi", .file = "vendor" }, { .bus = "usb", .file = "idVendor" }, + { .bus = "ide", .file = "detach_state" }, + { .bus = "pci", .file = "vendor" }, {} }; @@ -296,6 +298,27 @@ exit: 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_callout(struct config_device *dev, char *value, int len) { int retval; @@ -391,14 +414,15 @@ static int exec_callout(struct config_device *dev, char *value, int len) static int do_callout(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); + list_for_each_entry(dev, &config_device_list, node) { if (dev->type != CALLOUT) continue; - if (sysfs_device) { + 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; @@ -460,16 +484,17 @@ static int do_label(struct sysfs_class_device *class_dev, struct udevice *udev, { struct sysfs_pair *pair; struct config_device *dev; - struct list_head *tmp; int i; int match; - list_for_each(tmp, &config_device_list) { - dev = list_entry(tmp, struct config_device, node); + list_for_each_entry(dev, &config_device_list, node) { if (dev->type != LABEL) continue; - if (sysfs_device) { + 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; @@ -502,7 +527,6 @@ static int do_label(struct sysfs_class_device *class_dev, struct udevice *udev, static int do_number(struct sysfs_class_device *class_dev, struct udevice *udev, struct sysfs_device *sysfs_device) { struct config_device *dev; - struct list_head *tmp; char path[SYSFS_PATH_MAX]; int found; char *temp = NULL; @@ -511,8 +535,7 @@ static int do_number(struct sysfs_class_device *class_dev, struct udevice *udev, if (!sysfs_device) return -ENODEV; - list_for_each(tmp, &config_device_list) { - dev = list_entry(tmp, struct config_device, node); + list_for_each_entry(dev, &config_device_list, node) { if (dev->type != NUMBER) continue; @@ -547,7 +570,6 @@ static int do_number(struct sysfs_class_device *class_dev, struct udevice *udev, static int do_topology(struct sysfs_class_device *class_dev, struct udevice *udev, struct sysfs_device *sysfs_device) { struct config_device *dev; - struct list_head *tmp; char path[SYSFS_PATH_MAX]; int found; char *temp = NULL; @@ -556,8 +578,7 @@ static int do_topology(struct sysfs_class_device *class_dev, struct udevice *ude if (!sysfs_device) return -ENODEV; - list_for_each(tmp, &config_device_list) { - dev = list_entry(tmp, struct config_device, node); + list_for_each_entry(dev, &config_device_list, node) { if (dev->type != TOPOLOGY) continue; @@ -593,10 +614,8 @@ static int do_topology(struct sysfs_class_device *class_dev, struct udevice *ude static int do_replace(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); + list_for_each_entry(dev, &config_device_list, node) { if (dev->type != REPLACE) continue; @@ -644,9 +663,9 @@ static struct sysfs_device *get_sysfs_device(struct sysfs_class_device *class_de if (isdigit(class_dev->path[strlen(class_dev->path)-1])) { temp = strrchr(filename, '/'); if (temp) { + char *temp2 = strrchr(filename, '/'); partition = 1; *temp = 0x00; - char *temp2 = strrchr(filename, '/'); dbg("temp2 = %s", temp2); if (temp2 && (strcmp(temp2, "/block") == 0)) { /* oops, we have no parent block device, so go back to original directory */ @@ -736,6 +755,12 @@ int namedev_name_device(struct sysfs_class_device *class_dev, struct udevice *ud 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; + } + retval = do_callout(class_dev, udev, sysfs_device); if (retval == 0) goto found;