X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udev%2Flib%2Flibudev-device.c;h=65ba6e30d83ef736389d413578e6877473a5e9bb;hb=aa8734ffcb8a895fc8d66ff383cbcf8f4b78f562;hp=acab263785a95fe4892989a765818e17b869936b;hpb=31f4b036ea97d87d3f094d6e5256976a25eac013;p=elogind.git diff --git a/udev/lib/libudev-device.c b/udev/lib/libudev-device.c index acab26378..65ba6e30d 100644 --- a/udev/lib/libudev-device.c +++ b/udev/lib/libudev-device.c @@ -75,7 +75,7 @@ static size_t devpath_to_db_path(struct udev *udev, const char *devpath, char *f return util_path_encode(&filename[start], len - start); } -static int device_read_db(struct udev_device *udev_device) +int udev_device_read_db(struct udev_device *udev_device) { struct stat stats; char filename[UTIL_PATH_SIZE]; @@ -220,7 +220,7 @@ static void device_load_info(struct udev_device *device) { device->info_loaded = 1; udev_device_read_uevent_file(device); - device_read_db(device); + udev_device_read_db(device); } void udev_device_set_info_loaded(struct udev_device *device) @@ -231,6 +231,7 @@ void udev_device_set_info_loaded(struct udev_device *device) struct udev_device *device_new(struct udev *udev) { struct udev_device *udev_device; + struct udev_list_entry *list_entry; if (udev == NULL) return NULL; @@ -245,6 +246,11 @@ struct udev_device *device_new(struct udev *udev) udev_list_init(&udev_device->properties_list); udev_list_init(&udev_device->attr_list); udev_device->event_timeout = -1; + /* copy global properties */ + udev_list_entry_foreach(list_entry, udev_get_properties_list_entry(udev)) + udev_device_add_property(udev_device, + udev_list_entry_get_name(list_entry), + udev_list_entry_get_value(list_entry)); info(udev_device->udev, "udev_device: %p created\n", udev_device); return udev_device; } @@ -969,6 +975,15 @@ int udev_device_add_devlink(struct udev_device *udev_device, const char *devlink struct udev_list_entry *udev_device_add_property(struct udev_device *udev_device, const char *key, const char *value) { udev_device->envp_uptodate = 0; + if (value == NULL) { + struct udev_list_entry *list_entry; + + list_entry = udev_device_get_properties_list_entry(udev_device); + list_entry = udev_list_entry_get_by_name(list_entry, key); + if (list_entry != NULL) + udev_list_entry_remove(list_entry); + return NULL; + } return udev_list_entry_add(udev_device->udev, &udev_device->properties_list, key, value, 1, 0); }