4
4
* hald_runner.c - Interface to the hal runner helper daemon
6
6
* Copyright (C) 2006 Sjoerd Simons, <sjoerd@luon.net>
7
* Copyright (C) 2007 Codethink Ltd. Author Rob Taylor <rob.taylor@codethink.co.uk>
8
9
* Licensed under the Academic Free License version 2.1
342
344
add_env (DBusMessageIter * iter, const gchar * key, const gchar * value)
345
env = g_strdup_printf ("%s=%s", key, value);
346
dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &env);
348
env = g_strdup_printf ("%s=%s", key, value);
349
dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &env);
364
368
if (hald_use_syslog) {
365
369
add_env (iter, "HALD_USE_SYSLOG", "1");
367
add_env (iter, "UDI", udi);
372
add_env (iter, "UDI", udi);
368
373
add_env (iter, "HALD_DIRECT_ADDR", hald_dbus_local_server_addr ());
375
/* I'm sure it would be easy to remove use of getenv(3) to add these variables... */
377
add_env (iter, "LD_LIBRARY_PATH", getenv ("LD_LIBRARY_PATH"));
369
378
#ifdef HAVE_POLKIT
370
379
add_env (iter, "HAVE_POLKIT", "1");
380
add_env (iter, "POLKIT_POLICY_DIR", getenv ("POLKIT_POLICY_DIR"));
381
add_env (iter, "POLKIT_DEBUG", getenv ("POLKIT_DEBUG"));
379
390
GString *seats_string;
394
int num_sessions_total;
383
396
seats_string = g_string_new ("");
385
398
seats = ck_tracker_get_seats (ck_tracker);
399
num_seats = g_slist_length (seats);
400
num_sessions_total = 0;
386
401
for (i = seats; i != NULL; i = g_slist_next (i)) {
389
404
GSList *sessions;
390
405
const char *seat_id;
391
406
GString *sessions_string;
393
409
sessions_string = g_string_new ("");
404
420
g_string_append (seats_string, seat_id);
406
422
sessions = ck_seat_get_sessions (seat);
423
num_sessions = g_slist_length (sessions);
424
num_sessions_total += num_sessions;
407
425
for (j = sessions; j != NULL; j = g_slist_next (j)) {
408
426
CKSession *session;
409
427
const char *session_id;
411
430
session = j->data;
412
431
/* basename again; e.g. Session1 rather than /org/freedesktop/ConsoleKit/Session1 */
418
437
g_string_append (sessions_string, session_id);
420
/* for each Session, export IS_ACTIVE and UID
439
/* for each Session, export IS_ACTIVE, UID, IS_LOCAL, HOSTNAME
441
* CK_SESSION_SEAT_Session2=Seat1
422
442
* CK_SESSION_IS_ACTIVE_Session2=true|false
423
443
* CK_SESSION_UID_Session2=501
424
444
* CK_SESSION_IS_LOCAL_Session2=true|false
425
445
* CK_SESSION_HOSTNAME_Session2=192.168.1.112
447
s = g_strdup_printf ("CK_SESSION_SEAT_%s", session_id);
448
add_env (iter, s, seat_id);
427
450
s = g_strdup_printf ("CK_SESSION_IS_ACTIVE_%s", session_id);
428
451
add_env (iter, s, ck_session_is_active (session) ? "true" : "false");
435
458
s = g_strdup_printf ("CK_SESSION_IS_LOCAL_%s", session_id);
436
459
add_env (iter, s, ck_session_is_local (session) ? "true" : "false");
438
s = g_strdup_printf ("CK_SESSION_HOSTNAME_%s", session_id);
439
p = g_strdup_printf ("%s", ck_session_get_hostname (session));
440
add_env (iter, s, p);
461
q = ck_session_get_hostname (session);
462
if (q != NULL && strlen (q) > 0) {
463
s = g_strdup_printf ("CK_SESSION_HOSTNAME_%s", session_id);
464
add_env (iter, s, q);
445
469
/* for each Seat, export sessions on each seat
447
471
* CK_SEAT_Seat1=Session1 Session3 Session7
472
* CK_SEAT_NUM_SESSIONS_Seat1=3
449
474
s = g_strdup_printf ("CK_SEAT_%s", seat_id);
450
475
add_env (iter, s, sessions_string->str);
451
476
g_string_free (sessions_string, TRUE);
479
s = g_strdup_printf ("CK_SEAT_NUM_SESSIONS_%s", seat_id);
480
p = g_strdup_printf ("%d", num_sessions);
481
add_env (iter, s, p);
456
487
/* Export all detected seats
460
491
add_env (iter, "CK_SEATS", seats_string->str);
461
492
g_string_free (seats_string, TRUE);
494
/* Export total number of sessions
498
p = g_strdup_printf ("%d", num_sessions_total);
499
add_env (iter, "CK_NUM_SESSIONS", p);
502
/* Export number of seats
506
p = g_strdup_printf ("%d", num_seats);
507
add_env (iter, "CK_NUM_SEATS", p);
463
511
#endif /* HAVE_CONKIT */
518
add_first_part (DBusMessageIter * iter, HalDevice * device,
519
const gchar * command_line, char **extra_env)
566
add_udi (DBusMessageIter * iter, HalDevice * device)
521
DBusMessageIter array_iter;
524
570
if (device != NULL)
529
575
dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &udi);
579
add_environment (DBusMessageIter * iter, HalDevice * device,
580
const gchar * command_line, char **extra_env)
582
DBusMessageIter array_iter;
531
583
dbus_message_iter_open_container (iter,
533
585
DBUS_TYPE_STRING_AS_STRING,
535
587
if (device != NULL)
536
588
hal_device_property_foreach (device, add_property_to_msg,
538
add_basic_env (&array_iter, udi);
590
add_basic_env (&array_iter, device ? hal_device_get_udi (device): NULL);
539
591
add_extra_env (&array_iter, extra_env);
540
592
dbus_message_iter_close_container (iter, &array_iter);
548
600
/* Start a helper, returns true on a successfull start */
550
hald_runner_start (HalDevice * device, const gchar * command_line,
551
char **extra_env, HalRunTerminatedCB cb, gpointer data1,
602
runner_start (HalDevice * device, const gchar * command_line,
603
char **extra_env, gboolean singleton,
604
HalRunTerminatedCB cb, gpointer data1, gpointer data2)
554
606
DBusMessage *msg, *reply;
556
608
DBusMessageIter iter;
558
dbus_error_init (&err);
610
dbus_error_init (&error);
559
611
msg = dbus_message_new_method_call ("org.freedesktop.HalRunner",
560
612
"/org/freedesktop/HalRunner",
561
613
"org.freedesktop.HalRunner",
614
singleton ? "StartSingleton" : "Start");
564
616
DIE (("No memory"));
565
617
dbus_message_iter_init_append (msg, &iter);
567
if (!add_first_part (&iter, device, command_line, extra_env))
620
add_udi (&iter, device);
622
if (!add_environment (&iter, device, command_line, extra_env)) {
623
HAL_ERROR (("Error adding environment, device =%p, singleton=%d",
570
628
/* Wait for the reply, should be almost instantanious */
572
630
dbus_connection_send_with_reply_and_block (runner_connection,
576
634
(dbus_message_get_type (reply) ==
580
638
dbus_int64_t pid_from_runner;
581
if (dbus_message_get_args (reply, &err,
639
if (dbus_message_get_args (reply, &error,
583
641
&pid_from_runner,
584
642
DBUS_TYPE_INVALID)) {
604
666
dbus_message_unref (reply);
605
667
dbus_message_unref (msg);
670
if (dbus_error_is_set (&error)) {
671
HAL_ERROR (("Error running '%s': %s: %s", command_line, error.name, error.message));
681
hald_runner_start (HalDevice * device, const gchar * command_line,
682
char **extra_env, HalRunTerminatedCB cb,
683
gpointer data1, gpointer data2)
685
return runner_start (device, command_line, extra_env, FALSE, cb, data1, data2);
689
hald_runner_start_singleton (const gchar * command_line,
690
char **extra_env, HalRunTerminatedCB cb,
691
gpointer data1, gpointer data2)
693
return runner_start (NULL, command_line, extra_env, TRUE, cb, data1, data2);
615
698
process_reply (DBusMessage *m, HelperData *hb)
714
797
DIE (("No memory"));
715
798
dbus_message_iter_init_append (msg, &iter);
717
if (!add_first_part (&iter, device, command_line, extra_env))
800
add_udi (&iter, device);
801
if (!add_environment (&iter, device, command_line, extra_env))
720
804
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &input);
783
867
DIE (("No memory"));
784
868
dbus_message_iter_init_append (msg, &iter);
786
if (!add_first_part (&iter, device, command_line, extra_env))
870
add_udi (&iter, device);
871
if (!add_environment (&iter, device, command_line, extra_env))
789
874
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &input);
856
hald_runner_kill_all (HalDevice * device)
941
hald_runner_kill_all ()
858
943
DBusMessage *msg, *reply;
861
running_processes_remove_device (device);
863
946
msg = dbus_message_new_method_call ("org.freedesktop.HalRunner",
864
947
"/org/freedesktop/HalRunner",
865
948
"org.freedesktop.HalRunner",