10 #include <glib-object.h>
15 static gchar *session_id;
17 static GMainLoop *loop;
19 static GString *open_fds;
21 static GKeyFile *config;
26 status_notify ("%s TERMINATE SIGNAL=%d", session_id, signum);
31 request_cb (const gchar *request)
37 g_main_loop_quit (loop);
41 r = g_strdup_printf ("%s LOGOUT", session_id);
42 if (strcmp (request, r) == 0)
46 r = g_strdup_printf ("%s CRASH", session_id);
47 if (strcmp (request, r) == 0)
48 kill (getpid (), SIGSEGV);
51 r = g_strdup_printf ("%s LOCK-SEAT", session_id);
52 if (strcmp (request, r) == 0)
54 status_notify ("%s LOCK-SEAT", session_id);
55 g_dbus_connection_call_sync (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
56 "org.freedesktop.DisplayManager",
57 getenv ("XDG_SEAT_PATH"),
58 "org.freedesktop.DisplayManager.Seat",
61 G_VARIANT_TYPE ("()"),
62 G_DBUS_CALL_FLAGS_NONE,
69 r = g_strdup_printf ("%s LOCK-SESSION", session_id);
70 if (strcmp (request, r) == 0)
72 status_notify ("%s LOCK-SESSION", session_id);
73 g_dbus_connection_call_sync (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
74 "org.freedesktop.DisplayManager",
75 getenv ("XDG_SESSION_PATH"),
76 "org.freedesktop.DisplayManager.Session",
79 G_VARIANT_TYPE ("()"),
80 G_DBUS_CALL_FLAGS_NONE,
87 r = g_strdup_printf ("%s LIST-GROUPS", session_id);
88 if (strcmp (request, r) == 0)
94 n_groups = getgroups (0, NULL);
95 groups = malloc (sizeof (gid_t) * n_groups);
96 n_groups = getgroups (n_groups, groups);
97 group_list = g_string_new ("");
98 for (i = 0; i < n_groups; i++)
103 g_string_append (group_list, ",");
104 group = getgrgid (groups[i]);
106 g_string_append (group_list, group->gr_name);
108 g_string_append_printf (group_list, "%d", groups[i]);
110 status_notify ("%s LIST-GROUPS GROUPS=%s", session_id, group_list->str);
111 g_string_free (group_list, TRUE);
115 r = g_strdup_printf ("%s READ-ENV NAME=", session_id);
116 if (g_str_has_prefix (request, r))
118 const gchar *name = request + strlen (r);
119 const gchar *value = g_getenv (name);
120 status_notify ("%s READ-ENV NAME=%s VALUE=%s", session_id, name, value ? value : "");
124 r = g_strdup_printf ("%s WRITE-STDOUT TEXT=", session_id);
125 if (g_str_has_prefix (request, r))
126 g_print ("%s", request + strlen (r));
129 r = g_strdup_printf ("%s WRITE-STDERR TEXT=", session_id);
130 if (g_str_has_prefix (request, r))
131 g_printerr ("%s", request + strlen (r));
134 r = g_strdup_printf ("%s READ FILE=", session_id);
135 if (g_str_has_prefix (request, r))
137 const gchar *name = request + strlen (r);
139 GError *error = NULL;
141 if (g_file_get_contents (name, &contents, NULL, &error))
142 status_notify ("%s READ FILE=%s TEXT=%s", session_id, name, contents);
144 status_notify ("%s READ FILE=%s ERROR=%s", session_id, name, error->message);
145 g_clear_error (&error);
149 r = g_strdup_printf ("%s LIST-UNKNOWN-FILE-DESCRIPTORS", session_id);
150 if (strcmp (request, r) == 0)
151 status_notify ("%s LIST-UNKNOWN-FILE-DESCRIPTORS FDS=%s", session_id, open_fds->str);
156 main (int argc, char **argv)
161 display = getenv ("DISPLAY");
163 session_id = g_strdup ("SESSION-?");
164 else if (display[0] == ':')
165 session_id = g_strdup_printf ("SESSION-X-%s", display + 1);
167 session_id = g_strdup_printf ("SESSION-X-%s", display);
169 open_fds = g_string_new ("");
170 open_max = sysconf (_SC_OPEN_MAX);
171 for (fd = STDERR_FILENO + 1; fd < open_max; fd++)
173 if (fcntl (fd, F_GETFD) >= 0)
174 g_string_append_printf (open_fds, "%d,", fd);
176 if (g_str_has_suffix (open_fds->str, ","))
177 open_fds->str[strlen (open_fds->str) - 1] = '\0';
179 signal (SIGINT, quit_cb);
180 signal (SIGTERM, quit_cb);
182 #if !defined(GLIB_VERSION_2_36)
186 loop = g_main_loop_new (NULL, FALSE);
188 status_connect (request_cb);
191 status_notify ("%s START NAME=%s USER=%s", session_id, argv[1], getenv ("USER"));
193 status_notify ("%s START USER=%s", session_id, getenv ("USER"));
195 config = g_key_file_new ();
196 g_key_file_load_from_file (config, g_build_filename (g_getenv ("LIGHTDM_TEST_ROOT"), "script", NULL), G_KEY_FILE_NONE, NULL);
198 connection = xcb_connect (NULL, NULL);
200 if (xcb_connection_has_error (connection))
202 status_notify ("%s CONNECT-XSERVER-ERROR", session_id);
206 status_notify ("%s CONNECT-XSERVER", session_id);
208 g_main_loop_run (loop);