25
25
static xcb_connection_t *connection;
30
status_notify ("%s TERMINATE SIGNAL=%d", session_id, signum);
35
request_cb (const gchar *request)
28
sigint_cb (gpointer user_data)
30
status_notify ("%s TERMINATE SIGNAL=%d", session_id, SIGINT);
31
g_main_loop_quit (loop);
36
sigterm_cb (gpointer user_data)
38
status_notify ("%s TERMINATE SIGNAL=%d", session_id, SIGTERM);
39
g_main_loop_quit (loop);
44
request_cb (const gchar *name, GHashTable *params)
41
48
g_main_loop_quit (loop);
45
r = g_strdup_printf ("%s LOGOUT", session_id);
46
if (strcmp (request, r) == 0)
52
if (strcmp (name, "LOGOUT") == 0)
47
53
exit (EXIT_SUCCESS);
50
r = g_strdup_printf ("%s CRASH", session_id);
51
if (strcmp (request, r) == 0)
55
else if (strcmp (name, "CRASH") == 0)
52
56
kill (getpid (), SIGSEGV);
55
r = g_strdup_printf ("%s LOCK-SEAT", session_id);
56
if (strcmp (request, r) == 0)
58
else if (strcmp (name, "LOCK-SEAT") == 0)
58
60
status_notify ("%s LOCK-SEAT", session_id);
59
61
g_dbus_connection_call_sync (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
73
r = g_strdup_printf ("%s LOCK-SESSION", session_id);
74
if (strcmp (request, r) == 0)
74
else if (strcmp (name, "LOCK-SESSION") == 0)
76
76
status_notify ("%s LOCK-SESSION", session_id);
77
77
g_dbus_connection_call_sync (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
91
r = g_strdup_printf ("%s LIST-GROUPS", session_id);
92
if (strcmp (request, r) == 0)
90
else if (strcmp (name, "LIST-GROUPS") == 0)
96
94
GString *group_list;
98
96
n_groups = getgroups (0, NULL);
99
g_printerr ("Failed to get groups: %s", strerror (errno));
99
102
groups = malloc (sizeof (gid_t) * n_groups);
100
103
n_groups = getgroups (n_groups, groups);
101
104
group_list = g_string_new ("");
119
r = g_strdup_printf ("%s READ-ENV NAME=", session_id);
120
if (g_str_has_prefix (request, r))
122
else if (strcmp (name, "READ-ENV") == 0)
122
const gchar *name = request + strlen (r);
124
const gchar *name = g_hash_table_lookup (params, "NAME");
123
125
const gchar *value = g_getenv (name);
124
126
status_notify ("%s READ-ENV NAME=%s VALUE=%s", session_id, name, value ? value : "");
128
r = g_strdup_printf ("%s WRITE-STDOUT TEXT=", session_id);
129
if (g_str_has_prefix (request, r))
130
g_print ("%s", request + strlen (r));
133
r = g_strdup_printf ("%s WRITE-STDERR TEXT=", session_id);
134
if (g_str_has_prefix (request, r))
135
g_printerr ("%s", request + strlen (r));
138
r = g_strdup_printf ("%s READ FILE=", session_id);
139
if (g_str_has_prefix (request, r))
129
else if (strcmp (name, "WRITE-STDOUT") == 0)
130
g_print ("%s", (const gchar *) g_hash_table_lookup (params, "TEXT"));
132
else if (strcmp (name, "WRITE-STDERR") == 0)
133
g_printerr ("%s", (const gchar *) g_hash_table_lookup (params, "TEXT"));
135
else if (strcmp (name, "READ") == 0)
141
const gchar *name = request + strlen (r);
137
const gchar *name = g_hash_table_lookup (params, "FILE");
138
gchar *contents = NULL;
143
139
GError *error = NULL;
145
141
if (g_file_get_contents (name, &contents, NULL, &error))
146
142
status_notify ("%s READ FILE=%s TEXT=%s", session_id, name, contents);
148
144
status_notify ("%s READ FILE=%s ERROR=%s", session_id, name, error->message);
149
146
g_clear_error (&error);
153
r = g_strdup_printf ("%s LIST-UNKNOWN-FILE-DESCRIPTORS", session_id);
154
if (strcmp (request, r) == 0)
149
else if (strcmp (name, "LIST-UNKNOWN-FILE-DESCRIPTORS") == 0)
155
150
status_notify ("%s LIST-UNKNOWN-FILE-DESCRIPTORS FDS=%s", session_id, open_fds->str);
158
r = g_strdup_printf ("%s CHECK-X-AUTHORITY", session_id);
159
if (strcmp (request, r) == 0)
152
else if (strcmp (name, "CHECK-X-AUTHORITY") == 0)
161
154
gchar *xauthority;
162
155
GStatBuf file_info;
217
209
if (g_str_has_suffix (open_fds->str, ","))
218
210
open_fds->str[strlen (open_fds->str) - 1] = '\0';
220
signal (SIGINT, quit_cb);
221
signal (SIGTERM, quit_cb);
223
212
#if !defined(GLIB_VERSION_2_36)
227
216
loop = g_main_loop_new (NULL, FALSE);
229
status_connect (request_cb);
218
g_unix_signal_add (SIGINT, sigint_cb, NULL);
219
g_unix_signal_add (SIGTERM, sigterm_cb, NULL);
221
status_connect (request_cb, session_id);
231
223
status_text = g_string_new ("");
232
224
g_string_printf (status_text, "%s START", session_id);
242
234
g_string_append_printf (status_text, " NAME=%s", argv[1]);
243
235
g_string_append_printf (status_text, " USER=%s", getenv ("USER"));
244
status_notify (status_text->str);
236
status_notify ("%s", status_text->str);
245
237
g_string_free (status_text, TRUE);
247
239
config = g_key_file_new ();