chiark / gitweb /
export USEC_INITIALIZED= and take timestamp on message receive time
[elogind.git] / libudev / libudev-device.c
index dd0224ae4b43e025d3aca6da3409f6fbd9eef555..064ffad9bf3c2efadfa19c3bbdbce45a504dec79 100644 (file)
@@ -51,25 +51,24 @@ struct udev_device {
        char *sysname;
        const char *sysnum;
        char *devnode;
+       mode_t devnode_mode;
        char *subsystem;
        char *devtype;
        char *driver;
        char *action;
        char *devpath_old;
-       char *sysname_old;
        char *knodename;
        char *id_filename;
        char **envp;
        char *monitor_buf;
        size_t monitor_buf_len;
-       struct udev_list_node devlinks_list;
-       struct udev_list_node properties_list;
-       struct udev_list_node sysattr_value_list;
-       struct udev_list_node sysattr_list;
-       struct udev_list_node tags_list;
+       struct udev_list devlinks_list;
+       struct udev_list properties_list;
+       struct udev_list sysattr_value_list;
+       struct udev_list sysattr_list;
+       struct udev_list tags_list;
        unsigned long long int seqnum;
        unsigned long long int usec_initialized;
-       int event_timeout;
        int timeout;
        int devlink_priority;
        int refcount;
@@ -89,8 +88,263 @@ struct udev_device {
        bool uevent_loaded;
        bool is_initialized;
        bool sysattr_list_read;
+       bool db_persist;
 };
 
+/**
+ * udev_device_get_devnum:
+ * @udev_device: udev device
+ *
+ * This is only valid if the device was received through a monitor. Devices read from
+ * sys do not have a sequence number.
+ *
+ * Returns: the kernel event sequence number, or 0 if there is no sequence number available.
+ **/
+UDEV_EXPORT unsigned long long int udev_device_get_seqnum(struct udev_device *udev_device)
+{
+       if (udev_device == NULL)
+               return 0;
+       return udev_device->seqnum;
+}
+
+static int udev_device_set_seqnum(struct udev_device *udev_device, unsigned long long int seqnum)
+{
+       char num[32];
+
+       udev_device->seqnum = seqnum;
+       snprintf(num, sizeof(num), "%llu", seqnum);
+       udev_device_add_property(udev_device, "SEQNUM", num);
+       return 0;
+}
+
+int udev_device_get_ifindex(struct udev_device *udev_device)
+{
+       if (!udev_device->info_loaded)
+               udev_device_read_uevent_file(udev_device);
+       return udev_device->ifindex;
+}
+
+static int udev_device_set_ifindex(struct udev_device *udev_device, int ifindex)
+{
+       char num[32];
+
+       udev_device->ifindex = ifindex;
+       snprintf(num, sizeof(num), "%u", ifindex);
+       udev_device_add_property(udev_device, "IFINDEX", num);
+       return 0;
+}
+
+/**
+ * udev_device_get_devnum:
+ * @udev_device: udev device
+ *
+ * Returns: the device major/minor number.
+ **/
+UDEV_EXPORT dev_t udev_device_get_devnum(struct udev_device *udev_device)
+{
+       if (udev_device == NULL)
+               return makedev(0, 0);
+       if (!udev_device->info_loaded)
+               udev_device_read_uevent_file(udev_device);
+       return udev_device->devnum;
+}
+
+static int udev_device_set_devnum(struct udev_device *udev_device, dev_t devnum)
+{
+       char num[32];
+
+       udev_device->devnum = devnum;
+
+       snprintf(num, sizeof(num), "%u", major(devnum));
+       udev_device_add_property(udev_device, "MAJOR", num);
+       snprintf(num, sizeof(num), "%u", minor(devnum));
+       udev_device_add_property(udev_device, "MINOR", num);
+       return 0;
+}
+
+int udev_device_get_timeout(struct udev_device *udev_device)
+{
+       return udev_device->timeout;
+}
+
+static int udev_device_set_timeout(struct udev_device *udev_device, int timeout)
+{
+       char num[32];
+
+       udev_device->timeout = timeout;
+       snprintf(num, sizeof(num), "%u", timeout);
+       udev_device_add_property(udev_device, "TIMEOUT", num);
+       return 0;
+}
+
+const char *udev_device_get_knodename(struct udev_device *udev_device)
+{
+       return udev_device->knodename;
+}
+
+static int udev_device_set_knodename(struct udev_device *udev_device, const char *knodename)
+{
+       free(udev_device->knodename);
+       udev_device->knodename = strdup(knodename);
+       if (udev_device->knodename == NULL)
+               return -ENOMEM;
+       /* do not overwrite the udev property with the kernel property */
+       if (udev_device->devnode == NULL)
+               udev_device_add_property(udev_device, "DEVNAME", udev_device->knodename);
+       return 0;
+}
+
+const char *udev_device_get_devpath_old(struct udev_device *udev_device)
+{
+       return udev_device->devpath_old;
+}
+
+static int udev_device_set_devpath_old(struct udev_device *udev_device, const char *devpath_old)
+{
+       const char *pos;
+
+       free(udev_device->devpath_old);
+       udev_device->devpath_old = strdup(devpath_old);
+       if (udev_device->devpath_old == NULL)
+               return -ENOMEM;
+       udev_device_add_property(udev_device, "DEVPATH_OLD", udev_device->devpath_old);
+
+       pos = strrchr(udev_device->devpath_old, '/');
+       if (pos == NULL)
+               return -EINVAL;
+       return 0;
+}
+
+/**
+ * udev_device_get_driver:
+ * @udev_device: udev device
+ *
+ * Returns: the driver string, or #NULL if there is no driver attached.
+ **/
+UDEV_EXPORT const char *udev_device_get_driver(struct udev_device *udev_device)
+{
+       char driver[UTIL_NAME_SIZE];
+
+       if (udev_device == NULL)
+               return NULL;
+       if (!udev_device->driver_set) {
+               udev_device->driver_set = true;
+               if (util_get_sys_core_link_value(udev_device->udev, "driver", udev_device->syspath, driver, sizeof(driver)) > 0)
+                       udev_device->driver = strdup(driver);
+       }
+       return udev_device->driver;
+}
+
+static int udev_device_set_driver(struct udev_device *udev_device, const char *driver)
+{
+       free(udev_device->driver);
+       udev_device->driver = strdup(driver);
+       if (udev_device->driver == NULL)
+               return -ENOMEM;
+       udev_device->driver_set = true;
+       udev_device_add_property(udev_device, "DRIVER", udev_device->driver);
+       return 0;
+}
+
+/**
+ * udev_device_get_devtype:
+ * @udev_device: udev device
+ *
+ * Retrieve the devtype string of the udev device.
+ *
+ * Returns: the devtype name of the udev device, or #NULL if it can not be determined
+ **/
+UDEV_EXPORT const char *udev_device_get_devtype(struct udev_device *udev_device)
+{
+       if (udev_device == NULL)
+               return NULL;
+       if (!udev_device->devtype_set) {
+               udev_device->devtype_set = true;
+               udev_device_read_uevent_file(udev_device);
+       }
+       return udev_device->devtype;
+}
+
+static int udev_device_set_devtype(struct udev_device *udev_device, const char *devtype)
+{
+       free(udev_device->devtype);
+       udev_device->devtype = strdup(devtype);
+       if (udev_device->devtype == NULL)
+               return -ENOMEM;
+       udev_device->devtype_set = true;
+       udev_device_add_property(udev_device, "DEVTYPE", udev_device->devtype);
+       return 0;
+}
+
+static int udev_device_set_subsystem(struct udev_device *udev_device, const char *subsystem)
+{
+       free(udev_device->subsystem);
+       udev_device->subsystem = strdup(subsystem);
+       if (udev_device->subsystem == NULL)
+               return -ENOMEM;
+       udev_device->subsystem_set = true;
+       udev_device_add_property(udev_device, "SUBSYSTEM", udev_device->subsystem);
+       return 0;
+}
+
+/**
+ * udev_device_get_subsystem:
+ * @udev_device: udev device
+ *
+ * Retrieve the subsystem string of the udev device. The string does not
+ * contain any "/".
+ *
+ * Returns: the subsystem name of the udev device, or #NULL if it can not be determined
+ **/
+UDEV_EXPORT const char *udev_device_get_subsystem(struct udev_device *udev_device)
+{
+       char subsystem[UTIL_NAME_SIZE];
+
+       if (udev_device == NULL)
+               return NULL;
+       if (!udev_device->subsystem_set) {
+               udev_device->subsystem_set = true;
+               /* read "subsystem" link */
+               if (util_get_sys_core_link_value(udev_device->udev, "subsystem", udev_device->syspath, subsystem, sizeof(subsystem)) > 0) {
+                       udev_device_set_subsystem(udev_device, subsystem);
+                       return udev_device->subsystem;
+               }
+               /* implicit names */
+               if (strncmp(udev_device->devpath, "/module/", 8) == 0) {
+                       udev_device_set_subsystem(udev_device, "module");
+                       return udev_device->subsystem;
+               }
+               if (strstr(udev_device->devpath, "/drivers/") != NULL) {
+                       udev_device_set_subsystem(udev_device, "drivers");
+                       return udev_device->subsystem;
+               }
+               if (strncmp(udev_device->devpath, "/subsystem/", 11) == 0 ||
+                   strncmp(udev_device->devpath, "/class/", 7) == 0 ||
+                   strncmp(udev_device->devpath, "/bus/", 5) == 0) {
+                       udev_device_set_subsystem(udev_device, "subsystem");
+                       return udev_device->subsystem;
+               }
+       }
+       return udev_device->subsystem;
+}
+
+mode_t udev_device_get_devnode_mode(struct udev_device *udev_device)
+{
+       if (!udev_device->info_loaded)
+               udev_device_read_uevent_file(udev_device);
+       return udev_device->devnode_mode;
+}
+
+static int udev_device_set_devnode_mode(struct udev_device *udev_device, mode_t mode)
+{
+       char num[32];
+
+       udev_device->devnode_mode = mode;
+       snprintf(num, sizeof(num), "%#o", mode);
+       udev_device_add_property(udev_device, "DEVMODE", num);
+       return 0;
+}
+
 struct udev_list_entry *udev_device_add_property(struct udev_device *udev_device, const char *key, const char *value)
 {
        udev_device->envp_uptodate = false;
@@ -103,7 +357,7 @@ struct udev_list_entry *udev_device_add_property(struct udev_device *udev_device
                        udev_list_entry_delete(list_entry);
                return NULL;
        }
-       return udev_list_entry_add(udev_device->udev, &udev_device->properties_list, key, value, 1, 0);
+       return udev_list_entry_add(&udev_device->properties_list, key, value);
 }
 
 static struct udev_list_entry *udev_device_add_property_from_string(struct udev_device *udev_device, const char *property)
@@ -183,6 +437,8 @@ void udev_device_add_property_from_string_parse(struct udev_device *udev_device,
                                udev_device_add_tag(udev_device, tag);
                        }
                }
