chiark / gitweb /
make struct udev_rules opaque
authorKay Sievers <kay.sievers@vrfy.org>
Sat, 18 Oct 2008 13:02:01 +0000 (15:02 +0200)
committerKay Sievers <kay.sievers@vrfy.org>
Sat, 18 Oct 2008 13:02:01 +0000 (15:02 +0200)
udev/test-udev.c
udev/udev-rules.c
udev/udev.h
udev/udevadm-test.c
udev/udevd.c

index 1caccce304d82939d221f0b94b7d2cf0195c8a45..4f8a7e4f66a2cbf4105ab058206532142080da14 100644 (file)
@@ -46,7 +46,7 @@ int main(int argc, char *argv[])
        struct udev *udev;
        struct udev_event *event;
        struct udev_device *dev;
        struct udev *udev;
        struct udev_event *event;
        struct udev_device *dev;
-       struct udev_rules rules;
+       struct udev_rules *rules;
        char syspath[UTIL_PATH_SIZE];
        const char *devpath;
        const char *action;
        char syspath[UTIL_PATH_SIZE];
        const char *devpath;
        const char *action;
@@ -81,7 +81,7 @@ int main(int argc, char *argv[])
                goto exit;
        }
 
                goto exit;
        }
 
-       udev_rules_init(udev, &rules, 0);
+       rules = udev_rules_new(udev, 0);
 
        util_strlcpy(syspath, udev_get_sys_path(udev), sizeof(syspath));
        util_strlcat(syspath, devpath, sizeof(syspath));
 
        util_strlcpy(syspath, udev_get_sys_path(udev), sizeof(syspath));
        util_strlcat(syspath, devpath, sizeof(syspath));
@@ -97,7 +97,7 @@ int main(int argc, char *argv[])
 
        udev_device_set_action(dev, action);
        event = udev_event_new(dev);
 
        udev_device_set_action(dev, action);
        event = udev_event_new(dev);
-       err = udev_event_run(event, &rules);
+       err = udev_event_run(event, rules);
 
        /* rules may change/disable the timeout */
        if (udev_device_get_event_timeout(dev) >= 0)
 
        /* rules may change/disable the timeout */
        if (udev_device_get_event_timeout(dev) >= 0)
@@ -109,7 +109,7 @@ int main(int argc, char *argv[])
        udev_event_unref(event);
        udev_device_unref(dev);
 fail:
        udev_event_unref(event);
        udev_device_unref(dev);
 fail:
-       udev_rules_cleanup(&rules);
+       udev_rules_unref(rules);
 exit:
        selinux_exit(udev);
        udev_unref(udev);
 exit:
        selinux_exit(udev);
        udev_unref(udev);
index 445eec4239108729de170bba866c9e8a38080ef7..6d7e3f4fca58783a7e3573fe5f771076bd35a0c4 100644 (file)
 
 #include "udev.h"
 
 
 #include "udev.h"
 
