Commit 16574dcc authored by Kay Sievers's avatar Kay Sievers Committed by Greg Kroah-Hartman

Driver core: make uevent-environment available in uevent-file

This allows sysfs to show the environment variables that are available
if the uevent happens.  This lets userspace not have to cache all of
this information as the kernel already knows it.
Signed-off-by: default avatarKay Sievers <kay.sievers@vrfy.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 46288030
...@@ -246,6 +246,53 @@ static struct kset_uevent_ops device_uevent_ops = { ...@@ -246,6 +246,53 @@ static struct kset_uevent_ops device_uevent_ops = {
.uevent = dev_uevent, .uevent = dev_uevent,
}; };
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;
}
static ssize_t store_uevent(struct device *dev, struct device_attribute *attr, static ssize_t store_uevent(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
...@@ -621,10 +668,11 @@ int device_add(struct device *dev) ...@@ -621,10 +668,11 @@ int device_add(struct device *dev)
BUS_NOTIFY_ADD_DEVICE, dev); BUS_NOTIFY_ADD_DEVICE, dev);
dev->uevent_attr.attr.name = "uevent"; dev->uevent_attr.attr.name = "uevent";
dev->uevent_attr.attr.mode = S_IWUSR; dev->uevent_attr.attr.mode = S_IRUGO | S_IWUSR;
if (dev->driver) if (dev->driver)
dev->uevent_attr.attr.owner = dev->driver->owner; dev->uevent_attr.attr.owner = dev->driver->owner;
dev->uevent_attr.store = store_uevent; dev->uevent_attr.store = store_uevent;
dev->uevent_attr.show = show_uevent;
error = device_create_file(dev, &dev->uevent_attr); error = device_create_file(dev, &dev->uevent_attr);
if (error) if (error)
goto attrError; goto attrError;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment