10 static GMainLoop *loop;
11 static int exit_status = EXIT_SUCCESS;
12 static int from_dm_fd = -1, to_dm_fd = -1;
14 static GKeyFile *config;
20 g_main_loop_quit (loop);
24 sigint_cb (gpointer user_data)
26 status_notify ("UNITY-SYSTEM-COMPOSITOR TERMINATE SIGNAL=%d", SIGINT);
32 sigterm_cb (gpointer user_data)
34 status_notify ("UNITY-SYSTEM-COMPOSITOR TERMINATE SIGNAL=%d", SIGTERM);
43 USC_MESSAGE_READY = 2,
44 USC_MESSAGE_SESSION_CONNECTED = 3,
45 USC_MESSAGE_SET_ACTIVE_SESSION = 4
49 write_message (guint16 id, const guint8 *payload, guint16 payload_length)
52 gsize data_length = 4 + payload_length;
54 data = g_malloc (data_length);
57 data[2] = payload_length >> 8;
58 data[3] = payload_length & 0xFF;
59 memcpy (data + 4, payload, payload_length);
61 if (write (to_dm_fd, data, data_length) < 0)
62 fprintf (stderr, "Failed to write to daemon: %s\n", strerror (errno));
66 read_message_cb (GIOChannel *channel, GIOCondition condition, gpointer data)
68 gchar header[4], *payload;
71 guint16 payload_length;
74 if (g_io_channel_read_chars (channel, header, 4, &n_read, &error) != G_IO_STATUS_NORMAL)
76 g_printerr ("Failed to read header: %s\n", error->message);
81 g_printerr ("Short read for header, %zi instead of expected 4\n", n_read);
84 id = header[0] << 8 | header[1];
85 payload_length = header[2] << 8 | header[3];
86 payload = g_malloc0 (payload_length + 1);
87 if (g_io_channel_read_chars (channel, payload, payload_length, &n_read, &error) != G_IO_STATUS_NORMAL)
89 g_printerr ("Failed to read payload: %s\n", error->message);
92 if (n_read != payload_length)
94 g_printerr ("Short read for payload, %zi instead of expected %d\n", n_read, payload_length);
100 case USC_MESSAGE_PING:
101 status_notify ("UNITY-SYSTEM-COMPOSITOR PING");
103 case USC_MESSAGE_SET_ACTIVE_SESSION:
104 status_notify ("UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=%s", (gchar *)payload);
107 g_printerr ("Ignoring message %d with %d octets\n", id, payload_length);
117 request_cb (const gchar *request)
121 g_main_loop_quit (loop);
125 if (strcmp (request, "UNITY-SYSTEM-COMPOSITOR PING") == 0)
126 write_message (USC_MESSAGE_PING, NULL, 0);
127 else if (strcmp (request, "UNITY-SYSTEM-COMPOSITOR PONG") == 0)
128 write_message (USC_MESSAGE_PONG, NULL, 0);
129 else if (strcmp (request, "UNITY-SYSTEM-COMPOSITOR READY") == 0)
130 write_message (USC_MESSAGE_READY, NULL, 0);
134 main (int argc, char **argv)
137 GString *status_text;
138 gboolean test = FALSE;
141 #if !defined(GLIB_VERSION_2_36)
145 loop = g_main_loop_new (NULL, FALSE);
147 g_unix_signal_add (SIGINT, sigint_cb, NULL);
148 g_unix_signal_add (SIGTERM, sigterm_cb, NULL);
150 status_connect (request_cb);
152 for (i = 1; i < argc; i++)
156 if (strcmp (arg, "--from-dm-fd") == 0)
158 from_dm_fd = atoi (argv[i+1]);
161 else if (strcmp (arg, "--to-dm-fd") == 0)
163 to_dm_fd = atoi (argv[i+1]);
166 else if (strcmp (arg, "--vt") == 0)
168 vt_number = atoi (argv[i+1]);
171 else if (strcmp (arg, "--test") == 0)
177 g_io_add_watch (g_io_channel_unix_new (from_dm_fd), G_IO_IN, read_message_cb, NULL);
179 status_text = g_string_new ("UNITY-SYSTEM-COMPOSITOR START");
181 g_string_append_printf (status_text, " VT=%d", vt_number);
182 if (g_getenv ("XDG_VTNR"))
183 g_string_append_printf (status_text, " XDG_VTNR=%s", g_getenv ("XDG_VTNR"));
185 g_string_append (status_text, " TEST=TRUE");
186 status_notify (status_text->str);
187 g_string_free (status_text, TRUE);
189 config = g_key_file_new ();
190 g_key_file_load_from_file (config, g_build_filename (g_getenv ("LIGHTDM_TEST_ROOT"), "script", NULL), G_KEY_FILE_NONE, NULL);
192 if (g_key_file_has_key (config, "unity-system-compositor-config", "return-value", NULL))
194 int return_value = g_key_file_get_integer (config, "unity-system-compositor-config", "return-value", NULL);
195 status_notify ("UNITY-SYSTEM-COMPOSITOR EXIT CODE=%d", return_value);
199 g_main_loop_run (loop);