blob: 2e0ef157615db514c7e6103af0f249aa0e689a4d [file] [log] [blame]
Brad Bishop77390492016-04-13 10:47:19 -04001#include "interfaces/openbmc_intf.h"
2#include "openbmc.h"
3#include "object_mapper.h"
4
5/* ------------------------------------------------------------------------- */
6
7static const gchar* dbus_object_path = "/org/openbmc/watchdog";
8static const gchar* instance_name = "host0";
9static const gchar* dbus_name = "org.openbmc.watchdog.Host";
10
11static GDBusObjectManagerServer *manager = NULL;
12static guint watchdogid = 0;
13
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 {
24 //watchdog error, emit error and stop watchdog
25 watchdogid = 0;
26 watchdog_emit_watchdog_error(watchdog);
27 return FALSE;
28 }
29
30 //reset watchdog
31 watchdog_set_watchdog(watchdog,0);
32 return TRUE;
33}
34
35static gboolean
36remove_watchdog(void)
37{
38 if(watchdogid)
39 {
40 g_source_remove(watchdogid);
41 watchdogid = 0;
42 }
Brad Bishop0c82c602016-04-13 13:36:49 -040043 return TRUE;
Brad Bishop77390492016-04-13 10:47:19 -040044}
45
46static gboolean
47set_poll_interval(Watchdog *wd,
48 GDBusMethodInvocation *invocation,
49 guint interval,
50 gpointer user_data)
51{
52 g_print("Setting watchdog poll interval to: %d\n", interval);
53 watchdog_set_poll_interval(wd, interval);
54 watchdog_complete_set(wd,invocation);
Brad Bishop0c82c602016-04-13 13:36:49 -040055 return TRUE;
Brad Bishop77390492016-04-13 10:47:19 -040056}
57
58static gboolean
59on_start(Watchdog *wd,
60 GDBusMethodInvocation *invocation,
61 gpointer user_data)
62{
63 remove_watchdog();
64 watchdog_set_watchdog(wd,0);
65 guint poll_interval = watchdog_get_poll_interval(wd);
66 g_print("Starting watchdog with poll interval: %d\n", poll_interval);
67 watchdogid = g_timeout_add(poll_interval, poll_watchdog, user_data);
68 watchdog_complete_start(wd,invocation);
69 return TRUE;
70}
71
72static gboolean
73on_poke(Watchdog *wd,
74 GDBusMethodInvocation *invocation,
75 gpointer user_data)
76{
77 watchdog_set_watchdog(wd,1);
78 watchdog_complete_poke(wd,invocation);
79 return TRUE;
80}
81
82static gboolean
83on_stop(Watchdog *wd,
84 GDBusMethodInvocation *invocation,
85 gpointer user_data)
86{
87 g_print("Stopping watchdog\n");
88 remove_watchdog();
89 watchdog_complete_stop(wd,invocation);
90 return TRUE;
91}
92
93static void
94on_bus_acquired(GDBusConnection *connection,
95 const gchar *name,
96 gpointer user_data)
97{
Brad Bishop77390492016-04-13 10:47:19 -040098 manager = g_dbus_object_manager_server_new(dbus_object_path);
99 gchar *s;
100 s = g_strdup_printf("%s/%s",dbus_object_path,instance_name);
101 ObjectSkeleton *object = object_skeleton_new(s);
102 g_free(s);
103
104 Watchdog *wd = watchdog_skeleton_new();
105 object_skeleton_set_watchdog(object, wd);
106 g_object_unref(wd);
107
108 ObjectMapper* mapper = object_mapper_skeleton_new();
109 object_skeleton_set_object_mapper(object, mapper);
110 g_object_unref(mapper);
111
112 // set properties
113 watchdog_set_watchdog(wd,1);
114
115 //define method callbacks here
116 g_signal_connect(wd,
117 "handle-start",
118 G_CALLBACK(on_start),
119 object); /* user_data */
120
121 g_signal_connect(wd,
122 "handle-poke",
123 G_CALLBACK(on_poke),
124 object); /* user_data */
125
126 g_signal_connect(wd,
127 "handle-stop",
128 G_CALLBACK(on_stop),
129 object); /* user_data */
130
131 g_signal_connect(wd,
132 "handle-set",
133 G_CALLBACK(set_poll_interval),
134 object); /* user_data */
135
136 /* Export the object (@manager takes its own reference to @object) */
137 g_dbus_object_manager_server_export(manager, G_DBUS_OBJECT_SKELETON(object));
138 g_object_unref(object);
139
140 /* Export all objects */
141 g_dbus_object_manager_server_set_connection(manager, connection);
142 emit_object_added((GDBusObjectManager*)manager);
143}
144
145static void
146on_name_acquired(GDBusConnection *connection,
147 const gchar *name,
148 gpointer user_data)
149{
150 //g_print ("Acquired the name %s\n", name);
151}
152
153static void
154on_name_lost(GDBusConnection *connection,
155 const gchar *name,
156 gpointer user_data)
157{
158 //g_print ("Lost the name %s\n", name);
159}
160
161
162gint
163main(gint argc, gchar *argv[])
164{
165 GMainLoop *loop;
166 cmdline cmd;
167 cmd.argc = argc;
168 cmd.argv = argv;
169 guint id;
170 loop = g_main_loop_new(NULL, FALSE);
171
172 id = g_bus_own_name(DBUS_TYPE,
173 dbus_name,
174 G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
175 G_BUS_NAME_OWNER_FLAGS_REPLACE,
176 on_bus_acquired,
177 on_name_acquired,
178 on_name_lost,
179 &cmd,
180 NULL);
181
182 g_main_loop_run(loop);
183
184 g_bus_unown_name(id);
185 g_main_loop_unref(loop);
186 return 0;
187}