blob: a4651eaa73ed09f81b1872e3eafa2c7f2bbe25b6 [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"
Norman Jamescfc2b442015-10-31 17:31:46 -05003#include "object_mapper.h"
Norman James9e6acf92015-09-08 07:00:04 -05004
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);
Norman Jamescfc2b442015-10-31 17:31:46 -0500101
102 ObjectMapper* mapper = object_mapper_skeleton_new ();
103 object_skeleton_set_object_mapper (object, mapper);
104 g_object_unref (mapper);
Norman James9e6acf92015-09-08 07:00:04 -0500105
106 // set properties
107 watchdog_set_watchdog(wd,1);
108
109 //define method callbacks here
110 g_signal_connect (wd,
111 "handle-start",
112 G_CALLBACK (on_start),
113 object); /* user_data */
114
115 g_signal_connect (wd,
116 "handle-poke",
117 G_CALLBACK (on_poke),
118 object); /* user_data */
119
Adriana Kobylak2cb27752015-10-19 16:23:14 -0500120 g_signal_connect (wd,
Adriana Kobylakdaea21d2015-10-22 12:21:56 -0500121 "handle-stop",
122 G_CALLBACK (on_stop),
123 object); /* user_data */
124
125 g_signal_connect (wd,
Adriana Kobylak2cb27752015-10-19 16:23:14 -0500126 "handle-set",
127 G_CALLBACK (set_poll_interval),
128 object); /* user_data */
Norman James9e6acf92015-09-08 07:00:04 -0500129
130 /* Export the object (@manager takes its own reference to @object) */
131 g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));
132 g_object_unref (object);
Norman James9e6acf92015-09-08 07:00:04 -0500133
134 /* Export all objects */
135 g_dbus_object_manager_server_set_connection (manager, connection);
Norman Jamescfc2b442015-10-31 17:31:46 -0500136 emit_object_added((GDBusObjectManager*)manager);
Norman James9e6acf92015-09-08 07:00:04 -0500137}
138
139static void
140on_name_acquired (GDBusConnection *connection,
141 const gchar *name,
142 gpointer user_data)
143{
Norman James362a80f2015-09-14 14:04:39 -0500144 //g_print ("Acquired the name %s\n", name);
Norman James9e6acf92015-09-08 07:00:04 -0500145}
146
147static void
148on_name_lost (GDBusConnection *connection,
149 const gchar *name,
150 gpointer user_data)
151{
Norman James362a80f2015-09-14 14:04:39 -0500152 //g_print ("Lost the name %s\n", name);
Norman James9e6acf92015-09-08 07:00:04 -0500153}
154
155
156gint
157main (gint argc, gchar *argv[])
158{
159 GMainLoop *loop;
160 cmdline cmd;
161 cmd.argc = argc;
162 cmd.argv = argv;
163 guint id;
164 loop = g_main_loop_new (NULL, FALSE);
165
Norman James5e792e32015-10-07 17:36:17 -0500166 id = g_bus_own_name (DBUS_TYPE,
Norman James9e6acf92015-09-08 07:00:04 -0500167 dbus_name,
168 G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
169 G_BUS_NAME_OWNER_FLAGS_REPLACE,
170 on_bus_acquired,
171 on_name_acquired,
172 on_name_lost,
173 &cmd,
174 NULL);
175
176 g_main_loop_run (loop);
177
178 g_bus_unown_name (id);
179 g_main_loop_unref (loop);
180 return 0;
181}