#include #include #include #include #include #include #include #include static const char *v_STRING; static int send_ping(void *bus_ptr) { DBusConnection *bus = bus_ptr; DBusMessage *message; struct timespec tx_time; struct timespec done_time; message = dbus_message_new_signal("/de/linutronix/Ping", "de.linutronix.Ping", "Ping"); /* Append the string to the signal */ dbus_message_append_args(message, DBUS_TYPE_STRING, &v_STRING, DBUS_TYPE_INVALID); clock_gettime(CLOCK_MONOTONIC, &tx_time); /* Send the signal */ dbus_connection_send(bus, message, NULL); clock_gettime(CLOCK_MONOTONIC, &done_time); g_print("%ld.%06ld: ping sent: %d bytes (%ldus)\n", tx_time.tv_sec, tx_time.tv_nsec / 1000, strlen(v_STRING) + 1, ((done_time.tv_sec - tx_time.tv_sec) * 1000000) + (done_time.tv_nsec / 1000) - (tx_time.tv_nsec / 1000)); /* Free the signal now we have finished with it */ dbus_message_unref(message); /* Return TRUE to tell the event loop we want to be called again */ return TRUE; } int main(int argc, char *argv[]) { GMainLoop *loop; DBusConnection *bus; DBusError error; if (argc > 1) { int val = atoi(argv[1]); char *s; if (val < 1) val = 1; s = malloc(val); memset(s, '#', val); s[val - 1] = 0; v_STRING = s; } else { v_STRING = "default message"; } /* Create a new event loop to run in */ loop = g_main_loop_new(NULL, FALSE); /* Get a connection to the session bus */ dbus_error_init(&error); bus = dbus_bus_get(DBUS_BUS_SESSION, &error); if (!bus) { g_warning("Failed to connect to the D-BUS daemon: %s", error.message); dbus_error_free(&error); return 1; } /* Set up this connection to work in a GLib event loop */ dbus_connection_setup_with_g_main(bus, NULL); /* Every second call send_ping() with the bus as an argument */ g_timeout_add(1000, send_ping, bus); /* Start the event loop */ g_main_loop_run(loop); return 0; }