-#define PAIRS_MAX              5
+struct udev_rules {
+       struct udev *udev;
+       char *buf;
+       size_t bufsize;
+       int resolve_names;
+};
+
+struct udev_rules_iter {
+       struct udev_rules *rules;
+       size_t current;
+};
 
 enum key_operation {
        KEY_OP_UNSET,
 
 enum key_operation {
        KEY_OP_UNSET,
@@ -55,6 +65,7 @@ struct key_pair {
        size_t key_name_off;
 };
 
        size_t key_name_off;
 };
 
+#define PAIRS_MAX              5
 struct key_pairs {
        int count;
        struct key_pair keys[PAIRS_MAX];
 struct key_pairs {
        int count;
        struct key_pair keys[PAIRS_MAX];
@@ -119,11 +130,6 @@ struct udev_rule {
        char buf[];
 };
 
        char buf[];
 };
 
-struct udev_rules_iter {
-       struct udev_rules *rules;
-       size_t current;
-};
-
 static void udev_rules_iter_init(struct udev_rules_iter *iter, struct udev_rules *rules)
 {
        dbg(rules->udev, "bufsize=%zi\n", rules->bufsize);
 static void udev_rules_iter_init(struct udev_rules_iter *iter, struct udev_rules *rules)
 {
        dbg(rules->udev, "bufsize=%zi\n", rules->bufsize);
@@ -1860,7 +1866,6 @@ static int get_key(struct udev_rules *rules, char **line, char **key, enum key_o
 
        /* move line to next key */
        *line = temp;
 
        /* move line to next key */
        *line = temp;
-
        return 0;
 }
 
        return 0;
 }
 
@@ -1932,7 +1937,6 @@ static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
        char *attr;
        size_t padding;
        int physdev = 0;
        char *attr;
        size_t padding;
        int physdev = 0;
-       int retval;
 
        memset(buf, 0x00, sizeof(buf));
        rule = (struct udev_rule *) buf;
 
        memset(buf, 0x00, sizeof(buf));
        rule = (struct udev_rule *) buf;
@@ -1946,8 +1950,7 @@ static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
                char *value;
                enum key_operation operation = KEY_OP_UNSET;
 
                char *value;
                enum key_operation operation = KEY_OP_UNSET;
 
-               retval = get_key(rules, &linepos, &key, &operation, &value);
-               if (retval)
+               if (get_key(rules, &linepos, &key, &operation, &value) != 0)
                        break;
 
                if (strcasecmp(key, "ACTION") == 0) {
                        break;
 
                if (strcasecmp(key, "ACTION") == 0) {
@@ -2462,14 +2465,17 @@ static int add_matching_files(struct udev *udev, struct udev_list_node *file_lis
        return 0;
 }
 
        return 0;
 }
 
-int udev_rules_init(struct udev *udev, struct udev_rules *rules, int resolve_names)
+struct udev_rules *udev_rules_new(struct udev *udev, int resolve_names)
 {
 {
+       struct udev_rules *rules;
        struct stat statbuf;
        char filename[PATH_MAX];
        struct udev_list_node file_list;
        struct udev_list_entry *file_loop, *file_tmp;
        struct stat statbuf;
        char filename[PATH_MAX];
        struct udev_list_node file_list;
        struct udev_list_entry *file_loop, *file_tmp;
-       int retval = 0;
 
 
+       rules = malloc(sizeof(struct udev_rules));
+       if (rules == NULL)
+               return rules;
        memset(rules, 0x00, sizeof(struct udev_rules));
        rules->udev = udev;
        rules->resolve_names = resolve_names;
        memset(rules, 0x00, sizeof(struct udev_rules));
        rules->udev = udev;
        rules->resolve_names = resolve_names;
@@ -2539,13 +2545,16 @@ int udev_rules_init(struct udev *udev, struct udev_rules *rules, int resolve_nam
                        info(udev, "can not read '%s'\n", file_name);
                udev_list_entry_remove(file_loop);
        }
                        info(udev, "can not read '%s'\n", file_name);
                udev_list_entry_remove(file_loop);
        }
-       return retval;
+       return rules;
 }
 
 }
 
-void udev_rules_cleanup(struct udev_rules *rules)
+void udev_rules_unref(struct udev_rules *rules)
 {
 {
+       if (rules == NULL)
+               return;
        if (rules->buf) {
                free(rules->buf);
                rules->buf = NULL;
        }
        if (rules->buf) {
                free(rules->buf);
                rules->buf = NULL;
        }
+       free(rules);
 }
 }
index 0e8a8697bd46b6a927698c311c4b959877b7f2d0..eb020cd3bb106e1541d146c0fddfe2bc6f68ef12 100644 (file)
@@ -92,14 +92,8 @@ extern void udev_event_unref(struct udev_event *event);
 extern int udev_event_run(struct udev_event *event, struct udev_rules *rules);
 
 /* udev-rules.c */
 extern int udev_event_run(struct udev_event *event, struct udev_rules *rules);
 
 /* udev-rules.c */
-struct udev_rules {
-       struct udev *udev;
-       char *buf;
-       size_t bufsize;
-       int resolve_names;
-};
-extern int udev_rules_init(struct udev *udev, struct udev_rules *rules, int resolve_names);
-extern void udev_rules_cleanup(struct udev_rules *rules);
+extern struct udev_rules *udev_rules_new(struct udev *udev, int resolve_names);
+extern void udev_rules_unref(struct udev_rules *rules);
 extern int udev_rules_get_name(struct udev_rules *rules, struct udev_event *event);
 extern int udev_rules_get_run(struct udev_rules *rules, struct udev_event *event);
 extern int udev_rules_run(struct udev_event *event);
 extern int udev_rules_get_name(struct udev_rules *rules, struct udev_event *event);
 extern int udev_rules_get_run(struct udev_rules *rules, struct udev_event *event);
 extern int udev_rules_run(struct udev_event *event);
index 99f6c36dde24a9835830fabcfef81d60e34f690b..c64e0456bb8f83fe0a38e42bf7813529c72dac0a 100644 (file)
@@ -38,7 +38,7 @@ int udevadm_test(struct udev *udev, int argc, char *argv[])
        const char *syspath = NULL;
        struct udev_event *event;
        struct udev_device *dev;
        const char *syspath = NULL;
        struct udev_event *event;
        struct udev_device *dev;
-       struct udev_rules rules = {};
+       struct udev_rules *rules = NULL;
        int err;
        int rc = 0;
 
        int err;
        int rc = 0;
 
@@ -89,7 +89,12 @@ int udevadm_test(struct udev *udev, int argc, char *argv[])
               "some values may be different, or not available at a simulation run.\n"
               "\n");
 
               "some values may be different, or not available at a simulation run.\n"
               "\n");
 
-       udev_rules_init(udev, &rules, 0);
+       rules = udev_rules_new(udev, 0);
+       if (rules == NULL) {
+               fprintf(stderr, "error reading rules\n");
+               rc = 1;
+               goto exit;
+       }
 
        /* add /sys if needed */
        if (strncmp(syspath, udev_get_sys_path(udev), strlen(udev_get_sys_path(udev))) != 0) {
 
        /* add /sys if needed */
        if (strncmp(syspath, udev_get_sys_path(udev), strlen(udev_get_sys_path(udev))) != 0) {
@@ -116,7 +121,7 @@ int udevadm_test(struct udev *udev, int argc, char *argv[])
        if (!force)
                event->test = 1;
 
        if (!force)
                event->test = 1;
 
-       err = udev_event_run(event, &rules);
+       err = udev_event_run(event, rules);
 
        if (udev_device_get_event_timeout(dev) >= 0)
                info(udev, "custom event timeout: %i\n", udev_device_get_event_timeout(dev));
 
        if (udev_device_get_event_timeout(dev) >= 0)
                info(udev, "custom event timeout: %i\n", udev_device_get_event_timeout(dev));
@@ -135,6 +140,6 @@ int udevadm_test(struct udev *udev, int argc, char *argv[])
        udev_event_unref(event);
        udev_device_unref(dev);
 exit:
        udev_event_unref(event);
        udev_device_unref(dev);
 exit:
-       udev_rules_cleanup(&rules);
+       udev_rules_unref(rules);
        return rc;
 }
        return rc;
 }
index 5388961c42d468646bab1b4050eecedf1a8ca2e9..918825ae506194765e9431503991ee0a2a7eb88a 100644 (file)
@@ -58,7 +58,7 @@ static void log_fn(struct udev *udev, int priority,
 }
 
 static int debug_trace;
 }
 
 static int debug_trace;
