Merge lp:~robert-ancell/lightdm/liblightdm-async into lp:lightdm
- liblightdm-async
- Merge into trunk
Proposed by
Robert Ancell
Status: | Merged |
---|---|
Merged at revision: | 1975 |
Proposed branch: | lp:~robert-ancell/lightdm/liblightdm-async |
Merge into: | lp:lightdm |
Diff against target: |
997 lines (+442/-114) 7 files modified
debian/liblightdm-gobject-1-0.symbols (+6/-0) doc/lightdm-gobject-1-sections.txt (+6/-0) doc/tmpl/greeter.sgml (+67/-0) liblightdm-gobject/greeter.c (+255/-52) liblightdm-gobject/liblightdm-gobject-1.vapi (+4/-0) liblightdm-gobject/lightdm/greeter.h (+14/-1) tests/src/test-gobject-greeter.c (+90/-61) |
To merge this branch: | bzr merge lp:~robert-ancell/lightdm/liblightdm-async |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
PS Jenkins bot | continuous-integration | Needs Fixing | |
LightDM Development Team | Pending | ||
Review via email: mp+217532@code.launchpad.net |
Commit message
Add asynchronous methods to liblightdm - lightdm_
Description of the change
To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : | # |
review:
Needs Fixing
(continuous-integration)
- 1955. By Robert Ancell
-
Update documentation
- 1956. By Robert Ancell
-
Merge with trunk
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'debian/liblightdm-gobject-1-0.symbols' | |||
2 | --- debian/liblightdm-gobject-1-0.symbols 2014-04-28 14:33:32 +0000 | |||
3 | +++ debian/liblightdm-gobject-1-0.symbols 2014-04-29 01:26:07 +0000 | |||
4 | @@ -16,7 +16,11 @@ | |||
5 | 16 | lightdm_greeter_authenticate_remote@Base 1.3.3 | 16 | lightdm_greeter_authenticate_remote@Base 1.3.3 |
6 | 17 | lightdm_greeter_cancel_authentication@Base 0.9.2 | 17 | lightdm_greeter_cancel_authentication@Base 0.9.2 |
7 | 18 | lightdm_greeter_cancel_autologin@Base 0.9.2 | 18 | lightdm_greeter_cancel_autologin@Base 0.9.2 |
8 | 19 | lightdm_greeter_connect@Base 1.11.1 | ||
9 | 20 | lightdm_greeter_connect_finish@Base 1.11.1 | ||
10 | 19 | lightdm_greeter_connect_sync@Base 0.9.2 | 21 | lightdm_greeter_connect_sync@Base 0.9.2 |
11 | 22 | lightdm_greeter_ensure_shared_data_dir@Base 1.11.1 | ||
12 | 23 | lightdm_greeter_ensure_shared_data_dir_finish@Base 1.11.1 | ||
13 | 20 | lightdm_greeter_ensure_shared_data_dir_sync@Base 1.9.8 | 24 | lightdm_greeter_ensure_shared_data_dir_sync@Base 1.9.8 |
14 | 21 | lightdm_greeter_get_authentication_user@Base 0.9.2 | 25 | lightdm_greeter_get_authentication_user@Base 0.9.2 |
15 | 22 | lightdm_greeter_get_autologin_guest_hint@Base 0.9.2 | 26 | lightdm_greeter_get_autologin_guest_hint@Base 0.9.2 |
16 | @@ -38,6 +42,8 @@ | |||
17 | 38 | lightdm_greeter_respond@Base 0.9.2 | 42 | lightdm_greeter_respond@Base 0.9.2 |
18 | 39 | lightdm_greeter_set_language@Base 0.9.8 | 43 | lightdm_greeter_set_language@Base 0.9.8 |
19 | 40 | lightdm_greeter_set_resettable@Base 1.11.1 | 44 | lightdm_greeter_set_resettable@Base 1.11.1 |
20 | 45 | lightdm_greeter_start_session@Base 1.11.1 | ||
21 | 46 | lightdm_greeter_start_session_finish@Base 1.11.1 | ||
22 | 41 | lightdm_greeter_start_session_sync@Base 0.9.2 | 47 | lightdm_greeter_start_session_sync@Base 0.9.2 |
23 | 42 | lightdm_hibernate@Base 0.9.2 | 48 | lightdm_hibernate@Base 0.9.2 |
24 | 43 | lightdm_language_get_code@Base 0.9.2 | 49 | lightdm_language_get_code@Base 0.9.2 |
25 | 44 | 50 | ||
26 | === modified file 'doc/lightdm-gobject-1-sections.txt' | |||
27 | --- doc/lightdm-gobject-1-sections.txt 2014-04-29 01:22:06 +0000 | |||
28 | +++ doc/lightdm-gobject-1-sections.txt 2014-04-29 01:26:07 +0000 | |||
29 | @@ -133,7 +133,11 @@ | |||
30 | 133 | LightDMPromptType | 133 | LightDMPromptType |
31 | 134 | lightdm_greeter_new | 134 | lightdm_greeter_new |
32 | 135 | lightdm_greeter_set_resettable | 135 | lightdm_greeter_set_resettable |
33 | 136 | lightdm_greeter_connect | ||
34 | 137 | lightdm_greeter_connect_finish | ||
35 | 136 | lightdm_greeter_connect_sync | 138 | lightdm_greeter_connect_sync |
36 | 139 | lightdm_greeter_ensure_shared_data_dir | ||
37 | 140 | lightdm_greeter_ensure_shared_data_dir_finish | ||
38 | 137 | lightdm_greeter_ensure_shared_data_dir_sync | 141 | lightdm_greeter_ensure_shared_data_dir_sync |
39 | 138 | lightdm_greeter_get_default_session_hint | 142 | lightdm_greeter_get_default_session_hint |
40 | 139 | lightdm_greeter_get_hint | 143 | lightdm_greeter_get_hint |
41 | @@ -158,6 +162,8 @@ | |||
42 | 158 | lightdm_greeter_get_in_authentication | 162 | lightdm_greeter_get_in_authentication |
43 | 159 | lightdm_greeter_get_is_authenticated | 163 | lightdm_greeter_get_is_authenticated |
44 | 160 | lightdm_greeter_get_authentication_user | 164 | lightdm_greeter_get_authentication_user |
45 | 165 | lightdm_greeter_start_session | ||
46 | 166 | lightdm_greeter_start_session_finish | ||
47 | 161 | lightdm_greeter_start_session_sync | 167 | lightdm_greeter_start_session_sync |
48 | 162 | <SUBSECTION Standard> | 168 | <SUBSECTION Standard> |
49 | 163 | LIGHTDM_GREETER | 169 | LIGHTDM_GREETER |
50 | 164 | 170 | ||
51 | === modified file 'doc/tmpl/greeter.sgml' | |||
52 | --- doc/tmpl/greeter.sgml 2014-04-29 01:22:06 +0000 | |||
53 | +++ doc/tmpl/greeter.sgml 2014-04-29 01:26:07 +0000 | |||
54 | @@ -155,6 +155,28 @@ | |||
55 | 155 | @resettable: | 155 | @resettable: |
56 | 156 | 156 | ||
57 | 157 | 157 | ||
58 | 158 | <!-- ##### FUNCTION lightdm_greeter_connect ##### --> | ||
59 | 159 | <para> | ||
60 | 160 | |||
61 | 161 | </para> | ||
62 | 162 | |||
63 | 163 | @greeter: | ||
64 | 164 | @cancellable: | ||
65 | 165 | @callback: | ||
66 | 166 | @user_data: | ||
67 | 167 | |||
68 | 168 | |||
69 | 169 | <!-- ##### FUNCTION lightdm_greeter_connect_finish ##### --> | ||
70 | 170 | <para> | ||
71 | 171 | |||
72 | 172 | </para> | ||
73 | 173 | |||
74 | 174 | @greeter: | ||
75 | 175 | @result: | ||
76 | 176 | @error: | ||
77 | 177 | @Returns: | ||
78 | 178 | |||
79 | 179 | |||
80 | 158 | <!-- ##### FUNCTION lightdm_greeter_connect_sync ##### --> | 180 | <!-- ##### FUNCTION lightdm_greeter_connect_sync ##### --> |
81 | 159 | <para> | 181 | <para> |
82 | 160 | 182 | ||
83 | @@ -165,6 +187,28 @@ | |||
84 | 165 | @Returns: | 187 | @Returns: |
85 | 166 | 188 | ||
86 | 167 | 189 | ||
87 | 190 | <!-- ##### FUNCTION lightdm_greeter_ensure_shared_data_dir ##### --> | ||
88 | 191 | <para> | ||
89 | 192 | |||
90 | 193 | </para> | ||
91 | 194 | |||
92 | 195 | @greeter: | ||
93 | 196 | @username: | ||
94 | 197 | @cancellable: | ||
95 | 198 | @callback: | ||
96 | 199 | @user_data: | ||
97 | 200 | |||
98 | 201 | |||
99 | 202 | <!-- ##### FUNCTION lightdm_greeter_ensure_shared_data_dir_finish ##### --> | ||
100 | 203 | <para> | ||
101 | 204 | |||
102 | 205 | </para> | ||
103 | 206 | |||
104 | 207 | @greeter: | ||
105 | 208 | @result: | ||
106 | 209 | @Returns: | ||
107 | 210 | |||
108 | 211 | |||
109 | 168 | <!-- ##### FUNCTION lightdm_greeter_ensure_shared_data_dir_sync ##### --> | 212 | <!-- ##### FUNCTION lightdm_greeter_ensure_shared_data_dir_sync ##### --> |
110 | 169 | <para> | 213 | <para> |
111 | 170 | 214 | ||
112 | @@ -380,6 +424,29 @@ | |||
113 | 380 | @Returns: | 424 | @Returns: |
114 | 381 | 425 | ||
115 | 382 | 426 | ||
116 | 427 | <!-- ##### FUNCTION lightdm_greeter_start_session ##### --> | ||
117 | 428 | <para> | ||
118 | 429 | |||
119 | 430 | </para> | ||
120 | 431 | |||
121 | 432 | @greeter: | ||
122 | 433 | @session: | ||
123 | 434 | @cancellable: | ||
124 | 435 | @callback: | ||
125 | 436 | @user_data: | ||
126 | 437 | |||
127 | 438 | |||
128 | 439 | <!-- ##### FUNCTION lightdm_greeter_start_session_finish ##### --> | ||
129 | 440 | <para> | ||
130 | 441 | |||
131 | 442 | </para> | ||
132 | 443 | |||
133 | 444 | @greeter: | ||
134 | 445 | @result: | ||
135 | 446 | @error: | ||
136 | 447 | @Returns: | ||
137 | 448 | |||
138 | 449 | |||
139 | 383 | <!-- ##### FUNCTION lightdm_greeter_start_session_sync ##### --> | 450 | <!-- ##### FUNCTION lightdm_greeter_start_session_sync ##### --> |
140 | 384 | <para> | 451 | <para> |
141 | 385 | 452 | ||
142 | 386 | 453 | ||
143 | === modified file 'liblightdm-gobject/greeter.c' | |||
144 | --- liblightdm-gobject/greeter.c 2014-04-28 22:56:38 +0000 | |||
145 | +++ liblightdm-gobject/greeter.c 2014-04-29 01:26:07 +0000 | |||
146 | @@ -125,6 +125,9 @@ | |||
147 | 125 | typedef struct | 125 | typedef struct |
148 | 126 | { | 126 | { |
149 | 127 | GObject parent_instance; | 127 | GObject parent_instance; |
150 | 128 | GCancellable *cancellable; | ||
151 | 129 | GAsyncReadyCallback callback; | ||
152 | 130 | gpointer user_data; | ||
153 | 128 | gboolean complete; | 131 | gboolean complete; |
154 | 129 | guint32 return_code; | 132 | guint32 return_code; |
155 | 130 | gchar *dir; | 133 | gchar *dir; |
156 | @@ -134,8 +137,9 @@ | |||
157 | 134 | GObjectClass parent_class; | 137 | GObjectClass parent_class; |
158 | 135 | } RequestClass; | 138 | } RequestClass; |
159 | 136 | GType request_get_type (void); | 139 | GType request_get_type (void); |
160 | 140 | static void request_iface_init (GAsyncResultIface *iface); | ||
161 | 137 | #define REQUEST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), request_get_type (), Request)) | 141 | #define REQUEST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), request_get_type (), Request)) |
163 | 138 | G_DEFINE_TYPE (Request, request, G_TYPE_OBJECT); | 142 | G_DEFINE_TYPE_WITH_CODE (Request, request, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_RESULT, request_iface_init)); |
164 | 139 | 143 | ||
165 | 140 | /** | 144 | /** |
166 | 141 | * lightdm_greeter_new: | 145 | * lightdm_greeter_new: |
167 | @@ -172,15 +176,33 @@ | |||
168 | 172 | } | 176 | } |
169 | 173 | 177 | ||
170 | 174 | static Request * | 178 | static Request * |
172 | 175 | request_new (void) | 179 | request_new (GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) |
173 | 176 | { | 180 | { |
174 | 177 | Request *request; | 181 | Request *request; |
175 | 178 | 182 | ||
176 | 179 | request = g_object_new (request_get_type (), NULL); | 183 | request = g_object_new (request_get_type (), NULL); |
177 | 184 | if (cancellable) | ||
178 | 185 | request->cancellable = g_object_ref (cancellable); | ||
179 | 186 | request->callback = callback; | ||
180 | 187 | request->user_data = user_data; | ||
181 | 180 | 188 | ||
182 | 181 | return request; | 189 | return request; |
183 | 182 | } | 190 | } |
184 | 183 | 191 | ||
185 | 192 | static void | ||
186 | 193 | request_complete (Request *request, GObject *object) | ||
187 | 194 | { | ||
188 | 195 | request->complete = TRUE; | ||
189 | 196 | |||
190 | 197 | if (!request->callback) | ||
191 | 198 | return; | ||
192 | 199 | |||
193 | 200 | if (request->cancellable && g_cancellable_is_cancelled (request->cancellable)) | ||
194 | 201 | return; | ||
195 | 202 | |||
196 | 203 | request->callback (object, G_ASYNC_RESULT (request), request->user_data); | ||
197 | 204 | } | ||
198 | 205 | |||
199 | 184 | static gboolean | 206 | static gboolean |
200 | 185 | timed_login_cb (gpointer data) | 207 | timed_login_cb (gpointer data) |
201 | 186 | { | 208 | { |
202 | @@ -288,14 +310,17 @@ | |||
203 | 288 | return read_int (message, message_length, &offset); | 310 | return read_int (message, message_length, &offset); |
204 | 289 | } | 311 | } |
205 | 290 | 312 | ||
208 | 291 | static void | 313 | static gboolean |
209 | 292 | write_message (LightDMGreeter *greeter, guint8 *message, gsize message_length) | 314 | send_message (LightDMGreeter *greeter, guint8 *message, gsize message_length) |
210 | 293 | { | 315 | { |
211 | 294 | LightDMGreeterPrivate *priv = GET_PRIVATE (greeter); | 316 | LightDMGreeterPrivate *priv = GET_PRIVATE (greeter); |
212 | 295 | GIOStatus status; | 317 | GIOStatus status; |
213 | 296 | GError *error = NULL; | 318 | GError *error = NULL; |
214 | 297 | guint32 stated_length; | 319 | guint32 stated_length; |
215 | 298 | 320 | ||
216 | 321 | if (!priv->to_server_channel) | ||
217 | 322 | return FALSE; | ||
218 | 323 | |||
219 | 299 | /* Double check that we're sending well-formed messages. If we say we're | 324 | /* Double check that we're sending well-formed messages. If we say we're |
220 | 300 | sending more than we do, we end up DOS'ing lightdm as it waits for the | 325 | sending more than we do, we end up DOS'ing lightdm as it waits for the |
221 | 301 | rest. If we say we're sending less than we do, we confuse the heck out | 326 | rest. If we say we're sending less than we do, we confuse the heck out |
222 | @@ -305,16 +330,20 @@ | |||
223 | 305 | if (stated_length != message_length) | 330 | if (stated_length != message_length) |
224 | 306 | { | 331 | { |
225 | 307 | g_warning ("Refusing to write malformed packet to daemon: declared size is %u, but actual size is %zu", stated_length, message_length); | 332 | g_warning ("Refusing to write malformed packet to daemon: declared size is %u, but actual size is %zu", stated_length, message_length); |
227 | 308 | return; | 333 | return FALSE; |
228 | 309 | } | 334 | } |
229 | 310 | 335 | ||
230 | 311 | status = g_io_channel_write_chars (priv->to_server_channel, (gchar *) message, message_length, NULL, &error); | 336 | status = g_io_channel_write_chars (priv->to_server_channel, (gchar *) message, message_length, NULL, &error); |
231 | 312 | if (error) | 337 | if (error) |
232 | 313 | g_warning ("Error writing to daemon: %s", error->message); | 338 | g_warning ("Error writing to daemon: %s", error->message); |
233 | 314 | g_clear_error (&error); | 339 | g_clear_error (&error); |
236 | 315 | if (status == G_IO_STATUS_NORMAL) | 340 | if (status != G_IO_STATUS_NORMAL) |
237 | 316 | g_debug ("Wrote %zi bytes to daemon", message_length); | 341 | return FALSE; |
238 | 342 | |||
239 | 343 | g_debug ("Wrote %zi bytes to daemon", message_length); | ||
240 | 317 | g_io_channel_flush (priv->to_server_channel, NULL); | 344 | g_io_channel_flush (priv->to_server_channel, NULL); |
241 | 345 | |||
242 | 346 | return TRUE; | ||
243 | 318 | } | 347 | } |
244 | 319 | 348 | ||
245 | 320 | static void | 349 | static void |
246 | @@ -351,10 +380,11 @@ | |||
247 | 351 | priv->autologin_timeout = g_timeout_add (timeout * 1000, timed_login_cb, greeter); | 380 | priv->autologin_timeout = g_timeout_add (timeout * 1000, timed_login_cb, greeter); |
248 | 352 | } | 381 | } |
249 | 353 | 382 | ||
250 | 383 | /* Notify asynchronous caller */ | ||
251 | 354 | request = g_list_nth_data (priv->connect_requests, 0); | 384 | request = g_list_nth_data (priv->connect_requests, 0); |
252 | 355 | if (request) | 385 | if (request) |
253 | 356 | { | 386 | { |
255 | 357 | request->complete = TRUE; | 387 | request_complete (request, G_OBJECT (greeter)); |
256 | 358 | priv->connect_requests = g_list_remove (priv->connect_requests, request); | 388 | priv->connect_requests = g_list_remove (priv->connect_requests, request); |
257 | 359 | g_object_unref (request); | 389 | g_object_unref (request); |
258 | 360 | } | 390 | } |
259 | @@ -501,11 +531,12 @@ | |||
260 | 501 | LightDMGreeterPrivate *priv = GET_PRIVATE (greeter); | 531 | LightDMGreeterPrivate *priv = GET_PRIVATE (greeter); |
261 | 502 | Request *request; | 532 | Request *request; |
262 | 503 | 533 | ||
263 | 534 | /* Notify asynchronous caller */ | ||
264 | 504 | request = g_list_nth_data (priv->start_session_requests, 0); | 535 | request = g_list_nth_data (priv->start_session_requests, 0); |
265 | 505 | if (request) | 536 | if (request) |
266 | 506 | { | 537 | { |
267 | 507 | request->return_code = read_int (message, message_length, offset); | 538 | request->return_code = read_int (message, message_length, offset); |
269 | 508 | request->complete = TRUE; | 539 | request_complete (request, G_OBJECT (greeter)); |
270 | 509 | priv->start_session_requests = g_list_remove (priv->start_session_requests, request); | 540 | priv->start_session_requests = g_list_remove (priv->start_session_requests, request); |
271 | 510 | g_object_unref (request); | 541 | g_object_unref (request); |
272 | 511 | } | 542 | } |
273 | @@ -517,6 +548,7 @@ | |||
274 | 517 | LightDMGreeterPrivate *priv = GET_PRIVATE (greeter); | 548 | LightDMGreeterPrivate *priv = GET_PRIVATE (greeter); |
275 | 518 | Request *request; | 549 | Request *request; |
276 | 519 | 550 | ||
277 | 551 | /* Notify asynchronous caller */ | ||
278 | 520 | request = g_list_nth_data (priv->ensure_shared_data_dir_requests, 0); | 552 | request = g_list_nth_data (priv->ensure_shared_data_dir_requests, 0); |
279 | 521 | if (request) | 553 | if (request) |
280 | 522 | { | 554 | { |
281 | @@ -527,7 +559,7 @@ | |||
282 | 527 | g_free (request->dir); | 559 | g_free (request->dir); |
283 | 528 | request->dir = NULL; | 560 | request->dir = NULL; |
284 | 529 | } | 561 | } |
286 | 530 | request->complete = TRUE; | 562 | request_complete (request, G_OBJECT (greeter)); |
287 | 531 | priv->ensure_shared_data_dir_requests = g_list_remove (priv->ensure_shared_data_dir_requests, request); | 563 | priv->ensure_shared_data_dir_requests = g_list_remove (priv->ensure_shared_data_dir_requests, request); |
288 | 532 | g_object_unref (request); | 564 | g_object_unref (request); |
289 | 533 | } | 565 | } |
290 | @@ -571,13 +603,16 @@ | |||
291 | 571 | } | 603 | } |
292 | 572 | 604 | ||
293 | 573 | static guint8 * | 605 | static guint8 * |
295 | 574 | read_message (LightDMGreeter *greeter, gsize *length, gboolean block) | 606 | recv_message (LightDMGreeter *greeter, gsize *length, gboolean block) |
296 | 575 | { | 607 | { |
297 | 576 | LightDMGreeterPrivate *priv = GET_PRIVATE (greeter); | 608 | LightDMGreeterPrivate *priv = GET_PRIVATE (greeter); |
298 | 577 | gsize n_to_read, n_read; | 609 | gsize n_to_read, n_read; |
299 | 578 | guint8 *buffer; | 610 | guint8 *buffer; |
300 | 579 | GError *error = NULL; | 611 | GError *error = NULL; |
301 | 580 | 612 | ||
302 | 613 | if (!priv->from_server_channel) | ||
303 | 614 | return NULL; | ||
304 | 615 | |||
305 | 581 | /* Read the header, or the whole message if we already have that */ | 616 | /* Read the header, or the whole message if we already have that */ |
306 | 582 | n_to_read = HEADER_SIZE; | 617 | n_to_read = HEADER_SIZE; |
307 | 583 | if (priv->n_read >= HEADER_SIZE) | 618 | if (priv->n_read >= HEADER_SIZE) |
308 | @@ -613,7 +648,7 @@ | |||
309 | 613 | if (n_to_read > 0) | 648 | if (n_to_read > 0) |
310 | 614 | { | 649 | { |
311 | 615 | priv->read_buffer = g_realloc (priv->read_buffer, HEADER_SIZE + n_to_read); | 650 | priv->read_buffer = g_realloc (priv->read_buffer, HEADER_SIZE + n_to_read); |
313 | 616 | return read_message (greeter, length, block); | 651 | return recv_message (greeter, length, block); |
314 | 617 | } | 652 | } |
315 | 618 | } | 653 | } |
316 | 619 | 654 | ||
317 | @@ -634,7 +669,7 @@ | |||
318 | 634 | gsize message_length; | 669 | gsize message_length; |
319 | 635 | 670 | ||
320 | 636 | /* Read one message and process it */ | 671 | /* Read one message and process it */ |
322 | 637 | message = read_message (greeter, &message_length, FALSE); | 672 | message = recv_message (greeter, &message_length, FALSE); |
323 | 638 | if (message) | 673 | if (message) |
324 | 639 | { | 674 | { |
325 | 640 | handle_message (greeter, message, message_length); | 675 | handle_message (greeter, message, message_length); |
326 | @@ -644,7 +679,7 @@ | |||
327 | 644 | return TRUE; | 679 | return TRUE; |
328 | 645 | } | 680 | } |
329 | 646 | 681 | ||
331 | 647 | static void | 682 | static gboolean |
332 | 648 | send_connect (LightDMGreeter *greeter, gboolean resettable) | 683 | send_connect (LightDMGreeter *greeter, gboolean resettable) |
333 | 649 | { | 684 | { |
334 | 650 | guint8 message[MAX_MESSAGE_LENGTH]; | 685 | guint8 message[MAX_MESSAGE_LENGTH]; |
335 | @@ -654,10 +689,11 @@ | |||
336 | 654 | write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_CONNECT, string_length (VERSION) + int_length (), &offset); | 689 | write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_CONNECT, string_length (VERSION) + int_length (), &offset); |
337 | 655 | write_string (message, MAX_MESSAGE_LENGTH, VERSION, &offset); | 690 | write_string (message, MAX_MESSAGE_LENGTH, VERSION, &offset); |
338 | 656 | write_int (message, MAX_MESSAGE_LENGTH, resettable ? 1 : 0, &offset); | 691 | write_int (message, MAX_MESSAGE_LENGTH, resettable ? 1 : 0, &offset); |
340 | 657 | write_message (greeter, message, offset); | 692 | |
341 | 693 | return send_message (greeter, message, offset); | ||
342 | 658 | } | 694 | } |
343 | 659 | 695 | ||
345 | 660 | static void | 696 | static gboolean |
346 | 661 | send_start_session (LightDMGreeter *greeter, const gchar *session) | 697 | send_start_session (LightDMGreeter *greeter, const gchar *session) |
347 | 662 | { | 698 | { |
348 | 663 | guint8 message[MAX_MESSAGE_LENGTH]; | 699 | guint8 message[MAX_MESSAGE_LENGTH]; |
349 | @@ -670,10 +706,10 @@ | |||
350 | 670 | 706 | ||
351 | 671 | write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_START_SESSION, string_length (session), &offset); | 707 | write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_START_SESSION, string_length (session), &offset); |
352 | 672 | write_string (message, MAX_MESSAGE_LENGTH, session, &offset); | 708 | write_string (message, MAX_MESSAGE_LENGTH, session, &offset); |
354 | 673 | write_message (greeter, message, offset); | 709 | return send_message (greeter, message, offset); |
355 | 674 | } | 710 | } |
356 | 675 | 711 | ||
358 | 676 | static void | 712 | static gboolean |
359 | 677 | send_ensure_shared_data_dir (LightDMGreeter *greeter, const gchar *username) | 713 | send_ensure_shared_data_dir (LightDMGreeter *greeter, const gchar *username) |
360 | 678 | { | 714 | { |
361 | 679 | guint8 message[MAX_MESSAGE_LENGTH]; | 715 | guint8 message[MAX_MESSAGE_LENGTH]; |
362 | @@ -683,7 +719,51 @@ | |||
363 | 683 | 719 | ||
364 | 684 | write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_ENSURE_SHARED_DIR, string_length (username), &offset); | 720 | write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_ENSURE_SHARED_DIR, string_length (username), &offset); |
365 | 685 | write_string (message, MAX_MESSAGE_LENGTH, username, &offset); | 721 | write_string (message, MAX_MESSAGE_LENGTH, username, &offset); |
367 | 686 | write_message (greeter, message, offset); | 722 | return send_message (greeter, message, offset); |
368 | 723 | } | ||
369 | 724 | |||
370 | 725 | /** | ||
371 | 726 | * lightdm_greeter_connect: | ||
372 | 727 | * @greeter: The greeter to connect | ||
373 | 728 | * @cancellable: (allow-none): A #GCancellable or %NULL. | ||
374 | 729 | * @callback: (allow-none): A #GAsyncReadyCallback to call when completed or %NULL. | ||
375 | 730 | * @user_data: (allow-none): data to pass to the @callback or %NULL. | ||
376 | 731 | * | ||
377 | 732 | * Asynchronously connects the greeter to the display manager. | ||
378 | 733 | * | ||
379 | 734 | * When the operation is finished, @callback will be invoked. You can then call lightdm_greeter_connect_finish() to get the result of the operation. | ||
380 | 735 | * | ||
381 | 736 | * See lightdm_greeter_connect_sync() for the synchronous version. | ||
382 | 737 | **/ | ||
383 | 738 | void | ||
384 | 739 | lightdm_greeter_connect (LightDMGreeter *greeter, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) | ||
385 | 740 | { | ||
386 | 741 | LightDMGreeterPrivate *priv; | ||
387 | 742 | Request *request; | ||
388 | 743 | |||
389 | 744 | g_return_if_fail (LIGHTDM_IS_GREETER (greeter)); | ||
390 | 745 | |||
391 | 746 | priv = GET_PRIVATE (greeter); | ||
392 | 747 | |||
393 | 748 | request = request_new (cancellable, callback, user_data); | ||
394 | 749 | priv->connect_requests = g_list_append (priv->connect_requests, request); | ||
395 | 750 | send_connect (greeter, priv->resettable); | ||
396 | 751 | } | ||
397 | 752 | |||
398 | 753 | /** | ||
399 | 754 | * lightdm_greeter_connect_finish: | ||
400 | 755 | * @result: A #GAsyncResult. | ||
401 | 756 | * @error: return location for a #GError, or %NULL | ||
402 | 757 | * | ||
403 | 758 | * Finishes an operation started with lightdm_greeter_connect(). | ||
404 | 759 | * | ||
405 | 760 | * Return value: #TRUE if successfully connected | ||
406 | 761 | **/ | ||
407 | 762 | gboolean | ||
408 | 763 | lightdm_greeter_connect_finish (LightDMGreeter *greeter, GAsyncResult *result, GError **error) | ||
409 | 764 | { | ||
410 | 765 | g_return_if_fail (LIGHTDM_IS_GREETER (greeter)); | ||
411 | 766 | return REQUEST (result)->complete; | ||
412 | 687 | } | 767 | } |
413 | 688 | 768 | ||
414 | 689 | /** | 769 | /** |
415 | @@ -699,42 +779,22 @@ | |||
416 | 699 | lightdm_greeter_connect_sync (LightDMGreeter *greeter, GError **error) | 779 | lightdm_greeter_connect_sync (LightDMGreeter *greeter, GError **error) |
417 | 700 | { | 780 | { |
418 | 701 | LightDMGreeterPrivate *priv; | 781 | LightDMGreeterPrivate *priv; |
419 | 702 | const gchar *fd; | ||
420 | 703 | Request *request; | 782 | Request *request; |
421 | 704 | 783 | ||
422 | 705 | g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE); | 784 | g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE); |
423 | 706 | 785 | ||
424 | 707 | priv = GET_PRIVATE (greeter); | 786 | priv = GET_PRIVATE (greeter); |
425 | 708 | 787 | ||
426 | 709 | fd = g_getenv ("LIGHTDM_TO_SERVER_FD"); | ||
427 | 710 | if (!fd) | ||
428 | 711 | { | ||
429 | 712 | g_warning ("No LIGHTDM_TO_SERVER_FD environment variable"); | ||
430 | 713 | return FALSE; | ||
431 | 714 | } | ||
432 | 715 | priv->to_server_channel = g_io_channel_unix_new (atoi (fd)); | ||
433 | 716 | g_io_channel_set_encoding (priv->to_server_channel, NULL, NULL); | ||
434 | 717 | |||
435 | 718 | fd = g_getenv ("LIGHTDM_FROM_SERVER_FD"); | ||
436 | 719 | if (!fd) | ||
437 | 720 | { | ||
438 | 721 | g_warning ("No LIGHTDM_FROM_SERVER_FD environment variable"); | ||
439 | 722 | return FALSE; | ||
440 | 723 | } | ||
441 | 724 | priv->from_server_channel = g_io_channel_unix_new (atoi (fd)); | ||
442 | 725 | g_io_channel_set_encoding (priv->from_server_channel, NULL, NULL); | ||
443 | 726 | g_io_add_watch (priv->from_server_channel, G_IO_IN, from_server_cb, greeter); | ||
444 | 727 | |||
445 | 728 | /* Read until we are connected */ | 788 | /* Read until we are connected */ |
446 | 729 | send_connect (greeter, priv->resettable); | 789 | send_connect (greeter, priv->resettable); |
448 | 730 | request = request_new (); | 790 | request = request_new (NULL, NULL, NULL); |
449 | 731 | priv->connect_requests = g_list_append (priv->connect_requests, g_object_ref (request)); | 791 | priv->connect_requests = g_list_append (priv->connect_requests, g_object_ref (request)); |
450 | 732 | do | 792 | do |
451 | 733 | { | 793 | { |
452 | 734 | guint8 *message; | 794 | guint8 *message; |
453 | 735 | gsize message_length; | 795 | gsize message_length; |
454 | 736 | 796 | ||
456 | 737 | message = read_message (greeter, &message_length, TRUE); | 797 | message = recv_message (greeter, &message_length, TRUE); |
457 | 738 | if (!message) | 798 | if (!message) |
458 | 739 | break; | 799 | break; |
459 | 740 | handle_message (greeter, message, message_length); | 800 | handle_message (greeter, message, message_length); |
460 | @@ -1028,7 +1088,7 @@ | |||
461 | 1028 | write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_AUTHENTICATE, int_length () + string_length (username), &offset); | 1088 | write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_AUTHENTICATE, int_length () + string_length (username), &offset); |
462 | 1029 | write_int (message, MAX_MESSAGE_LENGTH, priv->authenticate_sequence_number, &offset); | 1089 | write_int (message, MAX_MESSAGE_LENGTH, priv->authenticate_sequence_number, &offset); |
463 | 1030 | write_string (message, MAX_MESSAGE_LENGTH, username, &offset); | 1090 | write_string (message, MAX_MESSAGE_LENGTH, username, &offset); |
465 | 1031 | write_message (greeter, message, offset); | 1091 | send_message (greeter, message, offset); |
466 | 1032 | } | 1092 | } |
467 | 1033 | 1093 | ||
468 | 1034 | /** | 1094 | /** |
469 | @@ -1060,7 +1120,7 @@ | |||
470 | 1060 | g_debug ("Starting authentication for guest account..."); | 1120 | g_debug ("Starting authentication for guest account..."); |
471 | 1061 | write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_AUTHENTICATE_AS_GUEST, int_length (), &offset); | 1121 | write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_AUTHENTICATE_AS_GUEST, int_length (), &offset); |
472 | 1062 | write_int (message, MAX_MESSAGE_LENGTH, priv->authenticate_sequence_number, &offset); | 1122 | write_int (message, MAX_MESSAGE_LENGTH, priv->authenticate_sequence_number, &offset); |
474 | 1063 | write_message (greeter, message, offset); | 1123 | send_message (greeter, message, offset); |
475 | 1064 | } | 1124 | } |
476 | 1065 | 1125 | ||
477 | 1066 | /** | 1126 | /** |
478 | @@ -1117,7 +1177,7 @@ | |||
479 | 1117 | write_int (message, MAX_MESSAGE_LENGTH, priv->authenticate_sequence_number, &offset); | 1177 | write_int (message, MAX_MESSAGE_LENGTH, priv->authenticate_sequence_number, &offset); |
480 | 1118 | write_string (message, MAX_MESSAGE_LENGTH, session, &offset); | 1178 | write_string (message, MAX_MESSAGE_LENGTH, session, &offset); |
481 | 1119 | write_string (message, MAX_MESSAGE_LENGTH, username, &offset); | 1179 | write_string (message, MAX_MESSAGE_LENGTH, username, &offset); |
483 | 1120 | write_message (greeter, message, offset); | 1180 | send_message (greeter, message, offset); |
484 | 1121 | } | 1181 | } |
485 | 1122 | 1182 | ||
486 | 1123 | /** | 1183 | /** |
487 | @@ -1160,7 +1220,7 @@ | |||
488 | 1160 | write_int (message, MAX_MESSAGE_LENGTH, g_list_length (priv->responses_received), &offset); | 1220 | write_int (message, MAX_MESSAGE_LENGTH, g_list_length (priv->responses_received), &offset); |
489 | 1161 | for (iter = priv->responses_received; iter; iter = iter->next) | 1221 | for (iter = priv->responses_received; iter; iter = iter->next) |
490 | 1162 | write_string (message, MAX_MESSAGE_LENGTH, (gchar *)iter->data, &offset); | 1222 | write_string (message, MAX_MESSAGE_LENGTH, (gchar *)iter->data, &offset); |
492 | 1163 | write_message (greeter, message, offset); | 1223 | send_message (greeter, message, offset); |
493 | 1164 | 1224 | ||
494 | 1165 | g_list_free_full (priv->responses_received, g_free); | 1225 | g_list_free_full (priv->responses_received, g_free); |
495 | 1166 | priv->responses_received = NULL; | 1226 | priv->responses_received = NULL; |
496 | @@ -1188,7 +1248,7 @@ | |||
497 | 1188 | 1248 | ||
498 | 1189 | priv->cancelling_authentication = TRUE; | 1249 | priv->cancelling_authentication = TRUE; |
499 | 1190 | write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_CANCEL_AUTHENTICATION, 0, &offset); | 1250 | write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_CANCEL_AUTHENTICATION, 0, &offset); |
501 | 1191 | write_message (greeter, message, offset); | 1251 | send_message (greeter, message, offset); |
502 | 1192 | } | 1252 | } |
503 | 1193 | 1253 | ||
504 | 1194 | /** | 1254 | /** |
505 | @@ -1258,7 +1318,53 @@ | |||
506 | 1258 | 1318 | ||
507 | 1259 | write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_SET_LANGUAGE, string_length (language), &offset); | 1319 | write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_SET_LANGUAGE, string_length (language), &offset); |
508 | 1260 | write_string (message, MAX_MESSAGE_LENGTH, language, &offset); | 1320 | write_string (message, MAX_MESSAGE_LENGTH, language, &offset); |
510 | 1261 | write_message (greeter, message, offset); | 1321 | send_message (greeter, message, offset); |
511 | 1322 | } | ||
512 | 1323 | |||
513 | 1324 | /** | ||
514 | 1325 | * lightdm_greeter_start_session: | ||
515 | 1326 | * @greeter: A #LightDMGreeter | ||
516 | 1327 | * @session: (allow-none): The session to log into or #NULL to use the default. | ||
517 | 1328 | * @cancellable: (allow-none): A #GCancellable or %NULL. | ||
518 | 1329 | * @callback: (allow-none): A #GAsyncReadyCallback to call when completed or %NULL. | ||
519 | 1330 | * @user_data: (allow-none): data to pass to the @callback or %NULL. | ||
520 | 1331 | * | ||
521 | 1332 | * Asynchronously start a session for the authenticated user. | ||
522 | 1333 | * | ||
523 | 1334 | * When the operation is finished, @callback will be invoked. You can then call lightdm_greeter_start_session_finish() to get the result of the operation. | ||
524 | 1335 | * | ||
525 | 1336 | * See lightdm_greeter_start_session_sync() for the synchronous version. | ||
526 | 1337 | **/ | ||
527 | 1338 | void | ||
528 | 1339 | lightdm_greeter_start_session (LightDMGreeter *greeter, const gchar *session, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) | ||
529 | 1340 | { | ||
530 | 1341 | LightDMGreeterPrivate *priv; | ||
531 | 1342 | Request *request; | ||
532 | 1343 | |||
533 | 1344 | g_return_if_fail (LIGHTDM_IS_GREETER (greeter)); | ||
534 | 1345 | |||
535 | 1346 | priv = GET_PRIVATE (greeter); | ||
536 | 1347 | |||
537 | 1348 | send_start_session (greeter, session); | ||
538 | 1349 | request = request_new (cancellable, callback, user_data); | ||
539 | 1350 | priv->start_session_requests = g_list_append (priv->start_session_requests, request); | ||
540 | 1351 | } | ||
541 | 1352 | |||
542 | 1353 | /** | ||
543 | 1354 | * lightdm_greeter_start_session_finish: | ||
544 | 1355 | * @greeter: A #LightDMGreeter | ||
545 | 1356 | * @result: A #GAsyncResult. | ||
546 | 1357 | * @error: return location for a #GError, or %NULL | ||
547 | 1358 | * | ||
548 | 1359 | * Start a session for the authenticated user. | ||
549 | 1360 | * | ||
550 | 1361 | * Return value: TRUE if the session was started. | ||
551 | 1362 | **/ | ||
552 | 1363 | gboolean | ||
553 | 1364 | lightdm_greeter_start_session_finish (LightDMGreeter *greeter, GAsyncResult *result, GError **error) | ||
554 | 1365 | { | ||
555 | 1366 | g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE); | ||
556 | 1367 | return REQUEST (result)->return_code == 0; | ||
557 | 1262 | } | 1368 | } |
558 | 1263 | 1369 | ||
559 | 1264 | /** | 1370 | /** |
560 | @@ -1287,14 +1393,14 @@ | |||
561 | 1287 | 1393 | ||
562 | 1288 | /* Read until the session is started */ | 1394 | /* Read until the session is started */ |
563 | 1289 | send_start_session (greeter, session); | 1395 | send_start_session (greeter, session); |
565 | 1290 | request = request_new (); | 1396 | request = request_new (NULL, NULL, NULL); |
566 | 1291 | priv->start_session_requests = g_list_append (priv->start_session_requests, g_object_ref (request)); | 1397 | priv->start_session_requests = g_list_append (priv->start_session_requests, g_object_ref (request)); |
567 | 1292 | do | 1398 | do |
568 | 1293 | { | 1399 | { |
569 | 1294 | guint8 *message; | 1400 | guint8 *message; |
570 | 1295 | gsize message_length; | 1401 | gsize message_length; |
571 | 1296 | 1402 | ||
573 | 1297 | message = read_message (greeter, &message_length, TRUE); | 1403 | message = recv_message (greeter, &message_length, TRUE); |
574 | 1298 | if (!message) | 1404 | if (!message) |
575 | 1299 | break; | 1405 | break; |
576 | 1300 | handle_message (greeter, message, message_length); | 1406 | handle_message (greeter, message, message_length); |
577 | @@ -1308,6 +1414,55 @@ | |||
578 | 1308 | } | 1414 | } |
579 | 1309 | 1415 | ||
580 | 1310 | /** | 1416 | /** |
581 | 1417 | * lightdm_greeter_ensure_shared_data_dir: | ||
582 | 1418 | * @greeter: A #LightDMGreeter | ||
583 | 1419 | * @username: A username | ||
584 | 1420 | * @cancellable: (allow-none): A #GCancellable or %NULL. | ||
585 | 1421 | * @callback: (allow-none): A #GAsyncReadyCallback to call when completed or %NULL. | ||
586 | 1422 | * @user_data: (allow-none): data to pass to the @callback or %NULL. | ||
587 | 1423 | * | ||
588 | 1424 | * Ensure that a shared data dir for the given user is available. Both the | ||
589 | 1425 | * greeter user and @username will have write access to that folder. The | ||
590 | 1426 | * intention is that larger pieces of shared data would be stored there (files | ||
591 | 1427 | * that the greeter creates but wants to give to a user -- like camera | ||
592 | 1428 | * photos -- or files that the user creates but wants the greeter to | ||
593 | 1429 | * see -- like contact avatars). | ||
594 | 1430 | * | ||
595 | 1431 | * LightDM will automatically create these if the user actually logs in, so | ||
596 | 1432 | * greeters only need to call this method if they want to store something in | ||
597 | 1433 | * the directory themselves. | ||
598 | 1434 | **/ | ||
599 | 1435 | void | ||
600 | 1436 | lightdm_greeter_ensure_shared_data_dir (LightDMGreeter *greeter, const gchar *username, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) | ||
601 | 1437 | { | ||
602 | 1438 | LightDMGreeterPrivate *priv; | ||
603 | 1439 | Request *request; | ||
604 | 1440 | |||
605 | 1441 | g_return_if_fail (LIGHTDM_IS_GREETER (greeter)); | ||
606 | 1442 | |||
607 | 1443 | priv = GET_PRIVATE (greeter); | ||
608 | 1444 | |||
609 | 1445 | send_ensure_shared_data_dir (greeter, username); | ||
610 | 1446 | request = request_new (cancellable, callback, user_data); | ||
611 | 1447 | priv->ensure_shared_data_dir_requests = g_list_append (priv->ensure_shared_data_dir_requests, request); | ||
612 | 1448 | } | ||
613 | 1449 | |||
614 | 1450 | /** | ||
615 | 1451 | * lightdm_greeter_ensure_shared_data_dir_finish: | ||
616 | 1452 | * @result: A #GAsyncResult. | ||
617 | 1453 | * @greeter: A #LightDMGreeter | ||
618 | 1454 | * | ||
619 | 1455 | * | ||
620 | 1456 | * Return value: The path to the shared directory, free with g_free. | ||
621 | 1457 | **/ | ||
622 | 1458 | gchar * | ||
623 | 1459 | lightdm_greeter_ensure_shared_data_dir_finish (LightDMGreeter *greeter, GAsyncResult *result) | ||
624 | 1460 | { | ||
625 | 1461 | g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), NULL); | ||
626 | 1462 | return g_strdup (REQUEST (result)->dir); | ||
627 | 1463 | } | ||
628 | 1464 | |||
629 | 1465 | /** | ||
630 | 1311 | * lightdm_greeter_ensure_shared_data_dir_sync: | 1466 | * lightdm_greeter_ensure_shared_data_dir_sync: |
631 | 1312 | * @greeter: A #LightDMGreeter | 1467 | * @greeter: A #LightDMGreeter |
632 | 1313 | * @username: A username | 1468 | * @username: A username |
633 | @@ -1323,7 +1478,7 @@ | |||
634 | 1323 | * greeters only need to call this method if they want to store something in | 1478 | * greeters only need to call this method if they want to store something in |
635 | 1324 | * the directory themselves. | 1479 | * the directory themselves. |
636 | 1325 | * | 1480 | * |
638 | 1326 | * Return value: The path to the shared directory, free with g_free | 1481 | * Return value: The path to the shared directory, free with g_free. |
639 | 1327 | **/ | 1482 | **/ |
640 | 1328 | gchar * | 1483 | gchar * |
641 | 1329 | lightdm_greeter_ensure_shared_data_dir_sync (LightDMGreeter *greeter, const gchar *username) | 1484 | lightdm_greeter_ensure_shared_data_dir_sync (LightDMGreeter *greeter, const gchar *username) |
642 | @@ -1340,14 +1495,14 @@ | |||
643 | 1340 | 1495 | ||
644 | 1341 | /* Read until a response */ | 1496 | /* Read until a response */ |
645 | 1342 | send_ensure_shared_data_dir (greeter, username); | 1497 | send_ensure_shared_data_dir (greeter, username); |
647 | 1343 | request = request_new (); | 1498 | request = request_new (NULL, NULL, NULL); |
648 | 1344 | priv->ensure_shared_data_dir_requests = g_list_append (priv->ensure_shared_data_dir_requests, g_object_ref (request)); | 1499 | priv->ensure_shared_data_dir_requests = g_list_append (priv->ensure_shared_data_dir_requests, g_object_ref (request)); |
649 | 1345 | do | 1500 | do |
650 | 1346 | { | 1501 | { |
651 | 1347 | guint8 *message; | 1502 | guint8 *message; |
652 | 1348 | gsize message_length; | 1503 | gsize message_length; |
653 | 1349 | 1504 | ||
655 | 1350 | message = read_message (greeter, &message_length, TRUE); | 1505 | message = recv_message (greeter, &message_length, TRUE); |
656 | 1351 | if (!message) | 1506 | if (!message) |
657 | 1352 | break; | 1507 | break; |
658 | 1353 | handle_message (greeter, message, message_length); | 1508 | handle_message (greeter, message, message_length); |
659 | @@ -1364,9 +1519,29 @@ | |||
660 | 1364 | lightdm_greeter_init (LightDMGreeter *greeter) | 1519 | lightdm_greeter_init (LightDMGreeter *greeter) |
661 | 1365 | { | 1520 | { |
662 | 1366 | LightDMGreeterPrivate *priv = GET_PRIVATE (greeter); | 1521 | LightDMGreeterPrivate *priv = GET_PRIVATE (greeter); |
663 | 1522 | const gchar *fd; | ||
664 | 1367 | 1523 | ||
665 | 1368 | priv->read_buffer = g_malloc (HEADER_SIZE); | 1524 | priv->read_buffer = g_malloc (HEADER_SIZE); |
666 | 1369 | priv->hints = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); | 1525 | priv->hints = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); |
667 | 1526 | |||
668 | 1527 | fd = g_getenv ("LIGHTDM_TO_SERVER_FD"); | ||
669 | 1528 | if (fd) | ||
670 | 1529 | { | ||
671 | 1530 | priv->to_server_channel = g_io_channel_unix_new (atoi (fd)); | ||
672 | 1531 | g_io_channel_set_encoding (priv->to_server_channel, NULL, NULL); | ||
673 | 1532 | } | ||
674 | 1533 | else | ||
675 | 1534 | g_warning ("No LIGHTDM_TO_SERVER_FD environment variable"); | ||
676 | 1535 | |||
677 | 1536 | fd = g_getenv ("LIGHTDM_FROM_SERVER_FD"); | ||
678 | 1537 | if (fd) | ||
679 | 1538 | { | ||
680 | 1539 | priv->from_server_channel = g_io_channel_unix_new (atoi (fd)); | ||
681 | 1540 | g_io_channel_set_encoding (priv->from_server_channel, NULL, NULL); | ||
682 | 1541 | g_io_add_watch (priv->from_server_channel, G_IO_IN, from_server_cb, greeter); | ||
683 | 1542 | } | ||
684 | 1543 | else | ||
685 | 1544 | g_warning ("No LIGHTDM_FROM_SERVER_FD environment variable"); | ||
686 | 1370 | } | 1545 | } |
687 | 1371 | 1546 | ||
688 | 1372 | static void | 1547 | static void |
689 | @@ -1699,6 +1874,8 @@ | |||
690 | 1699 | Request *request = REQUEST (object); | 1874 | Request *request = REQUEST (object); |
691 | 1700 | 1875 | ||
692 | 1701 | g_free (request->dir); | 1876 | g_free (request->dir); |
693 | 1877 | if (request->cancellable) | ||
694 | 1878 | g_object_unref (request->cancellable); | ||
695 | 1702 | 1879 | ||
696 | 1703 | G_OBJECT_CLASS (request_parent_class)->finalize (object); | 1880 | G_OBJECT_CLASS (request_parent_class)->finalize (object); |
697 | 1704 | } | 1881 | } |
698 | @@ -1709,3 +1886,29 @@ | |||
699 | 1709 | GObjectClass *object_class = G_OBJECT_CLASS (klass); | 1886 | GObjectClass *object_class = G_OBJECT_CLASS (klass); |
700 | 1710 | object_class->finalize = request_finalize; | 1887 | object_class->finalize = request_finalize; |
701 | 1711 | } | 1888 | } |
702 | 1889 | |||
703 | 1890 | static gpointer | ||
704 | 1891 | request_get_user_data (GAsyncResult *result) | ||
705 | 1892 | { | ||
706 | 1893 | return REQUEST (result)->user_data; | ||
707 | 1894 | } | ||
708 | 1895 | |||
709 | 1896 | static GObject * | ||
710 | 1897 | request_get_source_object (GAsyncResult *res) | ||
711 | 1898 | { | ||
712 | 1899 | return NULL; | ||
713 | 1900 | } | ||
714 | 1901 | |||
715 | 1902 | static gboolean | ||
716 | 1903 | request_is_tagged (GAsyncResult *res, gpointer source_tag) | ||
717 | 1904 | { | ||
718 | 1905 | return FALSE; | ||
719 | 1906 | } | ||
720 | 1907 | |||
721 | 1908 | static void | ||
722 | 1909 | request_iface_init (GAsyncResultIface *iface) | ||
723 | 1910 | { | ||
724 | 1911 | iface->get_user_data = request_get_user_data; | ||
725 | 1912 | iface->get_source_object = request_get_source_object; | ||
726 | 1913 | iface->is_tagged = request_is_tagged; | ||
727 | 1914 | } | ||
728 | 1712 | 1915 | ||
729 | === modified file 'liblightdm-gobject/liblightdm-gobject-1.vapi' | |||
730 | --- liblightdm-gobject/liblightdm-gobject-1.vapi 2014-04-08 00:32:13 +0000 | |||
731 | +++ liblightdm-gobject/liblightdm-gobject-1.vapi 2014-04-29 01:26:07 +0000 | |||
732 | @@ -24,6 +24,7 @@ | |||
733 | 24 | public signal void authentication_complete (); | 24 | public signal void authentication_complete (); |
734 | 25 | public signal void autologin_timer_expired (); | 25 | public signal void autologin_timer_expired (); |
735 | 26 | 26 | ||
736 | 27 | public async bool connect_sync () throws GLib.Error; | ||
737 | 27 | public bool connect_sync () throws GLib.Error; | 28 | public bool connect_sync () throws GLib.Error; |
738 | 28 | public unowned string get_hint (string name); | 29 | public unowned string get_hint (string name); |
739 | 29 | public unowned string default_session_hint { get; } | 30 | public unowned string default_session_hint { get; } |
740 | @@ -47,7 +48,10 @@ | |||
741 | 47 | public bool in_authentication { get; } | 48 | public bool in_authentication { get; } |
742 | 48 | public bool is_authenticated { get; } | 49 | public bool is_authenticated { get; } |
743 | 49 | public unowned string? authentication_user { get; } | 50 | public unowned string? authentication_user { get; } |
744 | 51 | public async void start_session (string? session = null) throws GLib.Error; | ||
745 | 50 | public bool start_session_sync (string? session = null) throws GLib.Error; | 52 | public bool start_session_sync (string? session = null) throws GLib.Error; |
746 | 53 | public async string ensure_shared_data_dir (string username); | ||
747 | 54 | public string ensure_shared_data_dir_sync (string username); | ||
748 | 51 | } | 55 | } |
749 | 52 | [CCode (has_type_id = false)] | 56 | [CCode (has_type_id = false)] |
750 | 53 | public enum MessageType { | 57 | public enum MessageType { |
751 | 54 | 58 | ||
752 | === modified file 'liblightdm-gobject/lightdm/greeter.h' | |||
753 | --- liblightdm-gobject/lightdm/greeter.h 2014-04-28 20:56:28 +0000 | |||
754 | +++ liblightdm-gobject/lightdm/greeter.h 2014-04-29 01:26:07 +0000 | |||
755 | @@ -12,11 +12,12 @@ | |||
756 | 12 | #define LIGHTDM_GREETER_H_ | 12 | #define LIGHTDM_GREETER_H_ |
757 | 13 | 13 | ||
758 | 14 | #include <glib-object.h> | 14 | #include <glib-object.h> |
759 | 15 | #include <gio/gio.h> | ||
760 | 15 | 16 | ||
761 | 16 | G_BEGIN_DECLS | 17 | G_BEGIN_DECLS |
762 | 17 | 18 | ||
763 | 18 | #define LIGHTDM_TYPE_GREETER (lightdm_greeter_get_type()) | 19 | #define LIGHTDM_TYPE_GREETER (lightdm_greeter_get_type()) |
765 | 19 | #define LIGHTDM_GREETER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LIGHTDM_TYPE_GREETER, LightDMGreeter)); | 20 | #define LIGHTDM_GREETER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LIGHTDM_TYPE_GREETER, LightDMGreeter)) |
766 | 20 | #define LIGHTDM_GREETER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LIGHTDM_TYPE_GREETER, LightDMGreeterClass)) | 21 | #define LIGHTDM_GREETER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LIGHTDM_TYPE_GREETER, LightDMGreeterClass)) |
767 | 21 | #define LIGHTDM_IS_GREETER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LIGHTDM_TYPE_GREETER)) | 22 | #define LIGHTDM_IS_GREETER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LIGHTDM_TYPE_GREETER)) |
768 | 22 | #define LIGHTDM_IS_GREETER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LIGHTDM_TYPE_GREETER)) | 23 | #define LIGHTDM_IS_GREETER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LIGHTDM_TYPE_GREETER)) |
769 | @@ -73,6 +74,10 @@ | |||
770 | 73 | 74 | ||
771 | 74 | void lightdm_greeter_set_resettable (LightDMGreeter *greeter, gboolean resettable); | 75 | void lightdm_greeter_set_resettable (LightDMGreeter *greeter, gboolean resettable); |
772 | 75 | 76 | ||
773 | 77 | void lightdm_greeter_connect (LightDMGreeter *greeter, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data); | ||
774 | 78 | |||
775 | 79 | gboolean lightdm_greeter_connect_finish (LightDMGreeter *greeter, GAsyncResult *result, GError **error); | ||
776 | 80 | |||
777 | 76 | gboolean lightdm_greeter_connect_sync (LightDMGreeter *greeter, GError **error); | 81 | gboolean lightdm_greeter_connect_sync (LightDMGreeter *greeter, GError **error); |
778 | 77 | 82 | ||
779 | 78 | const gchar *lightdm_greeter_get_hint (LightDMGreeter *greeter, const gchar *name); | 83 | const gchar *lightdm_greeter_get_hint (LightDMGreeter *greeter, const gchar *name); |
780 | @@ -121,8 +126,16 @@ | |||
781 | 121 | 126 | ||
782 | 122 | void lightdm_greeter_set_language (LightDMGreeter *greeter, const gchar *language); | 127 | void lightdm_greeter_set_language (LightDMGreeter *greeter, const gchar *language); |
783 | 123 | 128 | ||
784 | 129 | void lightdm_greeter_start_session (LightDMGreeter *greeter, const gchar *session, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data); | ||
785 | 130 | |||
786 | 131 | gboolean lightdm_greeter_start_session_finish (LightDMGreeter *greeter, GAsyncResult *result, GError **error); | ||
787 | 132 | |||
788 | 124 | gboolean lightdm_greeter_start_session_sync (LightDMGreeter *greeter, const gchar *session, GError **error); | 133 | gboolean lightdm_greeter_start_session_sync (LightDMGreeter *greeter, const gchar *session, GError **error); |
789 | 125 | 134 | ||
790 | 135 | void lightdm_greeter_ensure_shared_data_dir (LightDMGreeter *greeter, const gchar *username, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data); | ||
791 | 136 | |||
792 | 137 | gchar *lightdm_greeter_ensure_shared_data_dir_finish (LightDMGreeter *greeter, GAsyncResult *result); | ||
793 | 138 | |||
794 | 126 | gchar *lightdm_greeter_ensure_shared_data_dir_sync (LightDMGreeter *greeter, const gchar *username); | 139 | gchar *lightdm_greeter_ensure_shared_data_dir_sync (LightDMGreeter *greeter, const gchar *username); |
795 | 127 | 140 | ||
796 | 128 | G_END_DECLS | 141 | G_END_DECLS |
797 | 129 | 142 | ||
798 | === modified file 'tests/src/test-gobject-greeter.c' | |||
799 | --- tests/src/test-gobject-greeter.c 2014-04-28 20:56:28 +0000 | |||
800 | +++ tests/src/test-gobject-greeter.c 2014-04-29 01:26:07 +0000 | |||
801 | @@ -10,6 +10,7 @@ | |||
802 | 10 | 10 | ||
803 | 11 | #include "status.h" | 11 | #include "status.h" |
804 | 12 | 12 | ||
805 | 13 | static int exit_code = EXIT_SUCCESS; | ||
806 | 13 | static gchar *greeter_id; | 14 | static gchar *greeter_id; |
807 | 14 | static GMainLoop *loop; | 15 | static GMainLoop *loop; |
808 | 15 | static LightDMGreeter *greeter; | 16 | static LightDMGreeter *greeter; |
809 | @@ -103,6 +104,70 @@ | |||
810 | 103 | } | 104 | } |
811 | 104 | 105 | ||
812 | 105 | static void | 106 | static void |
813 | 107 | start_session_finished (GObject *object, GAsyncResult *result, gpointer data) | ||
814 | 108 | { | ||
815 | 109 | LightDMGreeter *greeter = LIGHTDM_GREETER (object); | ||
816 | 110 | GError *error = NULL; | ||
817 | 111 | |||
818 | 112 | if (!lightdm_greeter_start_session_finish (greeter, result, &error)) | ||
819 | 113 | status_notify ("%s SESSION-FAILED", greeter_id); | ||
820 | 114 | g_clear_error (&error); | ||
821 | 115 | } | ||
822 | 116 | |||
823 | 117 | static void | ||
824 | 118 | write_shared_data_finished (GObject *object, GAsyncResult *result, gpointer data) | ||
825 | 119 | { | ||
826 | 120 | LightDMGreeter *greeter = LIGHTDM_GREETER (object); | ||
827 | 121 | gchar *dir, *path, *test_data; | ||
828 | 122 | FILE *f; | ||
829 | 123 | |||
830 | 124 | dir = lightdm_greeter_ensure_shared_data_dir_finish (greeter, result); | ||
831 | 125 | if (!dir) | ||
832 | 126 | { | ||
833 | 127 | status_notify ("%s WRITE-SHARED-DATA ERROR=NO_SHARED_DIR", greeter_id); | ||
834 | 128 | return; | ||
835 | 129 | } | ||
836 | 130 | |||
837 | 131 | path = g_build_filename (dir, "data", NULL); | ||
838 | 132 | test_data = data; | ||
839 | 133 | if (!(f = fopen (path, "w")) || fprintf (f, "%s", test_data) < 0) | ||
840 | 134 | status_notify ("%s WRITE-SHARED-DATA ERROR=%s", greeter_id, strerror (errno)); | ||
841 | 135 | else | ||
842 | 136 | status_notify ("%s WRITE-SHARED-DATA RESULT=TRUE", greeter_id); | ||
843 | 137 | g_free (test_data); | ||
844 | 138 | |||
845 | 139 | if (f) | ||
846 | 140 | fclose (f); | ||
847 | 141 | g_free (path); | ||
848 | 142 | g_free (dir); | ||
849 | 143 | } | ||
850 | 144 | |||
851 | 145 | static void | ||
852 | 146 | read_shared_data_finished (GObject *object, GAsyncResult *result, gpointer data) | ||
853 | 147 | { | ||
854 | 148 | LightDMGreeter *greeter = LIGHTDM_GREETER (object); | ||
855 | 149 | gchar *dir, *path; | ||
856 | 150 | gchar *contents = NULL; | ||
857 | 151 | GError *error = NULL; | ||
858 | 152 | |||
859 | 153 | dir = lightdm_greeter_ensure_shared_data_dir_finish (greeter, result); | ||
860 | 154 | if (!dir) | ||
861 | 155 | { | ||
862 | 156 | status_notify ("%s READ-SHARED-DATA ERROR=NO_SHARED_DIR", greeter_id); | ||
863 | 157 | return; | ||
864 | 158 | } | ||
865 | 159 | |||
866 | 160 | path = g_build_filename (dir, "data", NULL); | ||
867 | 161 | if (g_file_get_contents (path, &contents, NULL, &error)) | ||
868 | 162 | status_notify ("%s READ-SHARED-DATA DATA=%s", greeter_id, contents); | ||
869 | 163 | else | ||
870 | 164 | status_notify ("%s READ-SHARED-DATA ERROR=%s", greeter_id, error->message); | ||
871 | 165 | g_free (path); | ||
872 | 166 | g_free (contents); | ||
873 | 167 | g_clear_error (&error); | ||
874 | 168 | } | ||
875 | 169 | |||
876 | 170 | static void | ||
877 | 106 | request_cb (const gchar *name, GHashTable *params) | 171 | request_cb (const gchar *name, GHashTable *params) |
878 | 107 | { | 172 | { |
879 | 108 | if (!name) | 173 | if (!name) |
880 | @@ -133,10 +198,7 @@ | |||
881 | 133 | lightdm_greeter_cancel_authentication (greeter); | 198 | lightdm_greeter_cancel_authentication (greeter); |
882 | 134 | 199 | ||
883 | 135 | else if (strcmp (name, "START-SESSION") == 0) | 200 | else if (strcmp (name, "START-SESSION") == 0) |
888 | 136 | { | 201 | lightdm_greeter_start_session (greeter, g_hash_table_lookup (params, "SESSION"), NULL, start_session_finished, NULL); |
885 | 137 | if (!lightdm_greeter_start_session_sync (greeter, g_hash_table_lookup (params, "SESSION"), NULL)) | ||
886 | 138 | status_notify ("%s SESSION-FAILED", greeter_id); | ||
887 | 139 | } | ||
889 | 140 | 202 | ||
890 | 141 | else if (strcmp (name, "LOG-DEFAULT-SESSION") == 0) | 203 | else if (strcmp (name, "LOG-DEFAULT-SESSION") == 0) |
891 | 142 | status_notify ("%s LOG-DEFAULT-SESSION SESSION=%s", greeter_id, lightdm_greeter_get_default_session_hint (greeter)); | 204 | status_notify ("%s LOG-DEFAULT-SESSION SESSION=%s", greeter_id, lightdm_greeter_get_default_session_hint (greeter)); |
892 | @@ -146,56 +208,12 @@ | |||
893 | 146 | 208 | ||
894 | 147 | else if (strcmp (name, "WRITE-SHARED-DATA") == 0) | 209 | else if (strcmp (name, "WRITE-SHARED-DATA") == 0) |
895 | 148 | { | 210 | { |
919 | 149 | gchar *dir; | 211 | const gchar *data = g_hash_table_lookup (params, "DATA"); |
920 | 150 | 212 | lightdm_greeter_ensure_shared_data_dir (greeter, g_hash_table_lookup (params, "USERNAME"), NULL, write_shared_data_finished, g_strdup (data)); | |
898 | 151 | dir = lightdm_greeter_ensure_shared_data_dir_sync (greeter, g_hash_table_lookup (params, "USERNAME")); | ||
899 | 152 | if (dir) | ||
900 | 153 | { | ||
901 | 154 | gchar *path; | ||
902 | 155 | FILE *f; | ||
903 | 156 | |||
904 | 157 | g_printerr ("dir='%s'\n", dir); | ||
905 | 158 | |||
906 | 159 | path = g_build_filename (dir, "data", NULL); | ||
907 | 160 | if (!(f = fopen (path, "w")) || fprintf (f, "%s", (const gchar *) g_hash_table_lookup (params, "DATA")) < 0) | ||
908 | 161 | status_notify ("%s WRITE-SHARED-DATA ERROR=%s", greeter_id, strerror (errno)); | ||
909 | 162 | else | ||
910 | 163 | status_notify ("%s WRITE-SHARED-DATA RESULT=TRUE", greeter_id); | ||
911 | 164 | |||
912 | 165 | if (f) | ||
913 | 166 | fclose (f); | ||
914 | 167 | g_free (path); | ||
915 | 168 | g_free (dir); | ||
916 | 169 | } | ||
917 | 170 | else | ||
918 | 171 | status_notify ("%s WRITE-SHARED-DATA ERROR=NO_SHARED_DIR", greeter_id); | ||
921 | 172 | } | 213 | } |
922 | 173 | 214 | ||
923 | 174 | else if (strcmp (name, "READ-SHARED-DATA") == 0) | 215 | else if (strcmp (name, "READ-SHARED-DATA") == 0) |
948 | 175 | { | 216 | lightdm_greeter_ensure_shared_data_dir (greeter, g_hash_table_lookup (params, "USERNAME"), NULL, read_shared_data_finished, NULL); |
925 | 176 | gchar *dir; | ||
926 | 177 | |||
927 | 178 | dir = lightdm_greeter_ensure_shared_data_dir_sync (greeter, g_hash_table_lookup (params, "USERNAME")); | ||
928 | 179 | if (dir) | ||
929 | 180 | { | ||
930 | 181 | gchar *path; | ||
931 | 182 | gchar *contents = NULL; | ||
932 | 183 | GError *error = NULL; | ||
933 | 184 | |||
934 | 185 | g_printerr ("dir='%s'\n", dir); | ||
935 | 186 | |||
936 | 187 | path = g_build_filename (dir, "data", NULL); | ||
937 | 188 | if (g_file_get_contents (path, &contents, NULL, &error)) | ||
938 | 189 | status_notify ("%s READ-SHARED-DATA DATA=%s", greeter_id, contents); | ||
939 | 190 | else | ||
940 | 191 | status_notify ("%s READ-SHARED-DATA ERROR=%s", greeter_id, error->message); | ||
941 | 192 | g_free (path); | ||
942 | 193 | g_free (contents); | ||
943 | 194 | g_clear_error (&error); | ||
944 | 195 | } | ||
945 | 196 | else | ||
946 | 197 | status_notify ("%s READ-SHARED-DATA ERROR=NO_SHARED_DIR", greeter_id); | ||
947 | 198 | } | ||
949 | 199 | 217 | ||
950 | 200 | else if (strcmp (name, "WATCH-USER") == 0) | 218 | else if (strcmp (name, "WATCH-USER") == 0) |
951 | 201 | { | 219 | { |
952 | @@ -350,6 +368,25 @@ | |||
953 | 350 | status_notify ("%s USER-REMOVED USERNAME=%s", greeter_id, lightdm_user_get_name (user)); | 368 | status_notify ("%s USER-REMOVED USERNAME=%s", greeter_id, lightdm_user_get_name (user)); |
954 | 351 | } | 369 | } |
955 | 352 | 370 | ||
956 | 371 | static void | ||
957 | 372 | connect_finished (GObject *object, GAsyncResult *result, gpointer data) | ||
958 | 373 | { | ||
959 | 374 | LightDMGreeter *greeter = LIGHTDM_GREETER (object); | ||
960 | 375 | GError *error = NULL; | ||
961 | 376 | |||
962 | 377 | if (!lightdm_greeter_connect_finish (greeter, result, &error)) | ||
963 | 378 | { | ||
964 | 379 | status_notify ("%s FAIL-CONNECT-DAEMON", greeter_id); | ||
965 | 380 | exit_code = EXIT_FAILURE; | ||
966 | 381 | g_main_loop_quit (loop); | ||
967 | 382 | return; | ||
968 | 383 | } | ||
969 | 384 | |||
970 | 385 | status_notify ("%s CONNECTED-TO-DAEMON", greeter_id); | ||
971 | 386 | |||
972 | 387 | notify_hints (greeter); | ||
973 | 388 | } | ||
974 | 389 | |||
975 | 353 | int | 390 | int |
976 | 354 | main (int argc, char **argv) | 391 | main (int argc, char **argv) |
977 | 355 | { | 392 | { |
978 | @@ -444,17 +481,9 @@ | |||
979 | 444 | } | 481 | } |
980 | 445 | 482 | ||
981 | 446 | status_notify ("%s CONNECT-TO-DAEMON", greeter_id); | 483 | status_notify ("%s CONNECT-TO-DAEMON", greeter_id); |
991 | 447 | if (!lightdm_greeter_connect_sync (greeter, NULL)) | 484 | lightdm_greeter_connect (greeter, NULL, connect_finished, NULL); |
983 | 448 | { | ||
984 | 449 | status_notify ("%s FAIL-CONNECT-DAEMON", greeter_id); | ||
985 | 450 | return EXIT_FAILURE; | ||
986 | 451 | } | ||
987 | 452 | |||
988 | 453 | status_notify ("%s CONNECTED-TO-DAEMON", greeter_id); | ||
989 | 454 | |||
990 | 455 | notify_hints (greeter); | ||
992 | 456 | 485 | ||
993 | 457 | g_main_loop_run (loop); | 486 | g_main_loop_run (loop); |
994 | 458 | 487 | ||
996 | 459 | return EXIT_SUCCESS; | 488 | return exit_code; |
997 | 460 | } | 489 | } |
FAILED: Continuous integration, rev:1954 jenkins. qa.ubuntu. com/job/ lightdm- ci/284/ jenkins. qa.ubuntu. com/job/ lightdm- trusty- amd64-ci/ 78/console jenkins. qa.ubuntu. com/job/ lightdm- trusty- armhf-ci/ 78/console
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild: s-jenkins. ubuntu- ci:8080/ job/lightdm- ci/284/ rebuild
http://