1dbecdeabb20e0ce11121819c63373f0afba57c58Marcus Brinkmann#include <config.h> 25e359834f28b0580e7b79a057614d4e3592709acColin Walters#include "../test-utils.h" 35e359834f28b0580e7b79a057614d4e3592709acColin Walters 45e359834f28b0580e7b79a057614d4e3592709acColin Waltersstatic void 55e359834f28b0580e7b79a057614d4e3592709acColin Waltersdie (const char *message, ...) 65e359834f28b0580e7b79a057614d4e3592709acColin Walters{ 75e359834f28b0580e7b79a057614d4e3592709acColin Walters va_list args; 85e359834f28b0580e7b79a057614d4e3592709acColin Walters va_start (args, message); 95e359834f28b0580e7b79a057614d4e3592709acColin Walters vfprintf (stderr, message, args); 105e359834f28b0580e7b79a057614d4e3592709acColin Walters va_end (args); 115e359834f28b0580e7b79a057614d4e3592709acColin Walters exit (1); 125e359834f28b0580e7b79a057614d4e3592709acColin Walters} 135e359834f28b0580e7b79a057614d4e3592709acColin Walters 145e359834f28b0580e7b79a057614d4e3592709acColin Walterstypedef struct TestServiceData TestServiceData; 155e359834f28b0580e7b79a057614d4e3592709acColin Walters 165e359834f28b0580e7b79a057614d4e3592709acColin Waltersstruct TestServiceData 175e359834f28b0580e7b79a057614d4e3592709acColin Walters{ 185e359834f28b0580e7b79a057614d4e3592709acColin Walters DBusLoop *loop; 195e359834f28b0580e7b79a057614d4e3592709acColin Walters char *private_addr; 205e359834f28b0580e7b79a057614d4e3592709acColin Walters}; 215e359834f28b0580e7b79a057614d4e3592709acColin Walters 225e359834f28b0580e7b79a057614d4e3592709acColin Waltersstatic void 235e359834f28b0580e7b79a057614d4e3592709acColin Waltersnew_connection_callback (DBusServer *server, 245e359834f28b0580e7b79a057614d4e3592709acColin Walters DBusConnection *new_connection, 255e359834f28b0580e7b79a057614d4e3592709acColin Walters void *data) 265e359834f28b0580e7b79a057614d4e3592709acColin Walters{ 275e359834f28b0580e7b79a057614d4e3592709acColin Walters TestServiceData *testdata = data; 285e359834f28b0580e7b79a057614d4e3592709acColin Walters 295e359834f28b0580e7b79a057614d4e3592709acColin Walters if (!test_connection_setup (testdata->loop, new_connection)) 305e359834f28b0580e7b79a057614d4e3592709acColin Walters dbus_connection_close (new_connection); 315e359834f28b0580e7b79a057614d4e3592709acColin Walters} 325e359834f28b0580e7b79a057614d4e3592709acColin Walters 335e359834f28b0580e7b79a057614d4e3592709acColin Waltersstatic DBusHandlerResult 345e359834f28b0580e7b79a057614d4e3592709acColin Waltersfilter_session_message (DBusConnection *connection, 355e359834f28b0580e7b79a057614d4e3592709acColin Walters DBusMessage *message, 365e359834f28b0580e7b79a057614d4e3592709acColin Walters void *user_data) 375e359834f28b0580e7b79a057614d4e3592709acColin Walters{ 385e359834f28b0580e7b79a057614d4e3592709acColin Walters TestServiceData *testdata = user_data; 395e359834f28b0580e7b79a057614d4e3592709acColin Walters 405e359834f28b0580e7b79a057614d4e3592709acColin Walters if (dbus_message_is_method_call (message, 414cbc30465e4fba8026240945cac7a651fda5dca3Scott James Remnant "org.freedesktop.DBus.TestSuite.PrivServer", 425e359834f28b0580e7b79a057614d4e3592709acColin Walters "GetPrivateAddress")) 435e359834f28b0580e7b79a057614d4e3592709acColin Walters { 445e359834f28b0580e7b79a057614d4e3592709acColin Walters DBusMessage *reply; 455e359834f28b0580e7b79a057614d4e3592709acColin Walters reply = dbus_message_new_method_return (message); 465e359834f28b0580e7b79a057614d4e3592709acColin Walters dbus_message_append_args (reply, DBUS_TYPE_STRING, 475e359834f28b0580e7b79a057614d4e3592709acColin Walters &(testdata->private_addr), DBUS_TYPE_INVALID); 485e359834f28b0580e7b79a057614d4e3592709acColin Walters dbus_connection_send (connection, reply, NULL); 495e359834f28b0580e7b79a057614d4e3592709acColin Walters dbus_message_unref (reply); 505e359834f28b0580e7b79a057614d4e3592709acColin Walters return DBUS_HANDLER_RESULT_HANDLED; 515e359834f28b0580e7b79a057614d4e3592709acColin Walters } 525e359834f28b0580e7b79a057614d4e3592709acColin Walters else if (dbus_message_is_method_call (message, 534cbc30465e4fba8026240945cac7a651fda5dca3Scott James Remnant "org.freedesktop.DBus.TestSuite.PrivServer", 545e359834f28b0580e7b79a057614d4e3592709acColin Walters "Quit")) 555e359834f28b0580e7b79a057614d4e3592709acColin Walters { 565e359834f28b0580e7b79a057614d4e3592709acColin Walters fprintf (stderr, "server exiting loop\n"); 575e359834f28b0580e7b79a057614d4e3592709acColin Walters _dbus_loop_quit (testdata->loop); 585e359834f28b0580e7b79a057614d4e3592709acColin Walters return DBUS_HANDLER_RESULT_HANDLED; 595e359834f28b0580e7b79a057614d4e3592709acColin Walters } 605e359834f28b0580e7b79a057614d4e3592709acColin Walters return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; 615e359834f28b0580e7b79a057614d4e3592709acColin Walters} 625e359834f28b0580e7b79a057614d4e3592709acColin Walters 635e359834f28b0580e7b79a057614d4e3592709acColin Waltersint 645e359834f28b0580e7b79a057614d4e3592709acColin Waltersmain (int argc, char *argv[]) 655e359834f28b0580e7b79a057614d4e3592709acColin Walters{ 665e359834f28b0580e7b79a057614d4e3592709acColin Walters DBusServer *server; 675e359834f28b0580e7b79a057614d4e3592709acColin Walters DBusError error; 685e359834f28b0580e7b79a057614d4e3592709acColin Walters DBusLoop *loop; 695e359834f28b0580e7b79a057614d4e3592709acColin Walters DBusConnection *session; 705e359834f28b0580e7b79a057614d4e3592709acColin Walters TestServiceData *testdata; 715e359834f28b0580e7b79a057614d4e3592709acColin Walters 725e359834f28b0580e7b79a057614d4e3592709acColin Walters dbus_error_init (&error); 735e359834f28b0580e7b79a057614d4e3592709acColin Walters 745e359834f28b0580e7b79a057614d4e3592709acColin Walters loop = _dbus_loop_new (); 755e359834f28b0580e7b79a057614d4e3592709acColin Walters 765e359834f28b0580e7b79a057614d4e3592709acColin Walters testdata = dbus_new (TestServiceData, 1); 775e359834f28b0580e7b79a057614d4e3592709acColin Walters testdata->loop = loop; 785e359834f28b0580e7b79a057614d4e3592709acColin Walters 795e359834f28b0580e7b79a057614d4e3592709acColin Walters session = dbus_bus_get (DBUS_BUS_SESSION, &error); 805e359834f28b0580e7b79a057614d4e3592709acColin Walters if (!session) 815e359834f28b0580e7b79a057614d4e3592709acColin Walters die ("couldn't access session bus"); 825e359834f28b0580e7b79a057614d4e3592709acColin Walters 835e359834f28b0580e7b79a057614d4e3592709acColin Walters test_connection_setup (loop, session); 845e359834f28b0580e7b79a057614d4e3592709acColin Walters 854cbc30465e4fba8026240945cac7a651fda5dca3Scott James Remnant dbus_bus_request_name (session, "org.freedesktop.DBus.TestSuite.PrivServer", 0, &error); 865e359834f28b0580e7b79a057614d4e3592709acColin Walters if (dbus_error_is_set (&error)) 875e359834f28b0580e7b79a057614d4e3592709acColin Walters die ("couldn't request name: %s", error.message); 885e359834f28b0580e7b79a057614d4e3592709acColin Walters 895e359834f28b0580e7b79a057614d4e3592709acColin Walters if (!dbus_connection_add_filter (session, filter_session_message, testdata, NULL)) 905e359834f28b0580e7b79a057614d4e3592709acColin Walters die ("couldn't add filter"); 915e359834f28b0580e7b79a057614d4e3592709acColin Walters 92ec18f1fc89f28ef3be945c567916d04856f631b8Ralf Habacker#ifdef DBUS_CMAKE 93ec18f1fc89f28ef3be945c567916d04856f631b8Ralf Habacker server = dbus_server_listen (TEST_LISTEN, &error); 94ec18f1fc89f28ef3be945c567916d04856f631b8Ralf Habacker#else 955e359834f28b0580e7b79a057614d4e3592709acColin Walters server = dbus_server_listen ("unix:tmpdir=/tmp", &error); 96ec18f1fc89f28ef3be945c567916d04856f631b8Ralf Habacker#endif 975e359834f28b0580e7b79a057614d4e3592709acColin Walters if (!server) 985e359834f28b0580e7b79a057614d4e3592709acColin Walters die (error.message); 995e359834f28b0580e7b79a057614d4e3592709acColin Walters testdata->private_addr = dbus_server_get_address (server); 1005e359834f28b0580e7b79a057614d4e3592709acColin Walters printf ("test server listening on %s\n", testdata->private_addr); 1015e359834f28b0580e7b79a057614d4e3592709acColin Walters 1025e359834f28b0580e7b79a057614d4e3592709acColin Walters dbus_server_set_new_connection_function (server, new_connection_callback, 1035e359834f28b0580e7b79a057614d4e3592709acColin Walters testdata, NULL); 1045e359834f28b0580e7b79a057614d4e3592709acColin Walters 1055e359834f28b0580e7b79a057614d4e3592709acColin Walters if (!test_server_setup (loop, server)) 1065e359834f28b0580e7b79a057614d4e3592709acColin Walters die ("server setup failed"); 1075e359834f28b0580e7b79a057614d4e3592709acColin Walters 1085e359834f28b0580e7b79a057614d4e3592709acColin Walters fprintf (stderr, "server running mainloop\n"); 1095e359834f28b0580e7b79a057614d4e3592709acColin Walters _dbus_loop_run (loop); 1105e359834f28b0580e7b79a057614d4e3592709acColin Walters fprintf (stderr, "server mainloop quit\n"); 1115e359834f28b0580e7b79a057614d4e3592709acColin Walters 1125e359834f28b0580e7b79a057614d4e3592709acColin Walters test_server_shutdown (loop, server); 1135e359834f28b0580e7b79a057614d4e3592709acColin Walters 1145e359834f28b0580e7b79a057614d4e3592709acColin Walters test_connection_shutdown (loop, session); 1155e359834f28b0580e7b79a057614d4e3592709acColin Walters 1165e359834f28b0580e7b79a057614d4e3592709acColin Walters dbus_connection_unref (session); 1175e359834f28b0580e7b79a057614d4e3592709acColin Walters 1185e359834f28b0580e7b79a057614d4e3592709acColin Walters _dbus_loop_unref (loop); 1195e359834f28b0580e7b79a057614d4e3592709acColin Walters 1205e359834f28b0580e7b79a057614d4e3592709acColin Walters dbus_free (testdata); 1215e359834f28b0580e7b79a057614d4e3592709acColin Walters 1225e359834f28b0580e7b79a057614d4e3592709acColin Walters return 0; 1235e359834f28b0580e7b79a057614d4e3592709acColin Walters} 124