343
stop_loop (gpointer user_data)
345
g_main_loop_quit ((GMainLoop *)user_data);
346
return G_SOURCE_REMOVE;
350
switch_to_greeter_done_cb (GObject *bus, GAsyncResult *result, gpointer data)
353
GError *error = NULL;
355
r = g_dbus_connection_call_finish (G_DBUS_CONNECTION (bus), result, &error);
357
g_warning ("Failed to switch to greeter: %s\n", error->message);
358
g_clear_error (&error);
362
check_status ("RUNNER SWITCH-TO-GREETER");
366
check_status ("RUNNER SWITCH-TO-GREETER FAILED");
370
switch_to_user_done_cb (GObject *bus, GAsyncResult *result, gpointer data)
373
GError *error = NULL;
374
gchar *username = data, *status_text;
376
r = g_dbus_connection_call_finish (G_DBUS_CONNECTION (bus), result, &error);
378
g_warning ("Failed to switch to user: %s\n", error->message);
379
g_clear_error (&error);
383
status_text = g_strdup_printf ("RUNNER SWITCH-TO-USER USERNAME=%s", username);
387
status_text = g_strdup_printf ("RUNNER SWITCH-TO-USER USERNAME=%s FAILED", username);
388
check_status (status_text);
390
g_free (status_text);
395
switch_to_guest_done_cb (GObject *bus, GAsyncResult *result, gpointer data)
398
GError *error = NULL;
400
r = g_dbus_connection_call_finish (G_DBUS_CONNECTION (bus), result, &error);
402
g_warning ("Failed to switch to guest: %s\n", error->message);
403
g_clear_error (&error);
407
check_status ("RUNNER SWITCH-TO-GUEST");
411
check_status ("RUNNER SWITCH-TO-GUEST FAILED");
323
415
handle_command (const gchar *command)
396
488
g_hash_table_insert (params, param_name, param_value);
399
if (strcmp (name, "WAIT") == 0)
491
if (strcmp (name, "START-DAEMON") == 0)
493
GString *command_line;
494
gchar **lightdm_argv;
496
GError *error = NULL;
498
command_line = g_string_new ("lightdm");
499
if (getenv ("DEBUG"))
500
g_string_append (command_line, " --debug");
501
g_string_append_printf (command_line, " --cache-dir %s/cache", temp_dir);
503
test_runner_command = g_strdup_printf ("PATH=%s LD_PRELOAD=%s LD_LIBRARY_PATH=%s LIGHTDM_TEST_ROOT=%s DBUS_SESSION_BUS_ADDRESS=%s %s\n",
504
g_getenv ("PATH"), g_getenv ("LD_PRELOAD"), g_getenv ("LD_LIBRARY_PATH"), g_getenv ("LIGHTDM_TEST_ROOT"), g_getenv ("DBUS_SESSION_BUS_ADDRESS"),
507
if (!g_shell_parse_argv (command_line->str, NULL, &lightdm_argv, &error))
509
g_warning ("Error parsing command line: %s", error->message);
512
g_clear_error (&error);
514
if (!g_spawn_async (NULL, lightdm_argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_SEARCH_PATH, NULL, NULL, &lightdm_pid, &error))
516
g_warning ("Error launching LightDM: %s", error->message);
519
g_clear_error (&error);
520
lightdm_process = watch_process (lightdm_pid);
522
check_status ("RUNNER DAEMON-START");
524
else if (strcmp (name, "WAIT") == 0)
529
/* Stop status timeout */
531
g_source_remove (status_timeout);
533
/* Use a main loop so that our DBus functions are still responsive */
534
GMainLoop *loop = g_main_loop_new (NULL, FALSE);
535
v = g_hash_table_lookup (params, "DURATION");
536
duration = v ? atoi (v) : 1;
539
g_timeout_add_seconds (duration, stop_loop, loop);
540
g_main_loop_run (loop);
541
g_main_loop_unref (loop);
543
/* Restart status timeout */
544
status_timeout = g_timeout_add (status_timeout_ms, status_timeout_cb, NULL);
546
else if (strcmp (name, "ADD-SEAT") == 0)
551
id = g_hash_table_lookup (params, "ID");
552
seat = add_login1_seat (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL), id, TRUE);
553
v = g_hash_table_lookup (params, "CAN-GRAPHICAL");
555
seat->can_graphical = strcmp (v, "TRUE") == 0;
556
v = g_hash_table_lookup (params, "CAN-MULTI-SESSION");
558
seat->can_multi_session = strcmp (v, "TRUE") == 0;
560
else if (strcmp (name, "UPDATE-SEAT") == 0)
565
id = g_hash_table_lookup (params, "ID");
566
seat = find_login1_seat (id);
570
GVariantBuilder invalidated_properties;
571
GError *error = NULL;
573
g_variant_builder_init (&invalidated_properties, G_VARIANT_TYPE_ARRAY);
575
v = g_hash_table_lookup (params, "CAN-GRAPHICAL");
578
seat->can_graphical = strcmp (v, "TRUE") == 0;
579
g_variant_builder_add (&invalidated_properties, "s", "CanGraphical");
581
v = g_hash_table_lookup (params, "CAN-MULTI-SESSION");
584
seat->can_multi_session = strcmp (v, "TRUE") == 0;
585
g_variant_builder_add (&invalidated_properties, "s", "CanMultiSession");
587
v = g_hash_table_lookup (params, "ACTIVE-SESSION");
590
g_free (seat->active_session);
591
seat->active_session = g_strdup (v);
592
g_variant_builder_add (&invalidated_properties, "s", "ActiveSession");
595
g_dbus_connection_emit_signal (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
598
"org.freedesktop.DBus.Properties",
600
g_variant_new ("(sa{sv}as)", "org.freedesktop.login1.Seat", NULL, &invalidated_properties),
603
g_warning ("Failed to emit PropertiesChanged: %s", error->message);
604
g_clear_error (&error);
607
else if (strcmp (name, "REMOVE-SEAT") == 0)
610
id = g_hash_table_lookup (params, "ID");
611
remove_login1_seat (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL), id);
403
613
else if (strcmp (name, "LIST-SEATS") == 0)
472
682
check_status (status->str);
473
683
g_string_free (status, TRUE);
685
else if (strcmp (name, "SEAT-CAN-SWITCH") == 0)
687
GVariant *result, *value;
690
result = g_dbus_connection_call_sync (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
691
"org.freedesktop.DisplayManager",
692
"/org/freedesktop/DisplayManager/Seat0",
693
"org.freedesktop.DBus.Properties",
695
g_variant_new ("(ss)", "org.freedesktop.DisplayManager.Seat", "CanSwitch"),
696
G_VARIANT_TYPE ("(v)"),
697
G_DBUS_CALL_FLAGS_NONE,
702
g_variant_get (result, "(v)", &value);
703
status = g_strdup_printf ("RUNNER SEAT-CAN-SWITCH CAN-SWITCH=%s", g_variant_get_boolean (value) ? "TRUE" : "FALSE");
704
g_variant_unref (value);
705
g_variant_unref (result);
706
check_status (status);
709
else if (strcmp (name, "SEAT-HAS-GUEST-ACCOUNT") == 0)
711
GVariant *result, *value;
714
result = g_dbus_connection_call_sync (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
715
"org.freedesktop.DisplayManager",
716
"/org/freedesktop/DisplayManager/Seat0",
717
"org.freedesktop.DBus.Properties",
719
g_variant_new ("(ss)", "org.freedesktop.DisplayManager.Seat", "HasGuestAccount"),
720
G_VARIANT_TYPE ("(v)"),
721
G_DBUS_CALL_FLAGS_NONE,
726
g_variant_get (result, "(v)", &value);
727
status = g_strdup_printf ("RUNNER SEAT-HAS-GUEST-ACCOUNT HAS-GUEST-ACCOUNT=%s", g_variant_get_boolean (value) ? "TRUE" : "FALSE");
728
g_variant_unref (value);
729
g_variant_unref (result);
730
check_status (status);
475
733
else if (strcmp (name, "SWITCH-TO-GREETER") == 0)
477
g_dbus_connection_call_sync (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
478
"org.freedesktop.DisplayManager",
479
"/org/freedesktop/DisplayManager/Seat0",
480
"org.freedesktop.DisplayManager.Seat",
482
g_variant_new ("()"),
483
G_VARIANT_TYPE ("()"),
484
G_DBUS_CALL_FLAGS_NONE,
488
check_status ("RUNNER SWITCH-TO-GREETER");
735
g_dbus_connection_call (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
736
"org.freedesktop.DisplayManager",
737
"/org/freedesktop/DisplayManager/Seat0",
738
"org.freedesktop.DisplayManager.Seat",
740
g_variant_new ("()"),
741
G_VARIANT_TYPE ("()"),
742
G_DBUS_CALL_FLAGS_NONE,
745
switch_to_greeter_done_cb,
490
748
else if (strcmp (name, "SWITCH-TO-USER") == 0)
492
gchar *status_text, *username;
750
const gchar *username;
494
752
username = g_hash_table_lookup (params, "USERNAME");
495
g_dbus_connection_call_sync (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
496
"org.freedesktop.DisplayManager",
497
"/org/freedesktop/DisplayManager/Seat0",
498
"org.freedesktop.DisplayManager.Seat",
500
g_variant_new ("(ss)", username, ""),
501
G_VARIANT_TYPE ("()"),
502
G_DBUS_CALL_FLAGS_NONE,
506
status_text = g_strdup_printf ("RUNNER SWITCH-TO-USER USERNAME=%s", username);
507
check_status (status_text);
508
g_free (status_text);
753
g_dbus_connection_call (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
754
"org.freedesktop.DisplayManager",
755
"/org/freedesktop/DisplayManager/Seat0",
756
"org.freedesktop.DisplayManager.Seat",
758
g_variant_new ("(ss)", username, ""),
759
G_VARIANT_TYPE ("()"),
760
G_DBUS_CALL_FLAGS_NONE,
763
switch_to_user_done_cb,
764
g_strdup (username));
510
766
else if (strcmp (name, "SWITCH-TO-GUEST") == 0)
512
g_dbus_connection_call_sync (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
513
"org.freedesktop.DisplayManager",
514
"/org/freedesktop/DisplayManager/Seat0",
515
"org.freedesktop.DisplayManager.Seat",
517
g_variant_new ("(s)", ""),
518
G_VARIANT_TYPE ("()"),
519
G_DBUS_CALL_FLAGS_NONE,
523
check_status ("RUNNER SWITCH-TO-GUEST");
768
g_dbus_connection_call (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
769
"org.freedesktop.DisplayManager",
770
"/org/freedesktop/DisplayManager/Seat0",
771
"org.freedesktop.DisplayManager.Seat",
773
g_variant_new ("(s)", ""),
774
G_VARIANT_TYPE ("()"),
775
G_DBUS_CALL_FLAGS_NONE,
778
switch_to_guest_done_cb,
525
781
else if (strcmp (name, "STOP-DAEMON") == 0)
526
782
stop_process (lightdm_process);
685
942
check_status (status_text);
686
943
g_free (status_text);
945
else if (strcmp (name, "UNLOCK-SESSION") == 0)
947
gchar *status_text, *id;
948
Login1Session *session;
950
id = g_hash_table_lookup (params, "SESSION");
951
session = find_login1_session (id);
954
if (!session->locked)
955
g_warning ("Session %s is not locked", id);
956
session->locked = FALSE;
959
g_warning ("Unknown session %s", id);
961
status_text = g_strdup_printf ("RUNNER UNLOCK-SESSION SESSION=%s", id);
962
check_status (status_text);
963
g_free (status_text);
688
965
/* Forward to external processes */
689
966
else if (g_str_has_prefix (name, "SESSION-") ||
690
967
g_str_has_prefix (name, "GREETER-") ||
691
968
g_str_has_prefix (name, "XSERVER-") ||
969
g_str_has_prefix (name, "XMIR-") ||
970
g_str_has_prefix (name, "XVNC-") ||
692
971
strcmp (name, "UNITY-SYSTEM-COMPOSITOR") == 0)
1204
1491
g_bus_own_name (G_BUS_TYPE_SYSTEM,
1205
1492
"org.freedesktop.ConsoleKit",
1206
1493
G_BUS_NAME_OWNER_FLAGS_NONE,
1207
1495
ck_name_acquired_cb,
1502
handle_login1_seat_call (GDBusConnection *connection,
1503
const gchar *sender,
1504
const gchar *object_path,
1505
const gchar *interface_name,
1506
const gchar *method_name,
1507
GVariant *parameters,
1508
GDBusMethodInvocation *invocation,
1511
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "No such method: %s", method_name);
1515
handle_login1_seat_get_property (GDBusConnection *connection,
1516
const gchar *sender,
1517
const gchar *object_path,
1518
const gchar *interface_name,
1519
const gchar *property_name,
1523
Login1Seat *seat = user_data;
1525
if (strcmp (property_name, "CanGraphical") == 0)
1526
return g_variant_new_boolean (seat->can_graphical);
1527
else if (strcmp (property_name, "CanMultiSession") == 0)
1528
return g_variant_new_boolean (seat->can_multi_session);
1529
else if (strcmp (property_name, "Id") == 0)
1530
return g_variant_new_string (seat->id);
1531
else if (strcmp (property_name, "ActiveSession") == 0)
1533
if (seat->active_session)
1538
path = g_strdup_printf ("/org/freedesktop/login1/session/%s", seat->active_session);
1539
ret = g_variant_new ("(so)", seat->active_session, path);
1552
add_login1_seat (GDBusConnection *connection, const gchar *id, gboolean emit_signal)
1555
GError *error = NULL;
1556
GDBusNodeInfo *login1_seat_info;
1558
const gchar *login1_seat_interface =
1560
" <interface name='org.freedesktop.login1.Seat'>"
1561
" <property name='CanGraphical' type='b' access='read'/>"
1562
" <property name='CanMultiSession' type='b' access='read'/>"
1563
" <property name='ActiveSession' type='(so)' access='read'/>"
1564
" <property name='Id' type='s' access='read'/>"
1567
static const GDBusInterfaceVTable login1_seat_vtable =
1569
handle_login1_seat_call,
1570
handle_login1_seat_get_property,
1573
seat = g_malloc0 (sizeof (Login1Seat));
1574
login1_seats = g_list_append (login1_seats, seat);
1575
seat->id = g_strdup (id);
1576
seat->path = g_strdup_printf ("/org/freedesktop/login1/seat/%s", seat->id);
1577
seat->can_graphical = TRUE;
1578
seat->can_multi_session = TRUE;
1579
seat->active_session = NULL;
1581
login1_seat_info = g_dbus_node_info_new_for_xml (login1_seat_interface, &error);
1583
g_warning ("Failed to parse login1 seat D-Bus interface: %s", error->message);
1584
g_clear_error (&error);
1585
if (!login1_seat_info)
1588
g_dbus_connection_register_object (connection,
1590
login1_seat_info->interfaces[0],
1591
&login1_seat_vtable,
1596
g_warning ("Failed to register login1 seat: %s", error->message);
1597
g_clear_error (&error);
1598
g_dbus_node_info_unref (login1_seat_info);
1602
g_dbus_connection_emit_signal (connection,
1604
"/org/freedesktop/login1",
1605
"org.freedesktop.login1.Manager",
1607
g_variant_new ("(so)", seat->id, seat->path),
1610
g_warning ("Failed to emit SeatNew: %s", error->message);
1611
g_clear_error (&error);
1618
find_login1_seat (const gchar *id)
1623
for (link = login1_seats; link; link = link->next)
1626
if (strcmp (seat->id, id) == 0)
1634
remove_login1_seat (GDBusConnection *connection, const gchar *id)
1637
GError *error = NULL;
1639
seat = find_login1_seat (id);
1643
g_dbus_connection_emit_signal (connection,
1645
"/org/freedesktop/login1",
1646
"org.freedesktop.login1.Manager",
1648
g_variant_new ("(so)", seat->id, seat->path),
1651
g_warning ("Failed to emit SeatNew: %s", error->message);
1652
g_clear_error (&error);
1654
login1_seats = g_list_remove (login1_seats, seat);
1656
g_free (seat->path);
1657
g_free (seat->active_session);
1215
1662
handle_login1_session_call (GDBusConnection *connection,
1216
1663
const gchar *sender,
1217
1664
const gchar *object_path,
1221
1668
GDBusMethodInvocation *invocation,
1222
1669
gpointer user_data)
1224
Login1Session *session = user_data;
1226
if (strcmp (method_name, "Lock") == 0)
1228
if (!session->locked)
1229
check_status ("LOGIN1 LOCK-SESSION");
1230
session->locked = TRUE;
1231
g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
1233
else if (strcmp (method_name, "Unlock") == 0)
1235
if (session->locked)
1236
check_status ("LOGIN1 UNLOCK-SESSION");
1237
session->locked = FALSE;
1238
g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
1241
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "No such method: %s", method_name);
1671
/*Login1Session *session = user_data;*/
1672
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "No such method: %s", method_name);
1244
1675
static Login1Session *
1245
open_login1_session (GDBusConnection *connection,
1676
create_login1_session (GDBusConnection *connection)
1248
1678
Login1Session *session;
1249
1679
GError *error = NULL;
1304
1742
GDBusMethodInvocation *invocation,
1305
1743
gpointer user_data)
1308
if (strcmp (method_name, "GetSessionByPID") == 0)
1745
if (strcmp (method_name, "ListSeats") == 0)
1310
/* Look for a session with our PID, and create one if we don't have one
1747
GVariantBuilder seats;
1314
Login1Session *ret = NULL;
1316
g_variant_get (parameters, "(u)", &pid);
1318
for (link = login1_sessions; link; link = link->next)
1320
Login1Session *session;
1321
session = link->data;
1322
if (session->pid == pid)
1330
ret = open_login1_session (connection, parameters);
1332
g_dbus_method_invocation_return_value (invocation,
1333
g_variant_new("(o)", ret->path));
1750
g_variant_builder_init (&seats, G_VARIANT_TYPE ("a(so)"));
1751
for (link = login1_seats; link; link = link->next)
1753
Login1Seat *seat = link->data;
1754
g_variant_builder_add (&seats, "(so)", seat->id, seat->path);
1756
g_dbus_method_invocation_return_value (invocation, g_variant_new ("(a(so))", &seats));
1758
else if (strcmp (method_name, "CreateSession") == 0)
1760
/* Note: this is not the full CreateSession as used by logind, we just
1761
need one so our fake PAM stack can communicate with this service */
1762
Login1Session *session = create_login1_session (connection);
1763
g_dbus_method_invocation_return_value (invocation, g_variant_new ("(so)", session->id, session->path));
1766
else if (strcmp (method_name, "LockSession") == 0)
1769
Login1Session *session;
1771
g_variant_get (parameters, "(&s)", &id);
1772
session = find_login1_session (id);
1775
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "No such session: %s", id);
1779
if (!session->locked)
1781
gchar *status = g_strdup_printf ("LOGIN1 LOCK-SESSION SESSION=%s", id);
1782
check_status (status);
1785
session->locked = TRUE;
1786
g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
1788
else if (strcmp (method_name, "UnlockSession") == 0)
1791
Login1Session *session;
1793
g_variant_get (parameters, "(&s)", &id);
1794
session = find_login1_session (id);
1797
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "No such session: %s", id);
1801
if (session->locked)
1803
gchar *status = g_strdup_printf ("LOGIN1 UNLOCK-SESSION SESSION=%s", id);
1804
check_status (status);
1807
session->locked = FALSE;
1808
g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
1810
else if (strcmp (method_name, "ActivateSession") == 0)
1813
Login1Session *session;
1815
g_variant_get (parameters, "(&s)", &id);
1816
session = find_login1_session (id);
1819
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "No such session: %s", id);
1823
gchar *status = g_strdup_printf ("LOGIN1 ACTIVATE-SESSION SESSION=%s", id);
1824
check_status (status);
1827
g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
1336
1829
else if (strcmp (method_name, "CanReboot") == 0)
1393
1886
const gchar *login1_interface =
1395
1888
" <interface name='org.freedesktop.login1.Manager'>"
1396
" <method name='GetSessionByPID'>"
1397
" <arg name='pid' type='u' direction='in'/>"
1398
" <arg name='session' type='o' direction='out'/>"
1889
" <method name='ListSeats'>"
1890
" <arg name='seats' type='a(so)' direction='out'/>"
1892
" <method name='CreateSession'>"
1893
" <arg name='id' type='s' direction='out'/>"
1894
" <arg name='path' type='o' direction='out'/>"
1896
" <method name='LockSession'>"
1897
" <arg name='id' type='s' direction='in'/>"
1899
" <method name='UnlockSession'>"
1900
" <arg name='id' type='s' direction='in'/>"
1902
" <method name='ActivateSession'>"
1903
" <arg name='id' type='s' direction='in'/>"
1400
1905
" <method name='CanReboot'>"
1401
1906
" <arg name='result' direction='out' type='s'/>"
1733
2265
return g_variant_new_string (user->real_name);
1734
2266
else if (strcmp (property_name, "HomeDirectory") == 0)
1735
2267
return g_variant_new_string (user->home_directory);
2268
else if (strcmp (property_name, "SystemAccount") == 0)
2269
return g_variant_new_boolean (user->uid < 1000);
1736
2270
else if (strcmp (property_name, "BackgroundFile") == 0)
1737
2271
return g_variant_new_string (user->background ? user->background : "");
1738
2272
else if (strcmp (property_name, "Language") == 0)
1739
2273
return g_variant_new_string (user->language ? user->language : "");
1740
2274
else if (strcmp (property_name, "IconFile") == 0)
1741
2275
return g_variant_new_string (user->image ? user->image : "");
2276
else if (strcmp (property_name, "Shell") == 0)
2277
return g_variant_new_string ("/bin/sh");
2278
else if (strcmp (property_name, "Uid") == 0)
2279
return g_variant_new_uint64 (user->uid);
1742
2280
else if (strcmp (property_name, "XSession") == 0)
1743
2281
return g_variant_new_string (user->xsession ? user->xsession : "");
1744
2282
else if (strcmp (property_name, "XKeyboardLayouts") == 0)
1852
GString *command_line;
1853
gchar **lightdm_argv;
1855
GError *error = NULL;
1857
2393
run_commands ();
1859
status_timeout = g_timeout_add (status_timeout_ms, status_timeout_cb, NULL);
1861
command_line = g_string_new ("lightdm");
1862
if (getenv ("DEBUG"))
1863
g_string_append (command_line, " --debug");
1864
g_string_append_printf (command_line, " --cache-dir %s/cache", temp_dir);
1866
test_runner_command = g_strdup_printf ("PATH=%s LD_PRELOAD=%s LD_LIBRARY_PATH=%s LIGHTDM_TEST_ROOT=%s DBUS_SESSION_BUS_ADDRESS=%s %s\n",
1867
g_getenv ("PATH"), g_getenv ("LD_PRELOAD"), g_getenv ("LD_LIBRARY_PATH"), g_getenv ("LIGHTDM_TEST_ROOT"), g_getenv ("DBUS_SESSION_BUS_ADDRESS"),
1870
if (!g_shell_parse_argv (command_line->str, NULL, &lightdm_argv, &error))
1872
g_warning ("Error parsing command line: %s", error->message);
1873
quit (EXIT_FAILURE);
1875
g_clear_error (&error);
1877
if (!g_spawn_async (NULL, lightdm_argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_SEARCH_PATH, NULL, NULL, &lightdm_pid, &error))
1879
g_warning ("Error launching LightDM: %s", error->message);
1880
quit (EXIT_FAILURE);
1882
g_clear_error (&error);
1883
lightdm_process = watch_process (lightdm_pid);
1885
check_status ("RUNNER DAEMON-START");
1888
2396
static gboolean
2405
properties_changed_cb (GDBusConnection *connection,
2406
const gchar *sender_name,
2407
const gchar *object_path,
2408
const gchar *interface_name,
2409
const gchar *signal_name,
2410
GVariant *parameters,
2413
const gchar *interface, *name;
2416
GVariantIter *changed_properties, *invalidated_properties;
2419
g_variant_get (parameters, "(&sa{sv}as)", &interface, &changed_properties, &invalidated_properties);
2421
status = g_string_new ("RUNNER DBUS-PROPERTIES-CHANGED");
2422
g_string_append_printf (status, " PATH=%s", object_path);
2423
g_string_append_printf (status, " INTERFACE=%s", interface);
2424
for (i = 0; g_variant_iter_loop (changed_properties, "{&sv}", &name, &value); i++)
2427
g_string_append (status, " CHANGED=");
2429
g_string_append (status, ",");
2430
g_string_append (status, name);
2431
if (g_variant_is_of_type (value, G_VARIANT_TYPE ("ao")))
2436
g_variant_iter_init (&iter, value);
2437
while (g_variant_iter_loop (&iter, "&o", &path))
2438
g_string_append_printf (status, ":%s", path);
2441
for (i = 0; g_variant_iter_loop (invalidated_properties, "&s", &name); i++)
2444
g_string_append (status, " INVALIDATED=");
2446
g_string_append (status, ",");
2447
g_string_append (status, name);
2450
check_status (status->str);
2451
g_string_free (status, TRUE);
2455
dbus_signal_cb (GDBusConnection *connection,
2456
const gchar *sender_name,
2457
const gchar *object_path,
2458
const gchar *interface_name,
2459
const gchar *signal_name,
2460
GVariant *parameters,
2465
status = g_string_new ("RUNNER DBUS-SIGNAL");
2466
g_string_append_printf (status, " PATH=%s", object_path);
2467
g_string_append_printf (status, " INTERFACE=%s", interface_name);
2468
g_string_append_printf (status, " NAME=%s", signal_name);
2470
check_status (status->str);
2471
g_string_free (status, TRUE);
1897
2475
main (int argc, char **argv)
2020
2602
/* Set up a skeleton file system */
2021
2603
g_mkdir_with_parents (g_strdup_printf ("%s/etc", temp_dir), 0755);
2604
g_mkdir_with_parents (g_strdup_printf ("%s/run", temp_dir), 0755);
2022
2605
g_mkdir_with_parents (g_strdup_printf ("%s/usr/share", temp_dir), 0755);
2023
2606
g_mkdir_with_parents (g_strdup_printf ("%s/usr/share/lightdm/sessions", temp_dir), 0755);
2024
2607
g_mkdir_with_parents (g_strdup_printf ("%s/usr/share/lightdm/remote-sessions", temp_dir), 0755);
2025
2608
g_mkdir_with_parents (g_strdup_printf ("%s/usr/share/lightdm/greeters", temp_dir), 0755);
2026
2609
g_mkdir_with_parents (g_strdup_printf ("%s/tmp", temp_dir), 0755);
2610
g_mkdir_with_parents (g_strdup_printf ("%s/var/lib/lightdm-data", temp_dir), 0755);
2027
2611
g_mkdir_with_parents (g_strdup_printf ("%s/var/run", temp_dir), 0755);
2028
2612
g_mkdir_with_parents (g_strdup_printf ("%s/var/log", temp_dir), 0755);
2055
g_mkdir_with_parents (g_strdup_printf ("%s/etc/lightdm/lightdm.conf.d", temp_dir), 0755);
2639
g_mkdir_with_parents (g_strdup_printf ("%s/etc/xdg/lightdm/lightdm.conf.d", temp_dir), 0755);
2057
2641
files = g_strsplit (additional_config, " ", -1);
2058
2642
for (i = 0; files[i]; i++)
2059
if (system (g_strdup_printf ("cp %s/tests/scripts/%s %s/etc/lightdm/lightdm.conf.d", SRCDIR, files[i], temp_dir)))
2643
if (system (g_strdup_printf ("cp %s/tests/scripts/%s %s/etc/xdg/lightdm/lightdm.conf.d", SRCDIR, files[i], temp_dir)))
2060
2644
perror ("Failed to copy configuration");
2061
2645
g_strfreev (files);
2648
if (g_key_file_has_key (config, "test-runner-config", "shared-data-dirs", NULL))
2654
dir_string = g_key_file_get_string (config, "test-runner-config", "shared-data-dirs", NULL);
2655
dirs = g_strsplit (dir_string, " ", -1);
2656
g_free (dir_string);
2658
for (i = 0; dirs[i]; i++)
2660
gchar **fields = g_strsplit (dirs[i], ":", -1);
2661
if (g_strv_length (fields) == 4)
2663
gchar *path = g_strdup_printf ("%s/var/lib/lightdm-data/%s", temp_dir, fields[0]);
2664
int uid = g_ascii_strtoll (fields[1], NULL, 10);
2665
int gid = g_ascii_strtoll (fields[2], NULL, 10);
2666
int mode = g_ascii_strtoll (fields[3], NULL, 8);
2667
g_mkdir (path, mode);
2668
g_chmod (path, mode); /* mkdir filters by umask, so make sure we have what we want */
2669
if (chown (path, uid, gid) < 0)
2670
g_warning ("chown (%s) failed: %s", path, strerror (errno));
2673
g_strfreev (fields);
2064
2679
/* Always copy the script */
2065
2680
if (system (g_strdup_printf ("cp %s %s/script", config_path, temp_dir)))
2066
2681
perror ("Failed to copy configuration");
2257
2872
if (!g_key_file_get_boolean (config, "test-runner-config", "disable-accounts-service", NULL))
2258
2873
start_accounts_service_daemon ();
2875
/* Listen for daemon bus events */
2876
if (g_key_file_get_boolean (config, "test-runner-config", "log-dbus", NULL))
2878
g_dbus_connection_signal_subscribe (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
2879
"org.freedesktop.DisplayManager",
2880
"org.freedesktop.DBus.Properties",
2881
"PropertiesChanged",
2884
G_DBUS_SIGNAL_FLAGS_NONE,
2885
properties_changed_cb,
2888
g_dbus_connection_signal_subscribe (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
2889
"org.freedesktop.DisplayManager",
2890
"org.freedesktop.DisplayManager",
2894
G_DBUS_SIGNAL_FLAGS_NONE,
2260
2900
g_main_loop_run (loop);
2262
2902
return EXIT_FAILURE;