From 1558cd6be30237f852ca1b31c49c42490fb02c21 Mon Sep 17 00:00:00 2001 From: Robert Love Date: Wed, 26 Apr 2006 19:34:03 +0000 Subject: [PATCH] readd? git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1707 4912f4e0-d625-0410-9fb7-b9a5a253dbdc --- test/nm-online.c | 115 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 test/nm-online.c diff --git a/test/nm-online.c b/test/nm-online.c new file mode 100644 index 0000000000..d9787795d3 --- /dev/null +++ b/test/nm-online.c @@ -0,0 +1,115 @@ +/* + * nm-online.c - Are we online? + * + * Return values: + * + * 0 : online + * 1 : offline or not online within given timeout + * 2 : error + * + * Robert Love + */ + +#define DBUS_API_SUBJECT_TO_CHANGE 1 + +#include +#include + +#include +#include +#include +#include +#include + +static DBusHandlerResult dbus_filter (DBusConnection *connection G_GNUC_UNUSED, + DBusMessage *message, + void *user_data G_GNUC_UNUSED) +{ + if (!dbus_message_is_signal (message, NM_DBUS_INTERFACE, + "DeviceNowActive")) + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + exit (0); +} + +static gboolean check_online (DBusConnection *connection) +{ + DBusMessage *message, *reply; + DBusError error; + dbus_uint32_t state; + + message = dbus_message_new_method_call (NM_DBUS_SERVICE, NM_DBUS_PATH, + NM_DBUS_INTERFACE, "state"); + if (!message) + exit (2); + + dbus_error_init (&error); + reply = dbus_connection_send_with_reply_and_block (connection, message, + -1, &error); + dbus_message_unref (message); + if (!reply) + exit (2); + + if (!dbus_message_get_args (reply, NULL, DBUS_TYPE_UINT32, &state, + DBUS_TYPE_INVALID)) + exit (2); + + if (state != NM_STATE_CONNECTED) + return FALSE; + + return TRUE; +} + +static gboolean handle_timeout (gpointer data G_GNUC_UNUSED) +{ + exit (1); +} + +int main (int argc, char *argv[]) +{ + DBusConnection *connection; + DBusError error; + GMainLoop *loop; + int timeout = 60; + + if (argc == 2) { + timeout = (int) strtol (argv[1], NULL, 10); + if (timeout < 0 || timeout > 3600) + return 2; + } + + g_type_init (); + + dbus_error_init (&error); + connection = dbus_bus_get (DBUS_BUS_SYSTEM, &error); + if (connection == NULL) { + dbus_error_free (&error); + return 2; + } + + dbus_connection_setup_with_g_main (connection, NULL); + + if (!dbus_connection_add_filter (connection, dbus_filter, NULL, NULL)) + return 2; + + dbus_bus_add_match (connection, + "type='signal'," + "interface='" NM_DBUS_INTERFACE "'," + "sender='" NM_DBUS_SERVICE "'," + "path='" NM_DBUS_PATH "'", &error); + if (dbus_error_is_set (&error)) { + dbus_error_free (&error); + return 2; + } + + /* Check after we setup the filter to ensure that we cannot race. */ + if (check_online (connection)) + return 0; + + if (timeout) + g_timeout_add (timeout * 1000, handle_timeout, NULL); + + loop = g_main_loop_new (NULL, FALSE); + g_main_loop_run (loop); + + return 2; +}