X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=namedev.c;h=08cceacda04d55c795fc9676c17dbc08692745de;hb=2794d2491714bc546bc209d6996f6ad97aa8a994;hp=cff338f1a719b635c06a33c765d2376f46869f4b;hpb=8ed89229bc8afed84ad6d587a6df29329bbbf440;p=elogind.git diff --git a/namedev.c b/namedev.c index cff338f1a..08cceacda 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; @@ -301,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; @@ -383,12 +401,10 @@ static int exec_callout(struct config_device *dev, char *value, int len) retval = -1; } -#ifndef __KLIBC__ if (!WIFEXITED(status) || (WEXITSTATUS(status) != 0)) { dbg("callout program status 0x%x", status); retval = -1; } -#endif } return retval; } @@ -396,10 +412,8 @@ 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; @@ -468,12 +482,10 @@ 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; @@ -513,7 +525,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; @@ -522,8 +533,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; @@ -558,7 +568,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; @@ -567,8 +576,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; @@ -604,10 +612,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; @@ -747,6 +753,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;