-static struct udev_rules rules;
+static struct udev_rules *rules;
 static struct udev_ctrl *udev_ctrl;
 static struct udev_monitor *kernel_monitor;
 static int inotify_fd = -1;
 static struct udev_ctrl *udev_ctrl;
 static struct udev_monitor *kernel_monitor;
 static int inotify_fd = -1;
@@ -208,7 +208,7 @@ static void event_fork(struct udev_event *event)
                alarm(UDEV_EVENT_TIMEOUT);
 
                /* apply rules, create node, symlinks */
                alarm(UDEV_EVENT_TIMEOUT);
 
                /* apply rules, create node, symlinks */
-               err = udev_event_run(event, &rules);
+               err = udev_event_run(event, rules);
 
                /* rules may change/disable the timeout */
                if (udev_device_get_event_timeout(event->dev) >= 0)
 
                /* rules may change/disable the timeout */
                if (udev_device_get_event_timeout(event->dev) >= 0)
@@ -748,9 +748,13 @@ int main(int argc, char *argv[])
                goto exit;
        }
 
                goto exit;
        }
 
+       rules = udev_rules_new(udev, 1);
+       if (rules == NULL) {
+               err(udev, "error reading rules\n");
+               goto exit;
+       }
        udev_list_init(&running_list);
        udev_list_init(&exec_list);
        udev_list_init(&running_list);
        udev_list_init(&exec_list);
-       udev_rules_init(udev, &rules, 1);
        export_initial_seqnum(udev);
 
        if (daemonize) {
        export_initial_seqnum(udev);
 
        if (daemonize) {
@@ -934,9 +938,14 @@ int main(int argc, char *argv[])
 
                /* rules changed, set by inotify or a HUP signal */
                if (reload_config) {
 
                /* rules changed, set by inotify or a HUP signal */
                if (reload_config) {
+                       struct udev_rules *rules_new;
+
                        reload_config = 0;
                        reload_config = 0;
-                       udev_rules_cleanup(&rules);
-                       udev_rules_init(udev, &rules, 1);
+                       rules_new = udev_rules_new(udev, 1);
+                       if (rules_new != NULL) {
+                               udev_rules_unref(rules);
+                               rules = rules_new;
+                       }
                }
 
                if (sigchilds_waiting) {
                }
 
                if (sigchilds_waiting) {
@@ -953,7 +962,7 @@ int main(int argc, char *argv[])
        rc = 0;
 
 exit:
        rc = 0;
 
 exit:
-       udev_rules_cleanup(&rules);
+       udev_rules_unref(rules);
 
        if (signal_pipe[READ_END] >= 0)
                close(signal_pipe[READ_END]);
 
        if (signal_pipe[READ_END] >= 0)
                close(signal_pipe[READ_END]);