chiark / gitweb /
libudev: private - introduce udev_device_new_from_synthetic_event()
authorTom Gundersen <teg@jklm.no>
Sun, 15 Mar 2015 16:10:17 +0000 (17:10 +0100)
committerTom Gundersen <teg@jklm.no>
Wed, 18 Mar 2015 13:49:20 +0000 (14:49 +0100)
This allows set_action(), read_uevent_file() and read_db() to be made internal to libudev.

src/libudev/libudev-device.c
src/libudev/libudev-private.h
src/test/test-udev.c
src/udev/udevadm-test.c

index c182f07..d510b47 100644 (file)
@@ -36,6 +36,8 @@
 #include "libudev.h"
 #include "libudev-private.h"
 
+static int udev_device_read_uevent_file(struct udev_device *udev_device);
+static int udev_device_read_db(struct udev_device *udev_device);
 static int udev_device_set_devnode(struct udev_device *udev_device, const char *devnode);
 static struct udev_list_entry *udev_device_add_property_internal(struct udev_device *udev_device, const char *key, const char *value);
 
@@ -462,6 +464,16 @@ void udev_device_ensure_usec_initialized(struct udev_device *udev_device, struct
                 udev_device_set_usec_initialized(udev_device, now(CLOCK_MONOTONIC));
 }
 
+static int udev_device_set_action(struct udev_device *udev_device, const char *action)
+{
+        free(udev_device->action);
+        udev_device->action = strdup(action);
+        if (udev_device->action == NULL)
+                return -ENOMEM;
+        udev_device_add_property_internal(udev_device, "ACTION", udev_device->action);
+        return 0;
+}
+
 /*
  * parse property string, and if needed, update internal values accordingly
  *
@@ -582,7 +594,7 @@ _public_ const char *udev_device_get_property_value(struct udev_device *udev_dev
         return udev_list_entry_get_value(list_entry);
 }
 
-int udev_device_read_db(struct udev_device *udev_device)
+static int udev_device_read_db(struct udev_device *udev_device)
 {
         char filename[UTIL_PATH_SIZE];
         char line[UTIL_LINE_SIZE];
@@ -646,7 +658,7 @@ int udev_device_read_db(struct udev_device *udev_device)
         return 0;
 }
 
-int udev_device_read_uevent_file(struct udev_device *udev_device)
+static int udev_device_read_uevent_file(struct udev_device *udev_device)
 {
         char filename[UTIL_PATH_SIZE];
         FILE *f;
@@ -1897,16 +1909,6 @@ ssize_t udev_device_get_properties_monitor_buf(struct udev_device *udev_device,
         return udev_device->monitor_buf_len;
 }
 
-int udev_device_set_action(struct udev_device *udev_device, const char *action)
-{
-        free(udev_device->action);
-        udev_device->action = strdup(action);
-        if (udev_device->action == NULL)
-                return -ENOMEM;
-        udev_device_add_property_internal(udev_device, "ACTION", udev_device->action);
-        return 0;
-}
-
 int udev_device_get_devlink_priority(struct udev_device *udev_device)
 {
         if (!udev_device->info_loaded)
@@ -2053,6 +2055,36 @@ struct udev_device *udev_device_new_from_nulstr(struct udev *udev, char *nulstr,
         return device;
 }
 
+struct udev_device *udev_device_new_from_synthetic_event(struct udev *udev, const char *syspath, const char *action) {
+        struct udev_device *ret;
+        int r;
+
+        if (!action) {
+                errno = EINVAL;
+                return NULL;
+        }
+
+        ret = udev_device_new_from_syspath(udev, syspath);
+        if (!ret)
+                return NULL;
+
+        r = udev_device_read_uevent_file(ret);
+        if (r < 0) {
+                udev_device_unref(ret);
+                errno = -r;
+                return NULL;
+        }
+
+        r = udev_device_set_action(ret, action);
+        if (r < 0) {
+                udev_device_unref(ret);
+                errno = -r;
+                return NULL;
+        }
+
+        return ret;
+}
+
 int udev_device_copy_properties(struct udev_device *dst, struct udev_device *src) {
         struct udev_list_entry *entry;
 
index 403ae59..32c5e19 100644 (file)
@@ -38,6 +38,7 @@ int udev_get_rules_path(struct udev *udev, char **path[], usec_t *ts_usec[]);
 
 /* libudev-device.c */
 struct udev_device *udev_device_new_from_nulstr(struct udev *udev, char *nulstr, ssize_t buflen);
+struct udev_device *udev_device_new_from_synthetic_event(struct udev *udev, const char *syspath, const char *action);
 struct udev_device *udev_device_shallow_clone(struct udev_device *old_device);
 struct udev_device *udev_device_clone_with_db(struct udev_device *old_device);
 int udev_device_copy_properties(struct udev_device *dst, struct udev_device *src);
@@ -50,9 +51,6 @@ void udev_device_cleanup_devlinks_list(struct udev_device *udev_device);
 int udev_device_add_property(struct udev_device *udev_device, const char *key, const char *value);
 char **udev_device_get_properties_envp(struct udev_device *udev_device);
 ssize_t udev_device_get_properties_monitor_buf(struct udev_device *udev_device, const char **buf);
-int udev_device_read_db(struct udev_device *udev_device);
-int udev_device_read_uevent_file(struct udev_device *udev_device);
-int udev_device_set_action(struct udev_device *udev_device, const char *action);
 const char *udev_device_get_devpath_old(struct udev_device *udev_device);
 const char *udev_device_get_id_filename(struct udev_device *udev_device);
 void udev_device_set_is_initialized(struct udev_device *udev_device);
index 4403624..23b7faa 100644 (file)
@@ -110,13 +110,12 @@ int main(int argc, char *argv[]) {
         rules = udev_rules_new(udev, 1);
 
         strscpyl(syspath, sizeof(syspath), "/sys", devpath, NULL);
-        dev = udev_device_new_from_syspath(udev, syspath);
+        dev = udev_device_new_from_synthetic_event(udev, syspath, action);
         if (dev == NULL) {
                 log_debug("unknown device '%s'", devpath);
                 goto out;
         }
 
-        udev_device_set_action(dev, action);
         event = udev_event_new(dev);
 
         sigfillset(&mask);
index 542c56e..fe092cf 100644 (file)
@@ -117,18 +117,16 @@ static int adm_test(struct udev *udev, int argc, char *argv[]) {
                 strscpy(filename, sizeof(filename), syspath);
         util_remove_trailing_chars(filename, '/');
 
-        dev = udev_device_new_from_syspath(udev, filename);
+        dev = udev_device_new_from_synthetic_event(udev, filename, action);
         if (dev == NULL) {
                 fprintf(stderr, "unable to open device '%s'\n", filename);
                 rc = 4;
                 goto out;
         }
 
-        /* skip reading of db, but read kernel parameters */
+        /* don't read info from the db */
         udev_device_set_info_loaded(dev);
-        udev_device_read_uevent_file(dev);
 
-        udev_device_set_action(dev, action);
         event = udev_event_new(dev);
 
         sigfillset(&mask);