# vi:set ts=8 sw=8 noet ai nocindent:
SUBDIRS = \
+ luc-handler \
boot-manager \
legacy-app-handler \
- luc-handler \
tests
.PHONY: ChangeLog
boot_manager_SOURCES = \
../common/watchdog-client.c \
../common/watchdog-client.h \
+ ../luc-handler/luc-handler-dbus.c \
+ ../luc-handler/luc-handler-dbus.h \
boot-manager-application.c \
boot-manager-application.h \
boot-manager-service.c \
#include <boot-manager/boot-manager-application.h>
#include <boot-manager/boot-manager-service.h>
#include <boot-manager/luc-starter.h>
+#include <luc-handler/luc-handler-dbus.h>
{
PROP_0,
PROP_BOOT_MANAGER,
+ PROP_LUC_HANDLER,
PROP_LUC_STARTER,
};
BootManagerService *boot_manager;
/* LUC starter to restore the LUC */
+ LUCHandler *luc_handler;
LUCStarter *luc_starter;
};
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class,
+ PROP_LUC_HANDLER,
+ g_param_spec_object ("luc-handler",
+ "luc-handler",
+ "luc-handler",
+ TYPE_LUC_HANDLER,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS));
+
g_object_class_install_property (gobject_class,
PROP_LUC_STARTER,
g_param_spec_object ("luc-starter",
/* release the watchdog client */
g_object_unref (application->watchdog_client);
+ /* release the LUC handler/starter */
+ g_object_unref (application->luc_handler);
+ g_object_unref (application->luc_starter);
+
/* release the boot manager implementation */
if (application->boot_manager != NULL)
g_object_unref (application->boot_manager);
{
BootManagerApplication *application = BOOT_MANAGER_APPLICATION (object);
- /* create the LUC starter */
- application->luc_starter = luc_starter_new (application->boot_manager);
+ /* instantiate the LUC starter */
+ application->luc_starter = luc_starter_new (application->boot_manager,
+ application->luc_handler);
}
case PROP_BOOT_MANAGER:
g_value_set_object (value, application->boot_manager);
break;
+ case PROP_LUC_HANDLER:
+ g_value_set_object (value, application->luc_handler);
+ break;
case PROP_LUC_STARTER:
g_value_set_object (value, application->luc_starter);
break;
case PROP_BOOT_MANAGER:
application->boot_manager = g_value_dup_object (value);
break;
+ case PROP_LUC_HANDLER:
+ application->luc_handler = g_value_dup_object (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
BootManagerApplication *
-boot_manager_application_new (BootManagerService *boot_manager)
+boot_manager_application_new (BootManagerService *boot_manager,
+ LUCHandler *luc_handler)
{
g_return_val_if_fail (BOOT_MANAGER_IS_SERVICE (boot_manager), NULL);
+ g_return_val_if_fail (IS_LUC_HANDLER (luc_handler), NULL);
return g_object_new (BOOT_MANAGER_TYPE_APPLICATION,
"application-id", "org.genivi.BootManager1",
"flags", G_APPLICATION_IS_SERVICE,
"boot-manager", boot_manager,
+ "luc-handler", luc_handler,
NULL);
}
#ifndef __BOOT_MANAGER_APPLICATION_H__
#define __BOOT_MANAGER_APPLICATION_H__
+#include <luc-handler/luc-handler-dbus.h>
#include <boot-manager/boot-manager-service.h>
G_BEGIN_DECLS
GType boot_manager_application_get_type (void) G_GNUC_CONST;
-BootManagerApplication *boot_manager_application_new (BootManagerService *service) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT;
+BootManagerApplication *boot_manager_application_new (BootManagerService *service,
+ LUCHandler *luc_handler) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT;
G_END_DECLS
#include <boot-manager/boot-manager-service.h>
#include <boot-manager/luc-starter.h>
+#include <luc-handler/luc-handler-dbus.h>
{
PROP_0,
PROP_BOOT_MANAGER,
+ PROP_LUC_HANDLER,
};
+static void luc_starter_constructed (GObject *object);
static void luc_starter_finalize (GObject *object);
static void luc_starter_get_property (GObject *object,
guint prop_id,
GObject __parent__;
BootManagerService *boot_manager;
+ LUCHandler *luc_handler;
+
+ gchar **prioritised_types;
};
GObjectClass *gobject_class;
gobject_class = G_OBJECT_CLASS (klass);
+ gobject_class->constructed = luc_starter_constructed;
gobject_class->finalize = luc_starter_finalize;
gobject_class->get_property = luc_starter_get_property;
gobject_class->set_property = luc_starter_set_property;
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class,
+ PROP_LUC_HANDLER,
+ g_param_spec_object ("luc-handler",
+ "luc-handler",
+ "luc-handler",
+ TYPE_LUC_HANDLER,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS));
+}
+
+
+
+static void
+luc_starter_init (LUCStarter *starter)
+{
}
static void
-luc_starter_init (LUCStarter *service)
+luc_starter_constructed (GObject *object)
{
+ LUCStarter *starter = LUC_STARTER (object);
+
+ /* parse the prioritised LUC types defined at build-time */
+ starter->prioritised_types = g_strsplit (PRIORITISED_LUC_TYPES, ",", -1);
}
static void
luc_starter_finalize (GObject *object)
{
- LUCStarter *service = LUC_STARTER (object);
+ LUCStarter *starter = LUC_STARTER (object);
+
+ /* free the prioritised types array */
+ g_strfreev (starter->prioritised_types);
/* release the boot manager */
- g_object_unref (service->boot_manager);
+ g_object_unref (starter->boot_manager);
+
+ /* release the LUC handler */
+ g_object_unref (starter->luc_handler);
(*G_OBJECT_CLASS (luc_starter_parent_class)->finalize) (object);
}
GValue *value,
GParamSpec *pspec)
{
- LUCStarter *service = LUC_STARTER (object);
+ LUCStarter *starter = LUC_STARTER (object);
switch (prop_id)
{
case PROP_BOOT_MANAGER:
- g_value_set_object (value, service->boot_manager);
+ g_value_set_object (value, starter->boot_manager);
+ break;
+ case PROP_LUC_HANDLER:
+ g_value_set_object (value, starter->luc_handler);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
const GValue *value,
GParamSpec *pspec)
{
- LUCStarter *service = LUC_STARTER (object);
+ LUCStarter *starter = LUC_STARTER (object);
switch (prop_id)
{
case PROP_BOOT_MANAGER:
- service->boot_manager = g_value_dup_object (value);
+ starter->boot_manager = g_value_dup_object (value);
+ break;
+ case PROP_LUC_HANDLER:
+ starter->luc_handler = g_value_dup_object (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
LUCStarter *
-luc_starter_new (BootManagerService *boot_manager)
+luc_starter_new (BootManagerService *boot_manager,
+ LUCHandler *luc_handler)
{
g_return_val_if_fail (BOOT_MANAGER_IS_SERVICE (boot_manager), NULL);
- return g_object_new (TYPE_LUC_STARTER, "boot-manager", boot_manager, NULL);
+ g_return_val_if_fail (IS_LUC_HANDLER (luc_handler), NULL);
+
+ return g_object_new (TYPE_LUC_STARTER,
+ "boot-manager", boot_manager,
+ "luc-handler", luc_handler,
+ NULL);
}
void
luc_starter_start_groups (LUCStarter *starter)
{
- g_debug ("restore LUC if desired");
+ guint n;
+
+ g_debug ("start LUC types in the following order:");
+
+ for (n = 0; starter->prioritised_types[n] != NULL; n++)
+ g_debug (" %s", starter->prioritised_types[n]);
}
#define __LUC_STARTER_H__
#include <boot-manager/boot-manager-service.h>
+#include <luc-handler/luc-handler-dbus.h>
G_BEGIN_DECLS
GType luc_starter_get_type (void) G_GNUC_CONST;
-LUCStarter *luc_starter_new (BootManagerService *boot_manager) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT;
+LUCStarter *luc_starter_new (BootManagerService *boot_manager,
+ LUCHandler *luc_handler) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT;
void luc_starter_start_groups (LUCStarter *starter);
G_END_DECLS
BootManagerService *service;
GDBusConnection *connection;
SystemdManager *systemd_manager;
+ LUCHandler *luc_handler;
GError *error = NULL;
gint exit_status = EXIT_SUCCESS;
return EXIT_FAILURE;
}
- /* instantiate the BootManager service implementation */
+ /* attempt to connect to the LUC handler */
+ luc_handler =
+ luc_handler_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
+ G_DBUS_PROXY_FLAGS_NONE,
+ "org.freedesktop.LUCHandler1",
+ "/org/freedesktop/LUCHandler1",
+ NULL, &error);
+ if (luc_handler == NULL)
+ {
+ g_warning ("Failed to connect to the LUC handler: %s", error->message);
+
+ /* clean up */
+ g_error_free (error);
+ g_object_unref (systemd_manager);
+ g_object_unref (connection);
+
+ return EXIT_FAILURE;
+ }
+
+ /* instantiate the boot manager service implementation */
service = boot_manager_service_new (connection, systemd_manager);
if (!boot_manager_service_start_up (service, &error))
{
}
/* create and run the main application */
- application = boot_manager_application_new (service);
+ application = boot_manager_application_new (service, luc_handler);
exit_status = g_application_run (G_APPLICATION (application), 0, NULL);
g_object_unref (application);