+       } else if (strncmp(property, "USEC_INITIALIZED=", 19) == 0) {
+               udev_device_set_usec_initialized(udev_device, strtoull(&property[19], NULL, 10));
        } else if (strncmp(property, "DRIVER=", 7) == 0) {
                udev_device_set_driver(udev_device, &property[7]);
        } else if (strncmp(property, "ACTION=", 7) == 0) {
@@ -199,6 +455,8 @@ void udev_device_add_property_from_string_parse(struct udev_device *udev_device,
                udev_device_set_timeout(udev_device, strtoull(&property[8], NULL, 10));
        } else if (strncmp(property, "IFINDEX=", 8) == 0) {
                udev_device_set_ifindex(udev_device, strtoull(&property[8], NULL, 10));
+       } else if (strncmp(property, "DEVMODE=", 8) == 0) {
+               udev_device_set_devnode_mode(udev_device, strtoul(&property[8], NULL, 8));
        } else {
                udev_device_add_property_from_string(udev_device, property);
        }
@@ -223,7 +481,7 @@ int udev_device_add_property_from_string_parse_finish(struct udev_device *udev_d
  *
  * Returns: the value of a device property, or #NULL if there is no such property.
  **/
-const char *udev_device_get_property_value(struct udev_device *udev_device, const char *key)
+UDEV_EXPORT const char *udev_device_get_property_value(struct udev_device *udev_device, const char *key)
 {
        struct udev_list_entry *list_entry;
 
@@ -233,7 +491,7 @@ const char *udev_device_get_property_value(struct udev_device *udev_device, cons
                return NULL;
 
        list_entry = udev_device_get_properties_list_entry(udev_device);
-       list_entry =  udev_list_entry_get_by_name(list_entry, key);
+       list_entry = udev_list_entry_get_by_name(list_entry, key);
        return udev_list_entry_get_value(list_entry);
 }
 
@@ -254,7 +512,7 @@ int udev_device_read_db(struct udev_device *udev_device, const char *dbfile)
                id = udev_device_get_id_filename(udev_device);
                if (id == NULL)
                        return -1;
-               util_strscpyl(filename, sizeof(filename), udev_get_dev_path(udev_device->udev), "/.run/udev/db3/", id, NULL);
+               util_strscpyl(filename, sizeof(filename), udev_get_run_path(udev_device->udev), "/data/", id, NULL);
                dbfile = filename;
        }
 
@@ -289,7 +547,7 @@ int udev_device_read_db(struct udev_device *udev_device, const char *dbfile)
                        break;
                case 'E':
                        entry = udev_device_add_property_from_string(udev_device, val);
-                       udev_list_entry_set_flags(entry, 1);
+                       udev_list_entry_set_num(entry, true);
                        break;
                case 'G':
                        udev_device_add_tag(udev_device, val);
@@ -343,6 +601,8 @@ int udev_device_read_uevent_file(struct udev_device *udev_device)
                        udev_device_set_ifindex(udev_device, strtoull(&line[8], NULL, 10));
                else if (strncmp(line, "DEVNAME=", 8) == 0)
                        udev_device_set_knodename(udev_device, &line[8]);
+               else if (strncmp(line, "DEVMODE=", 8) == 0)
+                       udev_device->devnode_mode = strtoul(&line[8], NULL, 8);
 
                udev_device_add_property_from_string(udev_device, line);
        }
@@ -370,12 +630,12 @@ struct udev_device *udev_device_new(struct udev *udev)
                return NULL;
        udev_device->refcount = 1;
        udev_device->udev = udev;
-       udev_list_init(&udev_device->devlinks_list);
-       udev_list_init(&udev_device->properties_list);
-       udev_list_init(&udev_device->sysattr_value_list);
-       udev_list_init(&udev_device->sysattr_list);
-       udev_list_init(&udev_device->tags_list);
-       udev_device->event_timeout = -1;
+       udev_list_init(udev, &udev_device->devlinks_list, true);
+       udev_list_init(udev, &udev_device->properties_list, true);
+       udev_list_init(udev, &udev_device->sysattr_value_list, true);
+       udev_list_init(udev, &udev_device->sysattr_list, false);
+       udev_list_init(udev, &udev_device->tags_list, true);
+       udev_device->timeout = -1;
        udev_device->watch_handle = -1;
        /* copy global properties */
        udev_list_entry_foreach(list_entry, udev_get_properties_list_entry(udev))
@@ -400,7 +660,7 @@ struct udev_device *udev_device_new(struct udev *udev)
  *
  * Returns: a new udev device, or #NULL, if it does not exist
  **/
-struct udev_device *udev_device_new_from_syspath(struct udev *udev, const char *syspath)
+UDEV_EXPORT struct udev_device *udev_device_new_from_syspath(struct udev *udev, const char *syspath)
 {
        size_t len;
        const char *subdir;
@@ -476,7 +736,7 @@ struct udev_device *udev_device_new_from_syspath(struct udev *udev, const char *
  *
  * Returns: a new udev device, or #NULL, if it does not exist
  **/
-struct udev_device *udev_device_new_from_devnum(struct udev *udev, char type, dev_t devnum)
+UDEV_EXPORT struct udev_device *udev_device_new_from_devnum(struct udev *udev, char type, dev_t devnum)
 {
        char path[UTIL_PATH_SIZE];
        const char *type_str;
@@ -564,7 +824,7 @@ struct udev_device *udev_device_new_from_id_filename(struct udev *udev, char *id
  *
  * Returns: a new udev device, or #NULL, if it does not exist
  **/
-struct udev_device *udev_device_new_from_subsystem_sysname(struct udev *udev, const char *subsystem, const char *sysname)
+UDEV_EXPORT struct udev_device *udev_device_new_from_subsystem_sysname(struct udev *udev, const char *subsystem, const char *sysname)
 {
        char path_full[UTIL_PATH_SIZE];
        char *path;
@@ -648,7 +908,7 @@ found:
  *
  * Returns: a new udev device, or #NULL, if it does not exist
  **/
-struct udev_device *udev_device_new_from_environment(struct udev *udev)
+UDEV_EXPORT struct udev_device *udev_device_new_from_environment(struct udev *udev)
 {
        int i;
        struct udev_device *udev_device;
@@ -711,7 +971,7 @@ static struct udev_device *device_new_from_parent(struct udev_device *udev_devic
  *
  * Returns: a new udev device, or #NULL, if it no parent exist.
  **/
-struct udev_device *udev_device_get_parent(struct udev_device *udev_device)
+UDEV_EXPORT struct udev_device *udev_device_get_parent(struct udev_device *udev_device)
 {
        if (udev_device == NULL)
                return NULL;
@@ -746,7 +1006,7 @@ struct udev_device *udev_device_get_parent(struct udev_device *udev_device)
  *
  * Returns: a new udev device, or #NULL if no matching parent exists.
  **/
-struct udev_device *udev_device_get_parent_with_subsystem_devtype(struct udev_device *udev_device, const char *subsystem, const char *devtype)
+UDEV_EXPORT struct udev_device *udev_device_get_parent_with_subsystem_devtype(struct udev_device *udev_device, const char *subsystem, const char *devtype)
 {
        struct udev_device *parent;
 
@@ -779,7 +1039,7 @@ struct udev_device *udev_device_get_parent_with_subsystem_devtype(struct udev_de
  *
  * Returns: the udev library context
  **/
-struct udev *udev_device_get_udev(struct udev_device *udev_device)
+UDEV_EXPORT struct udev *udev_device_get_udev(struct udev_device *udev_device)
 {
        if (udev_device == NULL)
                return NULL;
@@ -794,7 +1054,7 @@ struct udev *udev_device_get_udev(struct udev_device *udev_device)
  *
  * Returns: the passed udev device
  **/
-struct udev_device *udev_device_ref(struct udev_device *udev_device)
+UDEV_EXPORT struct udev_device *udev_device_ref(struct udev_device *udev_device)
 {
        if (udev_device == NULL)
                return NULL;
@@ -810,7 +1070,7 @@ struct udev_device *udev_device_ref(struct udev_device *udev_device)
  * the resources of the device will be released.
  *
  **/
-void udev_device_unref(struct udev_device *udev_device)
+UDEV_EXPORT void udev_device_unref(struct udev_device *udev_device)
 {
        if (udev_device == NULL)
                return;
@@ -824,15 +1084,14 @@ void udev_device_unref(struct udev_device *udev_device)
        free(udev_device->devnode);
        free(udev_device->subsystem);
        free(udev_device->devtype);
-       udev_list_cleanup_entries(udev_device->udev, &udev_device->devlinks_list);
-       udev_list_cleanup_entries(udev_device->udev, &udev_device->properties_list);
-       udev_list_cleanup_entries(udev_device->udev, &udev_device->sysattr_value_list);
-       udev_list_cleanup_entries(udev_device->udev, &udev_device->sysattr_list);
-       udev_list_cleanup_entries(udev_device->udev, &udev_device->tags_list);
+       udev_list_cleanup(&udev_device->devlinks_list);
+       udev_list_cleanup(&udev_device->properties_list);
+       udev_list_cleanup(&udev_device->sysattr_value_list);
+       udev_list_cleanup(&udev_device->sysattr_list);
+       udev_list_cleanup(&udev_device->tags_list);
        free(udev_device->action);
        free(udev_device->driver);
        free(udev_device->devpath_old);
-       free(udev_device->sysname_old);
        free(udev_device->knodename);
        free(udev_device->id_filename);
        free(udev_device->envp);
@@ -850,7 +1109,7 @@ void udev_device_unref(struct udev_device *udev_device)
  *
  * Returns: the devpath of the udev device
  **/
-const char *udev_device_get_devpath(struct udev_device *udev_device)
+UDEV_EXPORT const char *udev_device_get_devpath(struct udev_device *udev_device)
 {
        if (udev_device == NULL)
                return NULL;
@@ -866,7 +1125,7 @@ const char *udev_device_get_devpath(struct udev_device *udev_device)
  *
  * Returns: the sys path of the udev device
  **/
-const char *udev_device_get_syspath(struct udev_device *udev_device)
+UDEV_EXPORT const char *udev_device_get_syspath(struct udev_device *udev_device)
 {
        if (udev_device == NULL)
                return NULL;
@@ -879,7 +1138,7 @@ const char *udev_device_get_syspath(struct udev_device *udev_device)
  *
  * Returns: the sys name of the device device
  **/
-const char *udev_device_get_sysname(struct udev_device *udev_device)
+UDEV_EXPORT const char *udev_device_get_sysname(struct udev_device *udev_device)
 {
        if (udev_device == NULL)
                return NULL;
@@ -892,7 +1151,7 @@ const char *udev_device_get_sysname(struct udev_device *udev_device)
  *
  * Returns: the trailing number of of the device name
  **/
-const char *udev_device_get_sysnum(struct udev_device *udev_device)
+UDEV_EXPORT const char *udev_device_get_sysnum(struct udev_device *udev_device)
 {
        if (udev_device == NULL)
                return NULL;
@@ -908,7 +1167,7 @@ const char *udev_device_get_sysnum(struct udev_device *udev_device)
  *
  * Returns: the device node file name of the udev device, or #NULL if no device node exists
  **/
-const char *udev_device_get_devnode(struct udev_device *udev_device)
+UDEV_EXPORT const char *udev_device_get_devnode(struct udev_device *udev_device)
 {
        if (udev_device == NULL)
                return NULL;
@@ -930,66 +1189,6 @@ const char *udev_device_get_devnode(struct udev_device *udev_device)
        return udev_device->devnode;
 }
 
-/**
- * udev_device_get_subsystem:
- * @udev_device: udev device
- *
- * Retrieve the subsystem string of the udev device. The string does not
- * contain any "/".
- *
- * Returns: the subsystem name of the udev device, or #NULL if it can not be determined
- **/
-const char *udev_device_get_subsystem(struct udev_device *udev_device)
-{
-       char subsystem[UTIL_NAME_SIZE];
-
-       if (udev_device == NULL)
-               return NULL;
-       if (!udev_device->subsystem_set) {
-               udev_device->subsystem_set = true;
-               /* read "subsystem" link */
-               if (util_get_sys_subsystem(udev_device->udev, udev_device->syspath, subsystem, sizeof(subsystem)) > 0) {
-                       udev_device_set_subsystem(udev_device, subsystem);
-                       return udev_device->subsystem;
-               }
-               /* implicit names */
-               if (strncmp(udev_device->devpath, "/module/", 8) == 0) {
-                       udev_device_set_subsystem(udev_device, "module");
-                       return udev_device->subsystem;
-               }
-               if (strstr(udev_device->devpath, "/drivers/") != NULL) {
-                       udev_device_set_subsystem(udev_device, "drivers");
-                       return udev_device->subsystem;
-               }
-               if (strncmp(udev_device->devpath, "/subsystem/", 11) == 0 ||
-                   strncmp(udev_device->devpath, "/class/", 7) == 0 ||
-                   strncmp(udev_device->devpath, "/bus/", 5) == 0) {
-                       udev_device_set_subsystem(udev_device, "subsystem");
-                       return udev_device->subsystem;
-               }
-       }
-       return udev_device->subsystem;
-}
-
-/**
- * udev_device_get_devtype:
- * @udev_device: udev device
- *
- * Retrieve the devtype string of the udev device.
- *
- * Returns: the devtype name of the udev device, or #NULL if it can not be determined
- **/
-const char *udev_device_get_devtype(struct udev_device *udev_device)
-{
-       if (udev_device == NULL)
-               return NULL;
-       if (!udev_device->devtype_set) {
-               udev_device->devtype_set = true;
-               udev_device_read_uevent_file(udev_device);
-       }
-       return udev_device->devtype;
-}
-
 /**
  * udev_device_get_devlinks_list_entry:
  * @udev_device: udev device
@@ -1003,7 +1202,7 @@ const char *udev_device_get_devtype(struct udev_device *udev_device)
  *
  * Returns: the first entry of the device node link list
  **/
-struct udev_list_entry *udev_device_get_devlinks_list_entry(struct udev_device *udev_device)
+UDEV_EXPORT struct udev_list_entry *udev_device_get_devlinks_list_entry(struct udev_device *udev_device)
 {
        if (udev_device == NULL)
                return NULL;
@@ -1015,7 +1214,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 = false;
-       udev_list_cleanup_entries(udev_device->udev, &udev_device->devlinks_list);
+       udev_list_cleanup(&udev_device->devlinks_list);
 }
 
 /**
@@ -1030,7 +1229,7 @@ void udev_device_cleanup_devlinks_list(struct udev_device *udev_device)
  *
  * Returns: the first entry of the property list
  **/
-struct udev_list_entry *udev_device_get_properties_list_entry(struct udev_device *udev_device)
+UDEV_EXPORT struct udev_list_entry *udev_device_get_properties_list_entry(struct udev_device *udev_device)
 {
        if (udev_device == NULL)
                return NULL;
@@ -1073,41 +1272,6 @@ struct udev_list_entry *udev_device_get_properties_list_entry(struct udev_device
        return udev_list_get_entry(&udev_device->properties_list);
 }
 
-/**
- * udev_device_get_driver:
- * @udev_device: udev device
- *
- * Returns: the driver string, or #NULL if there is no driver attached.
- **/
-const char *udev_device_get_driver(struct udev_device *udev_device)
-{
-       char driver[UTIL_NAME_SIZE];
-
-       if (udev_device == NULL)
-               return NULL;
-       if (!udev_device->driver_set) {
-               udev_device->driver_set = true;
-               if (util_get_sys_driver(udev_device->udev, udev_device->syspath, driver, sizeof(driver)) > 0)
-                       udev_device->driver = strdup(driver);
-       }
-       return udev_device->driver;
-}
-
-/**
- * udev_device_get_devnum:
- * @udev_device: udev device
- *
- * Returns: the device major/minor number.
- **/
-dev_t udev_device_get_devnum(struct udev_device *udev_device)
-{
-       if (udev_device == NULL)
-               return makedev(0, 0);
-       if (!udev_device->info_loaded)
-               udev_device_read_uevent_file(udev_device);
-       return udev_device->devnum;
-}
-
 /**
  * udev_device_get_action:
  * @udev_device: udev device
@@ -1118,29 +1282,13 @@ dev_t udev_device_get_devnum(struct udev_device *udev_device)
  *
  * Returns: the kernel action value, or #NULL if there is no action value available.
  **/
-const char *udev_device_get_action(struct udev_device *udev_device)
+UDEV_EXPORT const char *udev_device_get_action(struct udev_device *udev_device)
 {
        if (udev_device == NULL)
                return NULL;
        return udev_device->action;
 }
 
-/**
- * udev_device_get_devnum:
- * @udev_device: udev device
- *
- * This is only valid if the device was received through a monitor. Devices read from
- * sys do not have a sequence number.
- *
- * Returns: the kernel event sequence number, or 0 if there is no sequence number available.
- **/
-unsigned long long int udev_device_get_seqnum(struct udev_device *udev_device)
-{
-       if (udev_device == NULL)
-               return 0;
-       return udev_device->seqnum;
-}
-
 /**
  * udev_device_get_usec_since_initialized:
  * @udev_device: udev device
@@ -1153,7 +1301,7 @@ unsigned long long int udev_device_get_seqnum(struct udev_device *udev_device)
  *
  * Returns: the number of microseconds since the device was first seen.
  **/
-unsigned long long int udev_device_get_usec_since_initialized(struct udev_device *udev_device)
+UDEV_EXPORT unsigned long long int udev_device_get_usec_since_initialized(struct udev_device *udev_device)
 {
        unsigned long long now;
 
@@ -1163,7 +1311,7 @@ unsigned long long int udev_device_get_usec_since_initialized(struct udev_device
                udev_device_read_db(udev_device, NULL);
        if (udev_device->usec_initialized == 0)
                return 0;
-       now = usec_monotonic();
+       now = now_usec();
        if (now == 0)
                return 0;
        return now - udev_device->usec_initialized;
@@ -1176,7 +1324,11 @@ unsigned long long udev_device_get_usec_initialized(struct udev_device *udev_dev
 
 void udev_device_set_usec_initialized(struct udev_device *udev_device, unsigned long long usec_initialized)
 {
+       char num[32];
+
        udev_device->usec_initialized = usec_initialized;
+       snprintf(num, sizeof(num), "%llu", usec_initialized);
+       udev_device_add_property(udev_device, "USEC_INITIALIZED", num);
 }
 
 /**
@@ -1189,7 +1341,7 @@ void udev_device_set_usec_initialized(struct udev_device *udev_device, unsigned
  *
  * Returns: the content of a sys attribute file, or #NULL if there is no sys attribute value.
  **/
-const char *udev_device_get_sysattr_value(struct udev_device *udev_device, const char *sysattr)
+UDEV_EXPORT const char *udev_device_get_sysattr_value(struct udev_device *udev_device, const char *sysattr)
 {
        struct udev_list_entry *list_entry;
        char path[UTIL_PATH_SIZE];
@@ -1205,18 +1357,18 @@ const char *udev_device_get_sysattr_value(struct udev_device *udev_device, const
                return NULL;
 
        /* look for possibly already cached result */
-       udev_list_entry_foreach(list_entry, udev_list_get_entry(&udev_device->sysattr_value_list)) {
-               if (strcmp(udev_list_entry_get_name(list_entry), sysattr) == 0) {
-                       dbg(udev_device->udev, "got '%s' (%s) from cache\n",
-                           sysattr, udev_list_entry_get_value(list_entry));
-                       return udev_list_entry_get_value(list_entry);
-               }
+       list_entry = udev_list_get_entry(&udev_device->sysattr_value_list);
+       list_entry = udev_list_entry_get_by_name(list_entry, sysattr);
+       if (list_entry != NULL) {
+               dbg(udev_device->udev, "got '%s' (%s) from cache\n",
+                   sysattr, udev_list_entry_get_value(list_entry));
+               return udev_list_entry_get_value(list_entry);
        }
 
        util_strscpyl(path, sizeof(path), udev_device_get_syspath(udev_device), "/", sysattr, NULL);
        if (lstat(path, &statbuf) != 0) {
                dbg(udev_device->udev, "no attribute '%s', keep negative entry\n", path);
-               udev_list_entry_add(udev_device->udev, &udev_device->sysattr_value_list, sysattr, NULL, 0, 0);
+               udev_list_entry_add(&udev_device->sysattr_value_list, sysattr, NULL);
                goto out;
        }
 
@@ -1240,7 +1392,7 @@ const char *udev_device_get_sysattr_value(struct udev_device *udev_device, const
                if (pos != NULL) {
                        pos = &pos[1];
                        dbg(udev_device->udev, "cache '%s' with link value '%s'\n", sysattr, pos);
-                       list_entry = udev_list_entry_add(udev_device->udev, &udev_device->sysattr_value_list, sysattr, pos, 0, 0);
+                       list_entry = udev_list_entry_add(&udev_device->sysattr_value_list, sysattr, pos);
                        val = udev_list_entry_get_value(list_entry);
                }
 
@@ -1272,7 +1424,7 @@ const char *udev_device_get_sysattr_value(struct udev_device *udev_device, const
        value[size] = '\0';
        util_remove_trailing_chars(value, '\n');
        dbg(udev_device->udev, "'%s' has attribute value '%s'\n", path, value);
-       list_entry = udev_list_entry_add(udev_device->udev, &udev_device->sysattr_value_list, sysattr, value, 0, 0);
+       list_entry = udev_list_entry_add(&udev_device->sysattr_value_list, sysattr, value);
        val = udev_list_entry_get_value(list_entry);
 out:
        return val;
@@ -1310,8 +1462,7 @@ static int udev_device_sysattr_list_read(struct udev_device *udev_device)
                if ((statbuf.st_mode & S_IRUSR) == 0)
                        continue;
 
-               udev_list_entry_add(udev_device->udev, &udev_device->sysattr_list,
-                                   dent->d_name, NULL, 0, 0);
+               udev_list_entry_add(&udev_device->sysattr_list, dent->d_name, NULL);
                num++;
        }
 
@@ -1332,7 +1483,7 @@ static int udev_device_sysattr_list_read(struct udev_device *udev_device)
  *
  * Returns: the first entry of the property list
  **/
-struct udev_list_entry *udev_device_get_sysattr_list_entry(struct udev_device *udev_device)
+UDEV_EXPORT struct udev_list_entry *udev_device_get_sysattr_list_entry(struct udev_device *udev_device)
 {
        if (!udev_device->sysattr_list_read) {
                int ret;
@@ -1382,28 +1533,6 @@ int udev_device_set_syspath(struct udev_device *udev_device, const char *syspath
        return 0;
 }
 
-int udev_device_set_subsystem(struct udev_device *udev_device, const char *subsystem)
-{
-       free(udev_device->subsystem);
-       udev_device->subsystem = strdup(subsystem);
-       if (udev_device->subsystem == NULL)
-               return -ENOMEM;
-       udev_device->subsystem_set = true;
-       udev_device_add_property(udev_device, "SUBSYSTEM", udev_device->subsystem);
-       return 0;
-}
-
-int udev_device_set_devtype(struct udev_device *udev_device, const char *devtype)
-{
-       free(udev_device->devtype);
-       udev_device->devtype = strdup(devtype);
-       if (udev_device->devtype == NULL)
-               return -ENOMEM;
-       udev_device->devtype_set = true;
-       udev_device_add_property(udev_device, "DEVTYPE", udev_device->devtype);
-       return 0;
-}
-
 int udev_device_set_devnode(struct udev_device *udev_device, const char *devnode)
 {
        free(udev_device->devnode);
@@ -1419,11 +1548,11 @@ int udev_device_add_devlink(struct udev_device *udev_device, const char *devlink
        struct udev_list_entry *list_entry;
 
        udev_device->devlinks_uptodate = false;
-       list_entry = udev_list_entry_add(udev_device->udev, &udev_device->devlinks_list, devlink, NULL, 1, 0);
+       list_entry = udev_list_entry_add(&udev_device->devlinks_list, devlink, NULL);
        if (list_entry == NULL)
                return -ENOMEM;
        if (unique)
-               udev_list_entry_set_flags(list_entry, 1);
+               udev_list_entry_set_num(list_entry, true);
        return 0;
 }
 
@@ -1474,7 +1603,7 @@ const char *udev_device_get_id_filename(struct udev_device *udev_device)
  *
  * Returns: 1 if the device is set up. 0 otherwise.
  **/
-int udev_device_get_is_initialized(struct udev_device *udev_device)
+UDEV_EXPORT int udev_device_get_is_initialized(struct udev_device *udev_device)
 {
        if (!udev_device->info_loaded)
                udev_device_read_db(udev_device, NULL);
@@ -1491,7 +1620,7 @@ int udev_device_add_tag(struct udev_device *udev_device, const char *tag)
        if (strchr(tag, ':') != NULL || strchr(tag, ' ') != NULL)
                return -EINVAL;
        udev_device->tags_uptodate = false;
-       if (udev_list_entry_add(udev_device->udev, &udev_device->tags_list, tag, NULL, 1, 0) != NULL)
+       if (udev_list_entry_add(&udev_device->tags_list, tag, NULL) != NULL)
                return 0;
        return -ENOMEM;
 }
@@ -1499,7 +1628,7 @@ int udev_device_add_tag(struct udev_device *udev_device, const char *tag)
 void udev_device_cleanup_tags_list(struct udev_device *udev_device)
 {
        udev_device->tags_uptodate = false;
-       udev_list_cleanup_entries(udev_device->udev, &udev_device->tags_list);
+       udev_list_cleanup(&udev_device->tags_list);
 }
 
 /**
@@ -1513,24 +1642,27 @@ void udev_device_cleanup_tags_list(struct udev_device *udev_device)
  *
  * Returns: the first entry of the tag list
  **/
-struct udev_list_entry *udev_device_get_tags_list_entry(struct udev_device *udev_device)
+UDEV_EXPORT struct udev_list_entry *udev_device_get_tags_list_entry(struct udev_device *udev_device)
 {
        if (udev_device == NULL)
                return NULL;
+       if (!udev_device->info_loaded)
+               udev_device_read_db(udev_device, NULL);
        return udev_list_get_entry(&udev_device->tags_list);
 }
 
-int udev_device_has_tag(struct udev_device *udev_device, const char *tag)
+UDEV_EXPORT int udev_device_has_tag(struct udev_device *udev_device, const char *tag)
 {
        struct udev_list_entry *list_entry;
 
+       if (udev_device == NULL)
+               return false;
        if (!udev_device->info_loaded)
                udev_device_read_db(udev_device, NULL);
        list_entry = udev_device_get_tags_list_entry(udev_device);
-       list_entry =  udev_list_entry_get_by_name(list_entry, tag);
-       if (list_entry != NULL)
-               return 1;
-       return 0;
+       if (udev_list_entry_get_by_name(list_entry, tag) != NULL)
+               return true;
+       return false;
 }
 
 #define ENVP_SIZE                      128
@@ -1614,124 +1746,6 @@ int udev_device_set_action(struct udev_device *udev_device, const char *action)
        return 0;
 }
 
-int udev_device_set_driver(struct udev_device *udev_device, const char *driver)
-{
-       free(udev_device->driver);
-       udev_device->driver = strdup(driver);
-       if (udev_device->driver == NULL)
-               return -ENOMEM;
-       udev_device->driver_set = true;
-       udev_device_add_property(udev_device, "DRIVER", udev_device->driver);
-       return 0;
-}
-
-const char *udev_device_get_devpath_old(struct udev_device *udev_device)
-{
-       return udev_device->devpath_old;
-}
-
-int udev_device_set_devpath_old(struct udev_device *udev_device, const char *devpath_old)
-{
-       const char *pos;
-       size_t len;
-
-       free(udev_device->devpath_old);
-       udev_device->devpath_old = strdup(devpath_old);
-       if (udev_device->devpath_old == NULL)
-               return -ENOMEM;
-       udev_device_add_property(udev_device, "DEVPATH_OLD", udev_device->devpath_old);
-
-       pos = strrchr(udev_device->devpath_old, '/');
-       if (pos == NULL)
-               return -EINVAL;
-       udev_device->sysname_old = strdup(&pos[1]);
-       if (udev_device->sysname_old == NULL)
-               return -ENOMEM;
-
-       /* some devices have '!' in their name, change that to '/' */
-       len = 0;
-       while (udev_device->sysname_old[len] != '\0') {
-               if (udev_device->sysname_old[len] == '!')
-                       udev_device->sysname_old[len] = '/';
-               len++;
-       }
-       return 0;
-}
-
-const char *udev_device_get_sysname_old(struct udev_device *udev_device)
-{
-       if (udev_device == NULL)
-               return NULL;
-       return udev_device->sysname_old;
-}
-
-const char *udev_device_get_knodename(struct udev_device *udev_device)
-{
-       return udev_device->knodename;
-}
-
-int udev_device_set_knodename(struct udev_device *udev_device, const char *knodename)
-{
-       free(udev_device->knodename);
-       udev_device->knodename = strdup(knodename);
-       if (udev_device->knodename == NULL)
-               return -ENOMEM;
-       /* do not overwrite the udev property with the kernel property */
-       if (udev_device->devnode == NULL)
-               udev_device_add_property(udev_device, "DEVNAME", udev_device->knodename);
-       return 0;
-}
-
-int udev_device_get_timeout(struct udev_device *udev_device)
-{
-       return udev_device->timeout;
-}
-
-int udev_device_set_timeout(struct udev_device *udev_device, int timeout)
-{
-       udev_device->timeout = timeout;
-       return 0;
-}
-int udev_device_get_event_timeout(struct udev_device *udev_device)
-{
-       if (!udev_device->info_loaded)
-               udev_device_read_db(udev_device, NULL);
-       return udev_device->event_timeout;
-}
-
-int udev_device_set_event_timeout(struct udev_device *udev_device, int event_timeout)
-{
-       char num[32];
-
-       udev_device->event_timeout = event_timeout;
-       snprintf(num, sizeof(num), "%u", event_timeout);
-       udev_device_add_property(udev_device, "TIMEOUT", num);
-       return 0;
-}
-
-int udev_device_set_seqnum(struct udev_device *udev_device, unsigned long long int seqnum)
-{
-       char num[32];
-
-       udev_device->seqnum = seqnum;
-       snprintf(num, sizeof(num), "%llu", seqnum);
-       udev_device_add_property(udev_device, "SEQNUM", num);
-       return 0;
-}
-
-int udev_device_set_devnum(struct udev_device *udev_device, dev_t devnum)
-{
-       char num[32];
-
-       udev_device->devnum = devnum;
-
-       snprintf(num, sizeof(num), "%u", major(devnum));
-       udev_device_add_property(udev_device, "MAJOR", num);
-       snprintf(num, sizeof(num), "%u", minor(devnum));
-       udev_device_add_property(udev_device, "MINOR", num);
-       return 0;
-}
-
 int udev_device_get_devlink_priority(struct udev_device *udev_device)
 {
        if (!udev_device->info_loaded)
@@ -1758,19 +1772,12 @@ int udev_device_set_watch_handle(struct udev_device *udev_device, int handle)
        return 0;
 }
 
-int udev_device_get_ifindex(struct udev_device *udev_device)
+bool udev_device_get_db_persist(struct udev_device *udev_device)
 {
-       if (!udev_device->info_loaded)
-               udev_device_read_uevent_file(udev_device);
-       return udev_device->ifindex;
+       return udev_device->db_persist;
 }
 
-int udev_device_set_ifindex(struct udev_device *udev_device, int ifindex)
+void udev_device_set_db_persist(struct udev_device *udev_device)
 {
-       char num[32];
-
-       udev_device->ifindex = ifindex;
-       snprintf(num, sizeof(num), "%u", ifindex);
-       udev_device_add_property(udev_device, "IFINDEX", num);
-       return 0;
+       udev_device->db_persist = true;
 }