blob: e4e4baba579b3ef785cc8932adcaf9d3c1d1fb70 [file] [log] [blame]
Norman James362a80f2015-09-14 14:04:39 -05001#include "interfaces/openbmc_intf.h"
Norman James9e6acf92015-09-08 07:00:04 -05002#include "openbmc.h"
3
4
5/* ---------------------------------------------------------------------------------------------------- */
6
Norman James362a80f2015-09-14 14:04:39 -05007static const gchar* dbus_object_path = "/org/openbmc/watchdog";
8static const gchar* dbus_name = "org.openbmc.watchdog.Host";
Norman James9e6acf92015-09-08 07:00:04 -05009
10static GDBusObjectManagerServer *manager = NULL;
11
12
13static gboolean
14poll_watchdog(gpointer user_data)
15{
16 Watchdog *watchdog = object_get_watchdog((Object*)user_data);
17
18 guint count = watchdog_get_watchdog(watchdog);
19 g_print("Polling watchdog: %d\n",count);
20
21 if (count == 0)
22 {
Norman James362a80f2015-09-14 14:04:39 -050023 //watchdog error, emit error and stop watchdog
Norman James9e6acf92015-09-08 07:00:04 -050024 watchdog_emit_watchdog_error(watchdog);
Norman James362a80f2015-09-14 14:04:39 -050025 return FALSE;
Norman James9e6acf92015-09-08 07:00:04 -050026 }
27
28 //reset watchdog
29 watchdog_set_watchdog(watchdog,0);
30 return TRUE;
31}
32
33static gboolean
Adriana Kobylak2cb27752015-10-19 16:23:14 -050034set_poll_interval (Watchdog *wd,
35 GDBusMethodInvocation *invocation,
36 guint interval,
37 gpointer user_data)
38{
39 g_print("Setting watchdog poll interval to: %d\n", interval);
40 watchdog_set_poll_interval(wd, interval);
41 watchdog_complete_set(wd,invocation);
42}
43
44static gboolean
Norman James9e6acf92015-09-08 07:00:04 -050045on_start (Watchdog *wd,
46 GDBusMethodInvocation *invocation,
47 gpointer user_data)
48{
Norman James362a80f2015-09-14 14:04:39 -050049 watchdog_set_watchdog(wd,1);
Norman James9e6acf92015-09-08 07:00:04 -050050 guint poll_interval = watchdog_get_poll_interval(wd);
Adriana Kobylak2cb27752015-10-19 16:23:14 -050051 g_print("Starting watchdog with poll interval: %d\n", poll_interval);
Norman James9e6acf92015-09-08 07:00:04 -050052 g_timeout_add(poll_interval, poll_watchdog, user_data);
53 watchdog_complete_start(wd,invocation);
54 return TRUE;
55}
56
57static gboolean
58on_poke (Watchdog *wd,
59 GDBusMethodInvocation *invocation,
60 gpointer user_data)
61{
62 watchdog_set_watchdog(wd,1);
63 watchdog_complete_poke(wd,invocation);
64 return TRUE;
65}
66
67
68
69static void
70on_bus_acquired (GDBusConnection *connection,
71 const gchar *name,
72 gpointer user_data)
73{
Norman James362a80f2015-09-14 14:04:39 -050074 // g_print ("Acquired a message bus connection: %s\n",name);
Norman James9e6acf92015-09-08 07:00:04 -050075
76 cmdline *cmd = user_data;
77 if (cmd->argc < 2)
78 {
79 g_print("No objects created. Put object name(s) on command line\n");
80 return;
81 }
82 manager = g_dbus_object_manager_server_new (dbus_object_path);
83 int i=0;
84 for (i=1;i<cmd->argc;i++)
85 {
86 gchar *s;
87 s = g_strdup_printf ("%s/%s",dbus_object_path,cmd->argv[i]);
88 ObjectSkeleton *object = object_skeleton_new (s);
89 g_free (s);
90
91 Watchdog *wd = watchdog_skeleton_new ();
92 object_skeleton_set_watchdog (object, wd);
93 g_object_unref (wd);
94
95 // set properties
96 watchdog_set_watchdog(wd,1);
97
98 //define method callbacks here
99 g_signal_connect (wd,
100 "handle-start",
101 G_CALLBACK (on_start),
102 object); /* user_data */
103
104 g_signal_connect (wd,
105 "handle-poke",
106 G_CALLBACK (on_poke),
107 object); /* user_data */
108
Adriana Kobylak2cb27752015-10-19 16:23:14 -0500109 g_signal_connect (wd,
110 "handle-set",
111 G_CALLBACK (set_poll_interval),
112 object); /* user_data */
Norman James9e6acf92015-09-08 07:00:04 -0500113
114 /* Export the object (@manager takes its own reference to @object) */
115 g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));
116 g_object_unref (object);
117 }
118
119 /* Export all objects */
120 g_dbus_object_manager_server_set_connection (manager, connection);
121}
122
123static void
124on_name_acquired (GDBusConnection *connection,
125 const gchar *name,
126 gpointer user_data)
127{
Norman James362a80f2015-09-14 14:04:39 -0500128 //g_print ("Acquired the name %s\n", name);
Norman James9e6acf92015-09-08 07:00:04 -0500129}
130
131static void
132on_name_lost (GDBusConnection *connection,
133 const gchar *name,
134 gpointer user_data)
135{
Norman James362a80f2015-09-14 14:04:39 -0500136 //g_print ("Lost the name %s\n", name);
Norman James9e6acf92015-09-08 07:00:04 -0500137}
138
139
140gint
141main (gint argc, gchar *argv[])
142{
143 GMainLoop *loop;
144 cmdline cmd;
145 cmd.argc = argc;
146 cmd.argv = argv;
147 guint id;
148 loop = g_main_loop_new (NULL, FALSE);
149
Norman James5e792e32015-10-07 17:36:17 -0500150 id = g_bus_own_name (DBUS_TYPE,
Norman James9e6acf92015-09-08 07:00:04 -0500151 dbus_name,
152 G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
153 G_BUS_NAME_OWNER_FLAGS_REPLACE,
154 on_bus_acquired,
155 on_name_acquired,
156 on_name_lost,
157 &cmd,
158 NULL);
159
160 g_main_loop_run (loop);
161
162 g_bus_unown_name (id);
163 g_main_loop_unref (loop);
164 return 0;
165}