chiark / gitweb /
timeout handling without alarm()
[elogind.git] / libudev / libudev-device.c
index c78cf9b7a05753d8c9948c4b95a6dd5dcab9dfdc..0ef7260de223a78615b3831cd83906953e090a6e 100644 (file)
@@ -69,7 +69,6 @@ struct udev_device {
        struct udev_list_node tags_list;
        unsigned long long int seqnum;
        unsigned long long int usec_initialized;
-       int event_timeout;
        int timeout;
        int devlink_priority;
        int refcount;
@@ -89,6 +88,7 @@ struct udev_device {
        bool uevent_loaded;
        bool is_initialized;
        bool sysattr_list_read;
+       bool db_persist;
 };
 
 struct udev_list_entry *udev_device_add_property(struct udev_device *udev_device, const char *key, const char *value)
@@ -237,24 +237,30 @@ const char *udev_device_get_property_value(struct udev_device *udev_device, cons
        return udev_list_entry_get_value(list_entry);
 }
 
-int udev_device_read_db(struct udev_device *udev_device)
+int udev_device_read_db(struct udev_device *udev_device, const char *dbfile)
 {
-       const char *id;
        char filename[UTIL_PATH_SIZE];
        char line[UTIL_LINE_SIZE];
        FILE *f;
 
-       if (udev_device->db_loaded)
-               return 0;
-       udev_device->db_loaded = true;
+       /* providing a database file will always force-load it */
+       if (dbfile == NULL) {
+               const char *id;
 
-       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), "/.udev/db/", id, NULL);
-       f = fopen(filename, "re");
+               if (udev_device->db_loaded)
+                       return 0;
+               udev_device->db_loaded = true;
+
+               id = udev_device_get_id_filename(udev_device);
+               if (id == NULL)
+                       return -1;
+               util_strscpyl(filename, sizeof(filename), udev_get_run_path(udev_device->udev), "/data/", id, NULL);
+               dbfile = filename;
+       }
+
+       f = fopen(dbfile, "re");
        if (f == NULL) {
-               info(udev_device->udev, "no db file to read %s: %m\n", filename);
+               info(udev_device->udev, "no db file to read %s: %m\n", dbfile);
                return -1;
        }
        udev_device->is_initialized = true;
@@ -369,7 +375,7 @@ struct udev_device *udev_device_new(struct udev *udev)
        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_device->timeout = -1;
        udev_device->watch_handle = -1;
        /* copy global properties */
        udev_list_entry_foreach(list_entry, udev_get_properties_list_entry(udev))
@@ -908,7 +914,7 @@ const char *udev_device_get_devnode(struct udev_device *udev_device)
                return NULL;
        if (!udev_device->info_loaded) {
                udev_device_read_uevent_file(udev_device);
-               udev_device_read_db(udev_device);
+               udev_device_read_db(udev_device, NULL);
        }
 
        /* we might get called before we handled an event and have a db, use the kernel-provided name */
@@ -1002,7 +1008,7 @@ struct udev_list_entry *udev_device_get_devlinks_list_entry(struct udev_device *
        if (udev_device == NULL)
                return NULL;
        if (!udev_device->info_loaded)
-               udev_device_read_db(udev_device);
+               udev_device_read_db(udev_device, NULL);
        return udev_list_get_entry(&udev_device->devlinks_list);
 }
 
@@ -1030,7 +1036,7 @@ struct udev_list_entry *udev_device_get_properties_list_entry(struct udev_device
                return NULL;
        if (!udev_device->info_loaded) {
                udev_device_read_uevent_file(udev_device);
-               udev_device_read_db(udev_device);
+               udev_device_read_db(udev_device, NULL);
        }
        if (!udev_device->devlinks_uptodate) {
                char symlinks[UTIL_PATH_SIZE];
@@ -1154,10 +1160,10 @@ unsigned long long int udev_device_get_usec_since_initialized(struct udev_device
        if (udev_device == NULL)
                return 0;
        if (!udev_device->info_loaded)
-               udev_device_read_db(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;
@@ -1471,7 +1477,7 @@ const char *udev_device_get_id_filename(struct udev_device *udev_device)
 int udev_device_get_is_initialized(struct udev_device *udev_device)
 {
        if (!udev_device->info_loaded)
-               udev_device_read_db(udev_device);
+               udev_device_read_db(udev_device, NULL);
        return udev_device->is_initialized;
 }
 
@@ -1519,7 +1525,7 @@ int udev_device_has_tag(struct udev_device *udev_device, const char *tag)
        struct udev_list_entry *list_entry;
 
        if (!udev_device->info_loaded)
-               udev_device_read_db(udev_device);
+               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)
@@ -1682,23 +1688,11 @@ int udev_device_get_timeout(struct udev_device *udev_device)
 }
 
 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);
-       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->timeout = timeout;
+       snprintf(num, sizeof(num), "%u", timeout);
        udev_device_add_property(udev_device, "TIMEOUT", num);
        return 0;
 }
@@ -1729,7 +1723,7 @@ int udev_device_set_devnum(struct udev_device *udev_device, dev_t devnum)
 int udev_device_get_devlink_priority(struct udev_device *udev_device)
 {
        if (!udev_device->info_loaded)
-               udev_device_read_db(udev_device);
+               udev_device_read_db(udev_device, NULL);
        return udev_device->devlink_priority;
 }
 
@@ -1742,7 +1736,7 @@ int udev_device_set_devlink_priority(struct udev_device *udev_device, int prio)
 int udev_device_get_watch_handle(struct udev_device *udev_device)
 {
        if (!udev_device->info_loaded)
-               udev_device_read_db(udev_device);
+               udev_device_read_db(udev_device, NULL);
        return udev_device->watch_handle;
 }
 
@@ -1768,3 +1762,13 @@ int udev_device_set_ifindex(struct udev_device *udev_device, int ifindex)
        udev_device_add_property(udev_device, "IFINDEX", num);
        return 0;
 }
+
+bool udev_device_get_db_persist(struct udev_device *udev_device)
+{
+       return udev_device->db_persist;
+}
+
+void udev_device_set_db_persist(struct udev_device *udev_device)
+{
+       udev_device->db_persist = true;
+}