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 gboolean on_cold_reset(ControlBmc *bmc, 44 GDBusMethodInvocation *invocation, 45 gpointer user_data) 46 { 47 GError *err = NULL; 48 /* Wait a while before reboot, so the caller can be responded. 49 * Note that g_spawn_command_line_async() cannot parse ';' as 50 * a command separator. Need to use 'sh -c' to let shell parse it. 51 */ 52 gchar *reboot_command = "/bin/sh -c 'sleep 3;reboot'"; 53 54 g_spawn_command_line_async(reboot_command, &err); 55 if(err != NULL) { 56 fprintf(stderr, "coldReset() error: %s\n", err->message); 57 g_error_free(err); 58 } 59 60 control_bmc_complete_cold_reset(bmc, invocation); 61 return TRUE; 62 } 63 64 static void on_bus_acquired(GDBusConnection *connection, const gchar *name, 65 gpointer user_data) 66 { 67 ObjectSkeleton *object; 68 cmdline *cmd = user_data; 69 manager = g_dbus_object_manager_server_new(dbus_object_path); 70 71 gchar *s; 72 s = g_strdup_printf("%s/%s", dbus_object_path, instance_name); 73 object = object_skeleton_new(s); 74 g_free(s); 75 76 ControlBmc* control_bmc = control_bmc_skeleton_new(); 77 object_skeleton_set_control_bmc(object, control_bmc); 78 g_object_unref(control_bmc); 79 80 Control* control = control_skeleton_new(); 81 object_skeleton_set_control(object, control); 82 g_object_unref(control); 83 84 //define method callbacks here 85 g_signal_connect(control, "handle-init", G_CALLBACK(on_init), NULL); /* user_data */ 86 87 g_signal_connect(control_bmc, "handle-warm-reset", 88 G_CALLBACK(on_warm_reset), NULL); /* user_data */ 89 90 g_signal_connect(control_bmc, "handle-cold-reset", 91 G_CALLBACK(on_cold_reset), NULL); /* user_data */ 92 93 /* Export the object (@manager takes its own reference to @object) */ 94 g_dbus_object_manager_server_export(manager, 95 G_DBUS_OBJECT_SKELETON(object)); 96 g_object_unref(object); 97 98 /* Export all objects */ 99 g_dbus_object_manager_server_set_connection(manager, connection); 100 101 cmd->user_data = object; 102 } 103 104 static void on_name_acquired(GDBusConnection *connection, const gchar *name, 105 gpointer user_data) 106 { 107 } 108 109 static void on_name_lost(GDBusConnection *connection, const gchar *name, 110 gpointer user_data) 111 { 112 } 113 114 /*----------------------------------------------------------------*/ 115 /* Main Event Loop */ 116 117 gint main(gint argc, gchar *argv[]) 118 { 119 GMainLoop *loop; 120 cmdline cmd; 121 cmd.argc = argc; 122 cmd.argv = argv; 123 124 guint id; 125 loop = g_main_loop_new(NULL, FALSE); 126 cmd.loop = loop; 127 128 id = g_bus_own_name( 129 DBUS_TYPE, 130 dbus_name, 131 G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT 132 | G_BUS_NAME_OWNER_FLAGS_REPLACE, 133 on_bus_acquired, on_name_acquired, on_name_lost, &cmd, NULL); 134 135 g_main_loop_run(loop); 136 137 g_bus_unown_name(id); 138 g_main_loop_unref(loop); 139 return 0; 140 } 141