+static ssize_t show_uevent(struct device *dev, struct device_attribute *attr,
+ char *buf)
+{
+ struct kobject *top_kobj;
+ struct kset *kset;
+ char *envp[32];
+ char data[PAGE_SIZE];
+ char *pos;
+ int i;
+ size_t count = 0;
+ int retval;
+
+ /* search the kset, the device belongs to */
+ top_kobj = &dev->kobj;
+ if (!top_kobj->kset && top_kobj->parent) {
+ do {
+ top_kobj = top_kobj->parent;
+ } while (!top_kobj->kset && top_kobj->parent);
+ }
+ if (!top_kobj->kset)
+ goto out;
+ kset = top_kobj->kset;
+ if (!kset->uevent_ops || !kset->uevent_ops->uevent)
+ goto out;
+
+ /* respect filter */
+ if (kset->uevent_ops && kset->uevent_ops->filter)
+ if (!kset->uevent_ops->filter(kset, &dev->kobj))
+ goto out;
+
+ /* let the kset specific function add its keys */
+ pos = data;
+ retval = kset->uevent_ops->uevent(kset, &dev->kobj,
+ envp, ARRAY_SIZE(envp),
+ pos, PAGE_SIZE);
+ if (retval)
+ goto out;
+
+ /* copy keys to file */
+ for (i = 0; envp[i]; i++) {
+ pos = &buf[count];
+ count += sprintf(pos, "%s\n", envp[i]);
+ }
+out:
+ return count;
+}
+