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