blob: 6396658ec2aca01c8786ebf52ca670e221e241a2 [file] [log] [blame]
Norman James9e6acf92015-09-08 07:00:04 -05001#include "interfaces/watchdog.h"
2#include "openbmc.h"
3
4
5/* ---------------------------------------------------------------------------------------------------- */
6
7static const gchar* dbus_object_path = "/org/openbmc/watchdog/HostWatchdog";
8static const gchar* dbus_name = "org.openbmc.watchdog.HostWatchdog";
9
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 {
23 watchdog_emit_watchdog_error(watchdog);
24 }
25
26 //reset watchdog
27 watchdog_set_watchdog(watchdog,0);
28 return TRUE;
29}
30
31static gboolean
32on_start (Watchdog *wd,
33 GDBusMethodInvocation *invocation,
34 gpointer user_data)
35{
36 guint poll_interval = watchdog_get_poll_interval(wd);
37 g_timeout_add(poll_interval, poll_watchdog, user_data);
38 watchdog_complete_start(wd,invocation);
39 return TRUE;
40}
41
42static gboolean
43on_poke (Watchdog *wd,
44 GDBusMethodInvocation *invocation,
45 gpointer user_data)
46{
47 watchdog_set_watchdog(wd,1);
48 watchdog_complete_poke(wd,invocation);
49 return TRUE;
50}
51
52
53
54static void
55on_bus_acquired (GDBusConnection *connection,
56 const gchar *name,
57 gpointer user_data)
58{
59 g_print ("Acquired a message bus connection: %s\n",name);
60
61 cmdline *cmd = user_data;
62 if (cmd->argc < 2)
63 {
64 g_print("No objects created. Put object name(s) on command line\n");
65 return;
66 }
67 manager = g_dbus_object_manager_server_new (dbus_object_path);
68 int i=0;
69 for (i=1;i<cmd->argc;i++)
70 {
71 gchar *s;
72 s = g_strdup_printf ("%s/%s",dbus_object_path,cmd->argv[i]);
73 ObjectSkeleton *object = object_skeleton_new (s);
74 g_free (s);
75
76 Watchdog *wd = watchdog_skeleton_new ();
77 object_skeleton_set_watchdog (object, wd);
78 g_object_unref (wd);
79
80 // set properties
81 watchdog_set_watchdog(wd,1);
82
83 //define method callbacks here
84 g_signal_connect (wd,
85 "handle-start",
86 G_CALLBACK (on_start),
87 object); /* user_data */
88
89 g_signal_connect (wd,
90 "handle-poke",
91 G_CALLBACK (on_poke),
92 object); /* user_data */
93
94
95 /* Export the object (@manager takes its own reference to @object) */
96 g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));
97 g_object_unref (object);
98 }
99
100 /* Export all objects */
101 g_dbus_object_manager_server_set_connection (manager, connection);
102}
103
104static void
105on_name_acquired (GDBusConnection *connection,
106 const gchar *name,
107 gpointer user_data)
108{
109 g_print ("Acquired the name %s\n", name);
110}
111
112static void
113on_name_lost (GDBusConnection *connection,
114 const gchar *name,
115 gpointer user_data)
116{
117 g_print ("Lost the name %s\n", name);
118}
119
120
121gint
122main (gint argc, gchar *argv[])
123{
124 GMainLoop *loop;
125 cmdline cmd;
126 cmd.argc = argc;
127 cmd.argv = argv;
128 guint id;
129 loop = g_main_loop_new (NULL, FALSE);
130
131 id = g_bus_own_name (G_BUS_TYPE_SESSION,
132 dbus_name,
133 G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
134 G_BUS_NAME_OWNER_FLAGS_REPLACE,
135 on_bus_acquired,
136 on_name_acquired,
137 on_name_lost,
138 &cmd,
139 NULL);
140
141 g_main_loop_run (loop);
142
143 g_bus_unown_name (id);
144 g_main_loop_unref (loop);
145 return 0;
146}