#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;
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)
{
struct waitset *waitset, int dry_run)
{
struct device_handler *handler;
+ int rc;
handler = talloc_zero(NULL, struct device_handler);
handler->server = server;
parser_init();
+ rc = device_handler_init_sources(handler);
+ if (rc) {
+ talloc_free(handler);
+ return NULL;
+ }
+
return 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;
#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;
#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"
{
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)) {
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);
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;
talloc_free(udev);
return NULL;
}
-
-void udev_destroy(struct pb_udev *udev)
-{
- talloc_free(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 */
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;
talloc_free(uev);
return NULL;
}
-
-void user_event_destroy(struct user_event *uev)
-{
- talloc_free(uev);
-}
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