]> git.ozlabs.org Git - petitboot/commitdiff
discover: move device sources to the device handler
authorJeremy Kerr <jk@ozlabs.org>
Wed, 2 Apr 2014 06:08:26 +0000 (14:08 +0800)
committerJeremy Kerr <jk@ozlabs.org>
Wed, 2 Apr 2014 06:08:26 +0000 (14:08 +0800)
Currently, the pb-discover main() function initialises the device
handler and the device sources.

We want to eventually be able to re-init the device sources, which will
be initiated by the handler. In this case, the handler will need
references to the sources.

This change moves the creation of the device sources to be internal to
the handler. This way, the device handler gets a reference to
everything, without having to pass pointers around in main().

We also remove the _destroy functions, as we handle everything through
talloc destructors, as all sources are parented to the handler. We also
change user_event_init and udev_init to take the handler as the first
('context') argument, to make them consistent with network_init.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
discover/device-handler.c
discover/pb-discover.c
discover/udev.c
discover/udev.h
discover/user-event.c
discover/user-event.h

index 8bac86673b89abdc598991fa6c77eb19a9c58962..352a477d16230c49b4a14c6201bf3d7ab03de649 100644 (file)
@@ -19,6 +19,7 @@
 
 #include "device-handler.h"
 #include "discover-server.h"
+#include "user-event.h"
 #include "platform.h"
 #include "event.h"
 #include "parser.h"
 #include "paths.h"
 #include "sysinfo.h"
 #include "boot.h"
