]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blob - tests/src/test-session.c
7d321cee4699065478449281a41a8846715f9fa9
[sojka/lightdm.git] / tests / src / test-session.c
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <signal.h>
5 #include <sys/types.h>
6 #include <unistd.h>
7 #include <fcntl.h>
8 #include <grp.h>
9 #include <xcb/xcb.h>
10 #include <glib.h>
11 #include <glib-object.h>
12 #include <gio/gio.h>
13
14 #include "status.h"
15
16 static gchar *session_id;
17
18 static GMainLoop *loop;
19
20 static GString *open_fds;
21
22 static GKeyFile *config;
23
24 static xcb_connection_t *connection;
25
26 static void
27 quit_cb (int signum)
28 {
29     status_notify ("%s TERMINATE SIGNAL=%d", session_id, signum);
30     exit (EXIT_SUCCESS);
31 }
32
33 static void
34 request_cb (const gchar *request)
35 {
36     gchar *r;
37
38     if (!request)
39     {
40         g_main_loop_quit (loop);
41         return;
42     }
43   
44     r = g_strdup_printf ("%s LOGOUT", session_id);
45     if (strcmp (request, r) == 0)
46         exit (EXIT_SUCCESS);
47     g_free (r);
48   
49     r = g_strdup_printf ("%s CRASH", session_id);
50     if (strcmp (request, r) == 0)
51         kill (getpid (), SIGSEGV);
52     g_free (r);
53
54     r = g_strdup_printf ("%s LOCK-SEAT", session_id);
55     if (strcmp (request, r) == 0)
56     {
57         status_notify ("%s LOCK-SEAT", session_id);
58         g_dbus_connection_call_sync (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
59                                      "org.freedesktop.DisplayManager",
60                                      getenv ("XDG_SEAT_PATH"),
61                                      "org.freedesktop.DisplayManager.Seat",
62                                      "Lock",
63                                      g_variant_new ("()"),
64                                      G_VARIANT_TYPE ("()"),
65                                      G_DBUS_CALL_FLAGS_NONE,
66                                      1000,
67                                      NULL,
68                                      NULL);
69     }
70     g_free (r);
71
72     r = g_strdup_printf ("%s LOCK-SESSION", session_id);
73     if (strcmp (request, r) == 0)
74     {
75         status_notify ("%s LOCK-SESSION", session_id);
76         g_dbus_connection_call_sync (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
77                                      "org.freedesktop.DisplayManager",
78                                      getenv ("XDG_SESSION_PATH"),
79                                      "org.freedesktop.DisplayManager.Session",
80                                      "Lock",
81                                      g_variant_new ("()"),
82                                      G_VARIANT_TYPE ("()"),
83                                      G_DBUS_CALL_FLAGS_NONE,
84                                      1000,
85                                      NULL,
86                                      NULL);
87     }
88     g_free (r);
89
90     r = g_strdup_printf ("%s LIST-GROUPS", session_id);
91     if (strcmp (request, r) == 0)
92     {
93         int n_groups, i;
94         gid_t *groups;
95         GString *group_list;
96
97         n_groups = getgroups (0, NULL);
98         groups = malloc (sizeof (gid_t) * n_groups);
99         n_groups = getgroups (n_groups, groups);
100         group_list = g_string_new ("");
101         for (i = 0; i < n_groups; i++)
102         {
103             struct group *group;
104
105             if (i != 0)
106                 g_string_append (group_list, ",");
107             group = getgrgid (groups[i]);
108             if (group)
109                 g_string_append (group_list, group->gr_name);
110             else
111                 g_string_append_printf (group_list, "%d", groups[i]);
112         }
113         status_notify ("%s LIST-GROUPS GROUPS=%s", session_id, group_list->str);
114         g_string_free (group_list, TRUE);
115         free (groups);
116     }
117
118     r = g_strdup_printf ("%s READ-ENV NAME=", session_id);
119     if (g_str_has_prefix (request, r))
120     {
121         const gchar *name = request + strlen (r);
122         const gchar *value = g_getenv (name);
123         status_notify ("%s READ-ENV NAME=%s VALUE=%s", session_id, name, value ? value : "");
124     }
125     g_free (r);
126
127     r = g_strdup_printf ("%s WRITE-STDOUT TEXT=", session_id);
128     if (g_str_has_prefix (request, r))
129         g_print ("%s", request + strlen (r));
130     g_free (r);
131
132     r = g_strdup_printf ("%s WRITE-STDERR TEXT=", session_id);
133     if (g_str_has_prefix (request, r))
134         g_printerr ("%s", request + strlen (r));
135     g_free (r);
136
137     r = g_strdup_printf ("%s READ FILE=", session_id);
138     if (g_str_has_prefix (request, r))
139     {
140         const gchar *name = request + strlen (r);
141         gchar *contents;
142         GError *error = NULL;
143
144         if (g_file_get_contents (name, &contents, NULL, &error))
145             status_notify ("%s READ FILE=%s TEXT=%s", session_id, name, contents);
146         else
147             status_notify ("%s READ FILE=%s ERROR=%s", session_id, name, error->message);
148         g_clear_error (&error);
149     }
150     g_free (r);
151
152     r = g_strdup_printf ("%s LIST-UNKNOWN-FILE-DESCRIPTORS", session_id);
153     if (strcmp (request, r) == 0)
154         status_notify ("%s LIST-UNKNOWN-FILE-DESCRIPTORS FDS=%s", session_id, open_fds->str);
155     g_free (r);
156 }
157
158 int
159 main (int argc, char **argv)
160 {
161     gchar *display;
162     int fd, open_max;
163
164     display = getenv ("DISPLAY");
165     if (display == NULL)
166         session_id = g_strdup ("SESSION-?");
167     else if (display[0] == ':')
168         session_id = g_strdup_printf ("SESSION-X-%s", display + 1);
169     else
170         session_id = g_strdup_printf ("SESSION-X-%s", display);
171
172     open_fds = g_string_new ("");
173     open_max = sysconf (_SC_OPEN_MAX);
174     for (fd = STDERR_FILENO + 1; fd < open_max; fd++)
175     {
176         if (fcntl (fd, F_GETFD) >= 0)
177             g_string_append_printf (open_fds, "%d,", fd);
178     }
179     if (g_str_has_suffix (open_fds->str, ","))
180         open_fds->str[strlen (open_fds->str) - 1] = '\0';
181
182     signal (SIGINT, quit_cb);
183     signal (SIGTERM, quit_cb);
184
185 #if !defined(GLIB_VERSION_2_36)
186     g_type_init ();
187 #endif
188
189     loop = g_main_loop_new (NULL, FALSE);
190
191     status_connect (request_cb);
192
193     if (argc > 1)
194         status_notify ("%s START NAME=%s USER=%s", session_id, argv[1], getenv ("USER"));
195     else
196         status_notify ("%s START USER=%s", session_id, getenv ("USER"));
197
198     config = g_key_file_new ();
199     g_key_file_load_from_file (config, g_build_filename (g_getenv ("LIGHTDM_TEST_ROOT"), "script", NULL), G_KEY_FILE_NONE, NULL);
200
201     connection = xcb_connect (NULL, NULL);
202
203     if (xcb_connection_has_error (connection))
204     {
205         status_notify ("%s CONNECT-XSERVER-ERROR", session_id);
206         return EXIT_FAILURE;
207     }
208
209     status_notify ("%s CONNECT-XSERVER", session_id);
210
211     g_main_loop_run (loop);
212
213     return EXIT_SUCCESS;
214 }