303
304
gsm_systemd_can_restart (GsmSystem *system)
305
306
GsmSystemd *manager = GSM_SYSTEMD (system);
306
PolkitAuthorizationResult *res;
307
309
gboolean can_restart;
309
res = polkit_authority_check_authorization_sync (manager->priv->authority,
310
manager->priv->subject,
311
"org.freedesktop.login1.reboot",
313
POLKIT_CHECK_AUTHORIZATION_FLAGS_NONE,
320
can_restart = polkit_authorization_result_get_is_authorized (res) ||
321
polkit_authorization_result_get_is_challenge (res);
323
g_object_unref (res);
311
res = g_dbus_proxy_call_sync (manager->priv->sd_proxy,
318
g_variant_get (res, "(s)", &rv);
319
g_variant_unref (res);
321
can_restart = g_strcmp0 (rv, "yes") == 0 ||
322
g_strcmp0 (rv, "challenge") == 0;
325
326
return can_restart;
329
330
gsm_systemd_can_stop (GsmSystem *system)
331
332
GsmSystemd *manager = GSM_SYSTEMD (system);
332
PolkitAuthorizationResult *res;
333
335
gboolean can_stop;
335
res = polkit_authority_check_authorization_sync (manager->priv->authority,
336
manager->priv->subject,
337
"org.freedesktop.login1.power-off",
339
POLKIT_CHECK_AUTHORIZATION_FLAGS_NONE,
346
can_stop = polkit_authorization_result_get_is_authorized (res) ||
347
polkit_authorization_result_get_is_challenge (res);
349
g_object_unref (res);
337
res = g_dbus_proxy_call_sync (manager->priv->sd_proxy,
344
g_variant_get (res, "(s)", &rv);
345
g_variant_unref (res);
347
can_stop = g_strcmp0 (rv, "yes") == 0 ||
348
g_strcmp0 (rv, "challenge") == 0;
377
gsm_systemd_can_suspend (GsmSystem *system)
379
GsmSystemd *manager = GSM_SYSTEMD (system);
382
gboolean can_suspend;
384
res = g_dbus_proxy_call_sync (manager->priv->sd_proxy,
391
g_variant_get (res, "(s)", &rv);
392
g_variant_unref (res);
394
can_suspend = g_strcmp0 (rv, "yes") == 0 ||
395
g_strcmp0 (rv, "challenge") == 0;
403
gsm_systemd_can_hibernate (GsmSystem *system)
405
GsmSystemd *manager = GSM_SYSTEMD (system);
408
gboolean can_hibernate;
410
res = g_dbus_proxy_call_sync (manager->priv->sd_proxy,
417
g_variant_get (res, "(s)", &rv);
418
g_variant_unref (res);
420
can_hibernate = g_strcmp0 (rv, "yes") == 0 ||
421
g_strcmp0 (rv, "challenge") == 0;
425
return can_hibernate;
429
suspend_done (GObject *source,
430
GAsyncResult *result,
433
GDBusProxy *proxy = G_DBUS_PROXY (source);
434
GError *error = NULL;
437
res = g_dbus_proxy_call_finish (proxy, result, &error);
440
g_warning ("Unable to suspend system: %s", error->message);
441
g_error_free (error);
443
g_variant_unref (res);
448
hibernate_done (GObject *source,
449
GAsyncResult *result,
452
GDBusProxy *proxy = G_DBUS_PROXY (source);
453
GError *error = NULL;
456
res = g_dbus_proxy_call_finish (proxy, result, &error);
459
g_warning ("Unable to hibernate system: %s", error->message);
460
g_error_free (error);
462
g_variant_unref (res);
467
gsm_systemd_suspend (GsmSystem *system)
469
GsmSystemd *manager = GSM_SYSTEMD (system);
471
g_dbus_proxy_call (manager->priv->sd_proxy,
473
g_variant_new ("(b)", TRUE),
482
gsm_systemd_hibernate (GsmSystem *system)
484
GsmSystemd *manager = GSM_SYSTEMD (system);
486
g_dbus_proxy_call (manager->priv->sd_proxy,
488
g_variant_new ("(b)", TRUE),
497
inhibit_done (GObject *source,
498
GAsyncResult *result,
501
GDBusProxy *proxy = G_DBUS_PROXY (source);
502
GsmSystemd *manager = GSM_SYSTEMD (user_data);
503
GError *error = NULL;
505
GUnixFDList *fd_list = NULL;
508
res = g_dbus_proxy_call_with_unix_fd_list_finish (proxy, &fd_list, result, &error);
511
g_warning ("Unable to inhibit system: %s", error->message);
512
g_error_free (error);
514
g_variant_get (res, "(h)", &idx);
515
manager->priv->inhibit_fd = g_unix_fd_list_get (fd_list, idx, &error);
516
if (manager->priv->inhibit_fd == -1) {
517
g_warning ("Failed to receive system inhibitor fd: %s", error->message);
518
g_error_free (error);
520
g_debug ("System inhibitor fd is %d", manager->priv->inhibit_fd);
521
g_object_unref (fd_list);
522
g_variant_unref (res);
527
gsm_systemd_add_inhibitor (GsmSystem *system,
529
GsmInhibitorFlag flag)
531
GsmSystemd *manager = GSM_SYSTEMD (system);
533
if ((flag & GSM_INHIBITOR_FLAG_SUSPEND) == 0)
536
if (manager->priv->inhibitors == NULL) {
537
g_debug ("Adding system inhibitor");
538
g_dbus_proxy_call_with_unix_fd_list (manager->priv->sd_proxy,
540
g_variant_new ("(ssss)",
543
"user session inhibited",
552
manager->priv->inhibitors = g_slist_prepend (manager->priv->inhibitors, g_strdup (id));
556
gsm_systemd_remove_inhibitor (GsmSystem *system,
559
GsmSystemd *manager = GSM_SYSTEMD (system);
562
l = g_slist_find_custom (manager->priv->inhibitors, id, (GCompareFunc)g_strcmp0);
567
manager->priv->inhibitors = g_slist_delete_link (manager->priv->inhibitors, l);
568
if (manager->priv->inhibitors == NULL) {
569
g_debug ("Dropping system inhibitor");
570
close (manager->priv->inhibit_fd);
571
manager->priv->inhibit_fd = -1;
376
576
gsm_systemd_system_init (GsmSystemInterface *iface)
378
578
iface->can_switch_user = gsm_systemd_can_switch_user;
379
579
iface->can_stop = gsm_systemd_can_stop;
380
580
iface->can_restart = gsm_systemd_can_restart;
581
iface->can_suspend = gsm_systemd_can_suspend;
582
iface->can_hibernate = gsm_systemd_can_hibernate;
381
583
iface->attempt_stop = gsm_systemd_attempt_stop;
382
584
iface->attempt_restart = gsm_systemd_attempt_restart;
585
iface->suspend = gsm_systemd_suspend;
586
iface->hibernate = gsm_systemd_hibernate;
383
587
iface->set_session_idle = gsm_systemd_set_session_idle;
384
588
iface->is_login_session = gsm_systemd_is_login_session;
589
iface->add_inhibitor = gsm_systemd_add_inhibitor;
590
iface->remove_inhibitor = gsm_systemd_remove_inhibitor;