+#include "udev.h"
+#include "network.h"
 
 struct device_handler {
        struct discover_server  *server;
        int                     dry_run;
 
+       struct pb_udev          *udev;
+       struct network          *network;
+       struct user_event       *user_event;
+
        struct discover_device  **devices;
        unsigned int            n_devices;
 
@@ -49,6 +56,8 @@ struct device_handler {
 static int mount_device(struct discover_device *dev);
 static int umount_device(struct discover_device *dev);
 
+static int device_handler_init_sources(struct device_handler *handler);
+
 void discover_context_add_boot_option(struct discover_context *ctx,
                struct discover_boot_option *boot_option)
 {
@@ -260,6 +269,7 @@ struct device_handler *device_handler_init(struct discover_server *server,
                struct waitset *waitset, int dry_run)
 {
        struct device_handler *handler;
+       int rc;
 
        handler = talloc_zero(NULL, struct device_handler);
        handler->server = server;
@@ -274,6 +284,12 @@ struct device_handler *device_handler_init(struct discover_server *server,
 
        parser_init();
 
+       rc = device_handler_init_sources(handler);
+       if (rc) {
+               talloc_free(handler);
+               return NULL;
+       }
+
        return handler;
 }
 
@@ -750,6 +766,26 @@ void device_handler_update_config(struct device_handler *handler,
 }
 
 #ifndef PETITBOOT_TEST
+
+static int device_handler_init_sources(struct device_handler *handler)
+{
+       /* init our device sources: udev, network and user events */
+       handler->udev = udev_init(handler, handler->waitset);
+       if (!handler->udev)
+               return -1;
+
+       handler->network = network_init(handler, handler->waitset,
+                       handler->dry_run);
+       if (!handler->network)
+               return -1;
+
+       handler->user_event = user_event_init(handler, handler->waitset);
+       if (!handler->user_event)
+               return -1;
+
+       return 0;
+}
+
 static bool check_existing_mount(struct discover_device *dev)
 {
        struct stat devstat, mntstat;
@@ -911,6 +947,12 @@ void device_release_write(struct discover_device *dev, bool release)
 
 #else
 
+static int device_handler_init_sources(
+               struct device_handler *handler __attribute__((unused)))
+{
+       return 0;
+}
+
 static int umount_device(struct discover_device *dev __attribute__((unused)))
 {
        return 0;
index bb590a9314f549a9ad6219020767a3f2004507ec..713d99d3cee1cdcd1061164a017447df5bc5962e 100644 (file)
 #include <process/process.h>
 #include <talloc/talloc.h>
 
-#include "udev.h"
-#include "user-event.h"
 #include "discover-server.h"
 #include "device-handler.h"
-#include "network.h"
 #include "sysinfo.h"
 #include "platform.h"
 
@@ -119,12 +116,9 @@ int main(int argc, char *argv[])
 {
        struct device_handler *handler;
        struct discover_server *server;
-       struct network *network;
        struct waitset *waitset;
        struct procset *procset;
        struct opts opts;
-       struct pb_udev *udev;
-       struct user_event *uev;
        FILE *log;
 
        if (opts_parse(&opts, argc, argv)) {
@@ -182,28 +176,12 @@ int main(int argc, char *argv[])
 
        discover_server_set_device_source(server, handler);
 
-       /* init our device sources: udev, network and user events */
-       udev = udev_init(waitset, handler);
-       if (!udev)
-               return EXIT_FAILURE;
-
-       network = network_init(handler, waitset, opts.dry_run == opt_yes);
-       if (!network)
-               return EXIT_FAILURE;
-
-       uev = user_event_init(waitset, handler);
-       if (!uev)
-               return EXIT_FAILURE;
-
        for (running = 1; running;) {
                if (waiter_poll(waitset))
                        break;
        }
 
-       network_shutdown(network);
        device_handler_destroy(handler);
-       user_event_destroy(uev);
-       udev_destroy(udev);
        discover_server_destroy(server);
        platform_fini();
        talloc_free(waitset);
index 16e83d59312d700cbff05d5567d86ec47c548a39..320dffd03c1676d5f401153bb24ed80bb3c21e55 100644 (file)
@@ -425,12 +425,13 @@ static void udev_log_fn(struct udev __attribute__((unused)) *udev,
       vfprintf(pb_log_get_stream(), format, args);
 }
 
-struct pb_udev *udev_init(struct waitset *waitset,
-       struct device_handler *handler)
+struct pb_udev *udev_init(struct device_handler *handler,
+               struct waitset *waitset)
 {
+       struct pb_udev *udev;
        int result;
-       struct pb_udev *udev = talloc(NULL, struct pb_udev);
 
+       udev = talloc(handler, struct pb_udev);
        talloc_set_destructor(udev, udev_destructor);
        udev->handler = handler;
 
@@ -468,8 +469,3 @@ fail_new:
        talloc_free(udev);
        return NULL;
 }
-
-void udev_destroy(struct pb_udev *udev)
-{
-       talloc_free(udev);
-}
index ea6f30d53546ecd21b8e81892c3c6e922619a50a..edd18fa3887baf17d18d3d8ebe1a982d9423d07a 100644 (file)
@@ -5,8 +5,7 @@ struct pb_udev;
 struct device_handler;
 struct waitset;
 
-struct pb_udev *udev_init(struct waitset *waitset,
-       struct device_handler *handler);
-void udev_destroy(struct pb_udev *udev);
+struct pb_udev *udev_init(struct device_handler *handler,
+               struct waitset *waitset);
 
 #endif /* _UDEV_H */
index cf7f20c599bbefdac3c004834dc75966500a7a4b..1f7004509041123091ff85b9234c7e8b08133fed 100644 (file)
@@ -505,15 +505,15 @@ static int user_event_destructor(void *arg)
        return 0;
 }
 
-struct user_event *user_event_init(struct waitset *waitset,
-               struct device_handler *handler)
+struct user_event *user_event_init(struct device_handler *handler,
+               struct waitset *waitset)
 {
        struct sockaddr_un addr;
        struct user_event *uev;
 
        unlink(PBOOT_USER_EVENT_SOCKET);
 
-       uev = talloc(NULL, struct user_event);
+       uev = talloc(handler, struct user_event);
 
        uev->handler = handler;
 
@@ -546,8 +546,3 @@ out_err:
        talloc_free(uev);
        return NULL;
 }
-
-void user_event_destroy(struct user_event *uev)
-{
-       talloc_free(uev);
-}
index b892c9a4c44627b4e74257e88ad6a817daac7530..50eb947d30a32116c2a860363128433833683764 100644 (file)
@@ -33,8 +33,7 @@ struct pb_url *user_event_parse_conf_url(struct discover_context *ctx,
                struct event *event, bool *complete_url);
 char **user_event_parse_conf_filenames(
                struct discover_context *ctx, struct event *event);
-struct user_event *user_event_init(struct waitset *waitset,
-               struct device_handler *handler);
-void user_event_destroy(struct user_event *uev);
+struct user_event *user_event_init(struct device_handler *handler,
+               struct waitset *waitset);
 
 #endif