summaryrefslogtreecommitdiffstats
path: root/discover
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2014-04-02 14:08:26 +0800
committerJeremy Kerr <jk@ozlabs.org>2014-04-02 14:08:26 +0800
commitedcfca78ac49793e295ac97328942321f39e3996 (patch)
tree3f92527eba90f27af3fd9fe533a0c490e7ad73ea /discover
parent70fb2ec0af31c1d78c8655ef13f682d597921390 (diff)
downloadtalos-petitboot-edcfca78ac49793e295ac97328942321f39e3996.tar.gz
talos-petitboot-edcfca78ac49793e295ac97328942321f39e3996.zip
discover: move device sources to the device handler
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>
Diffstat (limited to 'discover')
-rw-r--r--discover/device-handler.c42
-rw-r--r--discover/pb-discover.c22
-rw-r--r--discover/udev.c12
-rw-r--r--discover/udev.h5
-rw-r--r--discover/user-event.c11
-rw-r--r--discover/user-event.h5
6 files changed, 53 insertions, 44 deletions
diff --git a/discover/device-handler.c b/discover/device-handler.c
index 8bac866..352a477 100644
--- a/discover/device-handler.c
+++ b/discover/device-handler.c
@@ -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"
@@ -26,11 +27,17 @@
#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;
diff --git a/discover/pb-discover.c b/discover/pb-discover.c
index bb590a9..713d99d 100644
--- a/discover/pb-discover.c
+++ b/discover/pb-discover.c
@@ -14,11 +14,8 @@
#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);
diff --git a/discover/udev.c b/discover/udev.c
index 16e83d5..320dffd 100644
--- a/discover/udev.c
+++ b/discover/udev.c
@@ -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);
-}
diff --git a/discover/udev.h b/discover/udev.h
index ea6f30d..edd18fa 100644
--- a/discover/udev.h
+++ b/discover/udev.h
@@ -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 */
diff --git a/discover/user-event.c b/discover/user-event.c
index cf7f20c..1f70045 100644
--- a/discover/user-event.c
+++ b/discover/user-event.c
@@ -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);
-}
diff --git a/discover/user-event.h b/discover/user-event.h
index b892c9a..50eb947 100644
--- a/discover/user-event.h
+++ b/discover/user-event.h
@@ -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
OpenPOWER on IntegriCloud