blob: 13208e28c74bf2c7cabd1969ed21a894dbaf5038 [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";
Norman James8fee6f22015-10-28 12:48:43 -05008static const gchar* instance_name = "host0";
Norman James362a80f2015-09-14 14:04:39 -05009static const gchar* dbus_name = "org.openbmc.watchdog.Host";
Norman James9e6acf92015-09-08 07:00:04 -050010
11static GDBusObjectManagerServer *manager = NULL;
Adriana Kobylakdaea21d2015-10-22 12:21:56 -050012static guint watchdogid = 0;
Norman James9e6acf92015-09-08 07:00:04 -050013
14static gboolean
15poll_watchdog(gpointer user_data)
16{
17 Watchdog *watchdog = object_get_watchdog((Object*)user_data);
18
19 guint count = watchdog_get_watchdog(watchdog);
20 g_print("Polling watchdog: %d\n",count);
21
22 if (count == 0)
23 {
Norman James362a80f2015-09-14 14:04:39 -050024 //watchdog error, emit error and stop watchdog
Adriana Kobylakdaea21d2015-10-22 12:21:56 -050025 watchdogid = 0;
Norman James9e6acf92015-09-08 07:00:04 -050026 watchdog_emit_watchdog_error(watchdog);
Norman James362a80f2015-09-14 14:04:39 -050027 return FALSE;
Norman James9e6acf92015-09-08 07:00:04 -050028 }
29
30 //reset watchdog
31 watchdog_set_watchdog(watchdog,0);
32 return TRUE;
33}
34
35static gboolean
Adriana Kobylak2cb27752015-10-19 16:23:14 -050036set_poll_interval (Watchdog *wd,
37 GDBusMethodInvocation *invocation,
38 guint interval,
39 gpointer user_data)
40{
41 g_print("Setting watchdog poll interval to: %d\n", interval);
42 watchdog_set_poll_interval(wd, interval);
43 watchdog_complete_set(wd,invocation);
44}
45
46static gboolean
Norman James9e6acf92015-09-08 07:00:04 -050047on_start (Watchdog *wd,
48 GDBusMethodInvocation *invocation,
49 gpointer user_data)
50{
Norman James362a80f2015-09-14 14:04:39 -050051 watchdog_set_watchdog(wd,1);
Norman James9e6acf92015-09-08 07:00:04 -050052 guint poll_interval = watchdog_get_poll_interval(wd);
Adriana Kobylak2cb27752015-10-19 16:23:14 -050053 g_print("Starting watchdog with poll interval: %d\n", poll_interval);
Adriana Kobylakdaea21d2015-10-22 12:21:56 -050054 watchdogid = g_timeout_add(poll_interval, poll_watchdog, user_data);
Norman James9e6acf92015-09-08 07:00:04 -050055 watchdog_complete_start(wd,invocation);
56 return TRUE;
57}
58
59static gboolean
60on_poke (Watchdog *wd,
61 GDBusMethodInvocation *invocation,
62 gpointer user_data)
63{
64 watchdog_set_watchdog(wd,1);
65 watchdog_complete_poke(wd,invocation);
66 return TRUE;
67}
68
Adriana Kobylakdaea21d2015-10-22 12:21:56 -050069static gboolean
70on_stop (Watchdog *wd,
71 GDBusMethodInvocation *invocation,
72 gpointer user_data)
73{
74 g_print("Stopping watchdog\n");
Norman James9e6acf92015-09-08 07:00:04 -050075
Adriana Kobylakdaea21d2015-10-22 12:21:56 -050076 if (watchdogid)
77 {
78 g_source_remove(watchdogid);
79 watchdogid = 0;
80 }
81
82 watchdog_complete_stop(wd,invocation);
83 return TRUE;
84}
Norman James9e6acf92015-09-08 07:00:04 -050085
86static void
87on_bus_acquired (GDBusConnection *connection,
88 const gchar *name,
89 gpointer user_data)
90{
Norman James9e6acf92015-09-08 07:00:04 -050091 cmdline *cmd = user_data;
Norman James9e6acf92015-09-08 07:00:04 -050092 manager = g_dbus_object_manager_server_new (dbus_object_path);
Norman James9e6acf92015-09-08 07:00:04 -050093 gchar *s;
Norman James8fee6f22015-10-28 12:48:43 -050094 s = g_strdup_printf ("%s/%s",dbus_object_path,instance_name);
Norman James9e6acf92015-09-08 07:00:04 -050095 ObjectSkeleton *object = object_skeleton_new (s);
96 g_free (s);
97
98 Watchdog *wd = watchdog_skeleton_new ();
99 object_skeleton_set_watchdog (object, wd);
100 g_object_unref (wd);
101
102 // set properties
103 watchdog_set_watchdog(wd,1);
104
105 //define method callbacks here
106 g_signal_connect (wd,
107 "handle-start",
108 G_CALLBACK (on_start),
109 object); /* user_data */
110
111 g_signal_connect (wd,
112 "handle-poke",
113 G_CALLBACK (on_poke),
114 object); /* user_data */
115
Adriana Kobylak2cb27752015-10-19 16:23:14 -0500116 g_signal_connect (wd,
Adriana Kobylakdaea21d2015-10-22 12:21:56 -0500117 "handle-stop",
118 G_CALLBACK (on_stop),
119 object); /* user_data */
120
121 g_signal_connect (wd,
Adriana Kobylak2cb27752015-10-19 16:23:14 -0500122 "handle-set",
123 G_CALLBACK (set_poll_interval),
124 object); /* user_data */
Norman James9e6acf92015-09-08 07:00:04 -0500125
126 /* Export the object (@manager takes its own reference to @object) */
127 g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));
128 g_object_unref (object);
Norman James9e6acf92015-09-08 07:00:04 -0500129
130 /* Export all objects */
131 g_dbus_object_manager_server_set_connection (manager, connection);
132}
133
134static void
135on_name_acquired (GDBusConnection *connection,
136 const gchar *name,
137 gpointer user_data)
138{
Norman James362a80f2015-09-14 14:04:39 -0500139 //g_print ("Acquired the name %s\n", name);
Norman James9e6acf92015-09-08 07:00:04 -0500140}
141
142static void
143on_name_lost (GDBusConnection *connection,
144 const gchar *name,
145 gpointer user_data)
146{
Norman James362a80f2015-09-14 14:04:39 -0500147 //g_print ("Lost the name %s\n", name);
Norman James9e6acf92015-09-08 07:00:04 -0500148}
149
150
151gint
152main (gint argc, gchar *argv[])
153{
154 GMainLoop *loop;
155 cmdline cmd;
156 cmd.argc = argc;
157 cmd.argv = argv;
158 guint id;
159 loop = g_main_loop_new (NULL, FALSE);
160
Norman James5e792e32015-10-07 17:36:17 -0500161 id = g_bus_own_name (DBUS_TYPE,
Norman James9e6acf92015-09-08 07:00:04 -0500162 dbus_name,
163 G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
164 G_BUS_NAME_OWNER_FLAGS_REPLACE,
165 on_bus_acquired,
166 on_name_acquired,
167 on_name_lost,
168 &cmd,
169 NULL);
170
171 g_main_loop_run (loop);
172
173 g_bus_unown_name (id);
174 g_main_loop_unref (loop);
175 return 0;
176}