1 #include <stdint.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <openbmc_intf.h> 5 #include <openbmc.h> 6 7 /* ------------------------------------------------------------------------- */ 8 static const gchar* dbus_object_path = "/org/openbmc/control"; 9 static const gchar* instance_name = "bmc0"; 10 static const gchar* dbus_name = "org.openbmc.control.Bmc"; 11 12 static GDBusObjectManagerServer *manager = NULL; 13 14 static gboolean on_init(Control *control, GDBusMethodInvocation *invocation, 15 gpointer user_data) 16 { 17 control_complete_init(control, invocation); 18 return TRUE; 19 } 20 21 static gboolean on_warm_reset(ControlBmc *bmc, 22 GDBusMethodInvocation *invocation, 23 gpointer user_data) 24 { 25 GError *err = NULL; 26 /* Wait a while before reboot, so the caller can be responded. 27 * Note that g_spawn_command_line_async() cannot parse ';' as 28 * a command separator. Need to use 'sh -c' to let shell parse it. 29 */ 30 gchar *reboot_command = "/bin/sh -c 'sleep 3;reboot'"; 31 32 g_spawn_command_line_async(reboot_command, &err); 33 if (err != NULL) 34 { 35 fprintf(stderr, "warmReset() error: %s\n", err->message); 36 g_error_free(err); 37 } 38 39 control_bmc_complete_warm_reset(bmc, invocation); 40 return TRUE; 41 } 42 43 static void on_bus_acquired(GDBusConnection *connection, const gchar *name, 44 gpointer user_data) 45 { 46 ObjectSkeleton *object; 47 cmdline *cmd = user_data; 48 manager = g_dbus_object_manager_server_new(dbus_object_path); 49 50 gchar *s; 51 s = g_strdup_printf("%s/%s", dbus_object_path, instance_name); 52 object = object_skeleton_new(s); 53 g_free(s); 54 55 ControlBmc* control_bmc = control_bmc_skeleton_new(); 56 object_skeleton_set_control_bmc(object, control_bmc); 57 g_object_unref(control_bmc); 58 59 Control* control = control_skeleton_new(); 60 object_skeleton_set_control(object, control); 61 g_object_unref(control); 62 63 //define method callbacks here 64 g_signal_connect(control, "handle-init", G_CALLBACK(on_init), NULL); /* user_data */ 65 66 g_signal_connect(control_bmc, "handle-warm-reset", 67 G_CALLBACK(on_warm_reset), NULL); /* user_data */ 68 69 /* Export the object (@manager takes its own reference to @object) */ 70 g_dbus_object_manager_server_export(manager, 71 G_DBUS_OBJECT_SKELETON(object)); 72 g_object_unref(object); 73 74 /* Export all objects */ 75 g_dbus_object_manager_server_set_connection(manager, connection); 76 77 cmd->user_data = object; 78 } 79 80 static void on_name_acquired(GDBusConnection *connection, const gchar *name, 81 gpointer user_data) 82 { 83 } 84 85 static void on_name_lost(GDBusConnection *connection, const gchar *name, 86 gpointer user_data) 87 { 88 } 89 90 /*----------------------------------------------------------------*/ 91 /* Main Event Loop */ 92 93 gint main(gint argc, gchar *argv[]) 94 { 95 GMainLoop *loop; 96 cmdline cmd; 97 cmd.argc = argc; 98 cmd.argv = argv; 99 100 guint id; 101 loop = g_main_loop_new(NULL, FALSE); 102 cmd.loop = loop; 103 104 id = g_bus_own_name( 105 DBUS_TYPE, 106 dbus_name, 107 G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT 108 | G_BUS_NAME_OWNER_FLAGS_REPLACE, 109 on_bus_acquired, on_name_acquired, on_name_lost, &cmd, NULL); 110 111 g_main_loop_run(loop); 112 113 g_bus_unown_name(id); 114 g_main_loop_unref(loop); 115 return 0; 116 } 117