chiark / gitweb /
udev_list_cleanup() -> udev_list_cleanup_entries()
[elogind.git] / udev / lib / libudev-device.c
index acab263785a95fe4892989a765818e17b869936b..c030eb058578851682fdbf4356e7db534d5ed167 100644 (file)
@@ -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;
 }
@@ -598,13 +604,13 @@ void udev_device_unref(struct udev_device *udev_device)
        free(udev_device->sysname);
        free(udev_device->devnode);
        free(udev_device->subsystem);
-       udev_list_cleanup(udev_device->udev, &udev_device->devlinks_list);
-       udev_list_cleanup(udev_device->udev, &udev_device->properties_list);
+       udev_list_cleanup_entries(udev_device->udev, &udev_device->devlinks_list);
+       udev_list_cleanup_entries(udev_device->udev, &udev_device->properties_list);
        free(udev_device->action);
        free(udev_device->driver);
        free(udev_device->devpath_old);
        free(udev_device->physdevpath);
-       udev_list_cleanup(udev_device->udev, &udev_device->attr_list);
+       udev_list_cleanup_entries(udev_device->udev, &udev_device->attr_list);
        for (i = 0; i < ARRAY_SIZE(udev_device->envp) && udev_device->envp[i] != NULL; i++)
                free(udev_device->envp[i]);
        info(udev_device->udev, "udev_device: %p released\n", udev_device);
@@ -741,7 +747,7 @@ struct udev_list_entry *udev_device_get_devlinks_list_entry(struct udev_device *
 void udev_device_cleanup_devlinks_list(struct udev_device *udev_device)
 {
        udev_device->devlinks_uptodate = 0;
-       udev_list_cleanup(udev_device->udev, &udev_device->devlinks_list);
+       udev_list_cleanup_entries(udev_device->udev, &udev_device->devlinks_list);
 }
 
 /**
@@ -930,8 +936,13 @@ int udev_device_set_syspath(struct udev_device *udev_device, const char *syspath
        }
 
        /* trailing number */
-       while (isdigit(udev_device->sysname[--len]))
+       while (len > 0 && isdigit(udev_device->sysname[--len]))
                udev_device->sysnum = &udev_device->sysname[len];
+
+       /* sysname is completely numeric */
+       if (len == 0)
+               udev_device->sysnum = NULL;
+
        return 0;
 }
 
@@ -969,6 +980,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);
 }