/* gcc -std=gnu99 -ggdb -Wall -pedantic -o trigger-bug-1235649 trigger-bug-1235649.c `pkg-config --cflags --libs libnih libnih-dbus libupstart dbus-1` */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "upstart.h" const char *event = "wibble"; NihDBusProxy * make_proxy (void) { NihDBusProxy *upstart = NULL; DBusConnection *conn = NULL; char *upstart_session; DBusError dbus_error; upstart_session = getenv ("UPSTART_SESSION"); if (! upstart_session || ! *upstart_session) { nih_fatal ("Can only run within an Upstart session environment"); exit (EXIT_FAILURE); } dbus_error_init (&dbus_error); #if 1 /* XXX: incorrect */ conn = dbus_connection_open (upstart_session, NULL); #else /* XXX: correct */ conn = nih_dbus_connect (upstart_session, NULL); #endif if (! conn) { nih_fatal ("failed to connect to upstart: %s", dbus_error.message); dbus_error_free (&dbus_error); exit (EXIT_FAILURE); } upstart = nih_dbus_proxy_new (NULL, /* parent */ conn, /* connection */ NULL, /* name */ DBUS_PATH_UPSTART, /* path */ NULL, /* lost_handler */ NULL /* data */); nih_assert (upstart); nih_assert (upstart->connection); /* Drop our ref since nih_dbus_proxy_new() takes a ref itself */ dbus_connection_unref (conn); return upstart; } void send_event (NihDBusProxy *upstart) { int ret; nih_assert (upstart); ret = upstart_emit_event_sync (NULL, upstart, event, NULL, 0); nih_message ("ret=%d", ret); } void foo (void) { int ret; NihDBusProxy *upstart = NULL; upstart = make_proxy (); nih_message ("sending events"); send_event (upstart); send_event (upstart); send_event (upstart); ret = nih_main_loop (); nih_fatal ("main loop exited with ret %d", ret); nih_free (upstart); } int main(int argc, char *argv[]) { foo (); exit (EXIT_SUCCESS); }