blob: b1c8f2ba6c1e67ca4ba1a3776848d8acf4782428 [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;
Adriana Kobylakdaea21d2015-10-22 12:21:56 -050011static guint watchdogid = 0;
Norman James9e6acf92015-09-08 07:00:04 -050012
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
Adriana Kobylakdaea21d2015-10-22 12:21:56 -050024 watchdogid = 0;
Norman James9e6acf92015-09-08 07:00:04 -050025 watchdog_emit_watchdog_error(watchdog);
Norman James362a80f2015-09-14 14:04:39 -050026 return FALSE;
Norman James9e6acf92015-09-08 07:00:04 -050027 }
28
29 //reset watchdog
30 watchdog_set_watchdog(watchdog,0);
31 return TRUE;
32}
33
34static gboolean
Adriana Kobylak2cb27752015-10-19 16:23:14 -050035set_poll_interval (Watchdog *wd,
36 GDBusMethodInvocation *invocation,
37 guint interval,
38 gpointer user_data)
39{
40 g_print("Setting watchdog poll interval to: %d\n", interval);
41 watchdog_set_poll_interval(wd, interval);
42 watchdog_complete_set(wd,invocation);
43}
44
45static gboolean
Norman James9e6acf92015-09-08 07:00:04 -050046on_start (Watchdog *wd,
47 GDBusMethodInvocation *invocation,
48 gpointer user_data)
49{
Norman James362a80f2015-09-14 14:04:39 -050050 watchdog_set_watchdog(wd,1);
Norman James9e6acf92015-09-08 07:00:04 -050051 guint poll_interval = watchdog_get_poll_interval(wd);
Adriana Kobylak2cb27752015-10-19 16:23:14 -050052 g_print("Starting watchdog with poll interval: %d\n", poll_interval);
Adriana Kobylakdaea21d2015-10-22 12:21:56 -050053 watchdogid = g_timeout_add(poll_interval, poll_watchdog, user_data);
Norman James9e6acf92015-09-08 07:00:04 -050054 watchdog_complete_start(wd,invocation);
55 return TRUE;
56}
57
58static gboolean
59on_poke (Watchdog *wd,
60 GDBusMethodInvocation *invocation,
61 gpointer user_data)
62{
63 watchdog_set_watchdog(wd,1);
64 watchdog_complete_poke(wd,invocation);
65 return TRUE;
66}
67
Adriana Kobylakdaea21d2015-10-22 12:21:56 -050068static gboolean
69on_stop (Watchdog *wd,
70 GDBusMethodInvocation *invocation,
71 gpointer user_data)
72{
73 g_print("Stopping watchdog\n");
Norman James9e6acf92015-09-08 07:00:04 -050074
Adriana Kobylakdaea21d2015-10-22 12:21:56 -050075 if (watchdogid)
76 {
77 g_source_remove(watchdogid);
78 watchdogid = 0;
79 }
80
81 watchdog_complete_stop(wd,invocation);
82 return TRUE;
83}
Norman James9e6acf92015-09-08 07:00:04 -050084
85static void
86on_bus_acquired (GDBusConnection *connection,
87 const gchar *name,
88 gpointer user_data)
89{
Norman James362a80f2015-09-14 14:04:39 -050090 // g_print ("Acquired a message bus connection: %s\n",name);
Norman James9e6acf92015-09-08 07:00:04 -050091
92 cmdline *cmd = user_data;
93 if (cmd->argc < 2)
94 {
95 g_print("No objects created. Put object name(s) on command line\n");
96 return;
97 }
98 manager = g_dbus_object_manager_server_new (dbus_object_path);
99 int i=0;
100 for (i=1;i<cmd->argc;i++)
101 {
102 gchar *s;
103 s = g_strdup_printf ("%s/%s",dbus_object_path,cmd->argv[i]);
104 ObjectSkeleton *object = object_skeleton_new (s);
105 g_free (s);
106
107 Watchdog *wd = watchdog_skeleton_new ();
108 object_skeleton_set_watchdog (object, wd);
109 g_object_unref (wd);
110
111 // set properties
112 watchdog_set_watchdog(wd,1);
113
114 //define method callbacks here
115 g_signal_connect (wd,
116 "handle-start",
117 G_CALLBACK (on_start),
118 object); /* user_data */
119
120 g_signal_connect (wd,
121 "handle-poke",
122 G_CALLBACK (on_poke),
123 object); /* user_data */
124
Adriana Kobylak2cb27752015-10-19 16:23:14 -0500125 g_signal_connect (wd,
Adriana Kobylakdaea21d2015-10-22 12:21:56 -0500126 "handle-stop",
127 G_CALLBACK (on_stop),
128 object); /* user_data */
129
130 g_signal_connect (wd,
Adriana Kobylak2cb27752015-10-19 16:23:14 -0500131 "handle-set",
132 G_CALLBACK (set_poll_interval),
133 object); /* user_data */
Norman James9e6acf92015-09-08 07:00:04 -0500134
135 /* Export the object (@manager takes its own reference to @object) */
136 g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));
137 g_object_unref (object);
138 }
139
140 /* Export all objects */
141 g_dbus_object_manager_server_set_connection (manager, connection);
142}
143
144static void
145on_name_acquired (GDBusConnection *connection,
146 const gchar *name,
147 gpointer user_data)
148{
Norman James362a80f2015-09-14 14:04:39 -0500149 //g_print ("Acquired the name %s\n", name);
Norman James9e6acf92015-09-08 07:00:04 -0500150}
151
152static void
153on_name_lost (GDBusConnection *connection,
154 const gchar *name,
155 gpointer user_data)
156{
Norman James362a80f2015-09-14 14:04:39 -0500157 //g_print ("Lost the name %s\n", name);
Norman James9e6acf92015-09-08 07:00:04 -0500158}
159
160
161gint
162main (gint argc, gchar *argv[])
163{
164 GMainLoop *loop;
165 cmdline cmd;
166 cmd.argc = argc;
167 cmd.argv = argv;
168 guint id;
169 loop = g_main_loop_new (NULL, FALSE);
170
Norman James5e792e32015-10-07 17:36:17 -0500171 id = g_bus_own_name (DBUS_TYPE,
Norman James9e6acf92015-09-08 07:00:04 -0500172 dbus_name,
173 G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
174 G_BUS_NAME_OWNER_FLAGS_REPLACE,
175 on_bus_acquired,
176 on_name_acquired,
177 on_name_lost,
178 &cmd,
179 NULL);
180
181 g_main_loop_run (loop);
182
183 g_bus_unown_name (id);
184 g_main_loop_unref (loop);
185 return 0;
186}