X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flogin%2Flogind-dbus.c;h=ac987ec57aa28fc04ac7ed4c5a4c1112a49e3b94;hp=80514f3d2c0eb9fe4bdab4784cfe53571cc14f1b;hb=16ffa6bfe836f9b0fa5f1dd10d9cc774b9955a0b;hpb=4a91795b56e8e4358f7463f40b45ee4ee593d99c diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c index 80514f3d2..ac987ec57 100644 --- a/src/login/logind-dbus.c +++ b/src/login/logind-dbus.c @@ -243,14 +243,13 @@ static int property_get_scheduled_shutdown( static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_handle_action, handle_action, HandleAction); -static int method_get_session(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_get_session(sd_bus_message *message, void *userdata, sd_bus_error *error) { _cleanup_free_ char *p = NULL; Manager *m = userdata; const char *name; Session *session; int r; - assert(bus); assert(message); assert(m); @@ -269,14 +268,13 @@ static int method_get_session(sd_bus *bus, sd_bus_message *message, void *userda return sd_bus_reply_method_return(message, "o", p); } -static int method_get_session_by_pid(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_get_session_by_pid(sd_bus_message *message, void *userdata, sd_bus_error *error) { _cleanup_free_ char *p = NULL; Session *session = NULL; Manager *m = userdata; pid_t pid; int r; - assert(bus); assert(message); assert(m); @@ -306,14 +304,13 @@ static int method_get_session_by_pid(sd_bus *bus, sd_bus_message *message, void return sd_bus_reply_method_return(message, "o", p); } -static int method_get_user(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_get_user(sd_bus_message *message, void *userdata, sd_bus_error *error) { _cleanup_free_ char *p = NULL; Manager *m = userdata; uint32_t uid; User *user; int r; - assert(bus); assert(message); assert(m); @@ -332,14 +329,13 @@ static int method_get_user(sd_bus *bus, sd_bus_message *message, void *userdata, return sd_bus_reply_method_return(message, "o", p); } -static int method_get_user_by_pid(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_get_user_by_pid(sd_bus_message *message, void *userdata, sd_bus_error *error) { _cleanup_free_ char *p = NULL; Manager *m = userdata; User *user = NULL; pid_t pid; int r; - assert(bus); assert(message); assert(m); @@ -368,14 +364,13 @@ static int method_get_user_by_pid(sd_bus *bus, sd_bus_message *message, void *us return sd_bus_reply_method_return(message, "o", p); } -static int method_get_seat(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_get_seat(sd_bus_message *message, void *userdata, sd_bus_error *error) { _cleanup_free_ char *p = NULL; Manager *m = userdata; const char *name; Seat *seat; int r; - assert(bus); assert(message); assert(m); @@ -394,14 +389,13 @@ static int method_get_seat(sd_bus *bus, sd_bus_message *message, void *userdata, return sd_bus_reply_method_return(message, "o", p); } -static int method_list_sessions(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_list_sessions(sd_bus_message *message, void *userdata, sd_bus_error *error) { _cleanup_bus_message_unref_ sd_bus_message *reply = NULL; Manager *m = userdata; Session *session; Iterator i; int r; - assert(bus); assert(message); assert(m); @@ -434,17 +428,16 @@ static int method_list_sessions(sd_bus *bus, sd_bus_message *message, void *user if (r < 0) return r; - return sd_bus_send(bus, reply, NULL); + return sd_bus_send(NULL, reply, NULL); } -static int method_list_users(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_list_users(sd_bus_message *message, void *userdata, sd_bus_error *error) { _cleanup_bus_message_unref_ sd_bus_message *reply = NULL; Manager *m = userdata; User *user; Iterator i; int r; - assert(bus); assert(message); assert(m); @@ -475,17 +468,16 @@ static int method_list_users(sd_bus *bus, sd_bus_message *message, void *userdat if (r < 0) return r; - return sd_bus_send(bus, reply, NULL); + return sd_bus_send(NULL, reply, NULL); } -static int method_list_seats(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_list_seats(sd_bus_message *message, void *userdata, sd_bus_error *error) { _cleanup_bus_message_unref_ sd_bus_message *reply = NULL; Manager *m = userdata; Seat *seat; Iterator i; int r; - assert(bus); assert(message); assert(m); @@ -513,16 +505,19 @@ static int method_list_seats(sd_bus *bus, sd_bus_message *message, void *userdat if (r < 0) return r; - return sd_bus_send(bus, reply, NULL); + return sd_bus_send(NULL, reply, NULL); } -static int method_list_inhibitors(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_list_inhibitors(sd_bus_message *message, void *userdata, sd_bus_error *error) { _cleanup_bus_message_unref_ sd_bus_message *reply = NULL; Manager *m = userdata; Inhibitor *inhibitor; Iterator i; int r; + assert(message); + assert(m); + r = sd_bus_message_new_method_return(message, &reply); if (r < 0) return r; @@ -548,10 +543,10 @@ static int method_list_inhibitors(sd_bus *bus, sd_bus_message *message, void *us if (r < 0) return r; - return sd_bus_send(bus, reply, NULL); + return sd_bus_send(NULL, reply, NULL); } -static int method_create_session(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_create_session(sd_bus_message *message, void *userdata, sd_bus_error *error) { const char *service, *type, *class, *cseat, *tty, *display, *remote_user, *remote_host, *desktop; uint32_t uid, leader, audit_id = 0; _cleanup_free_ char *id = NULL; @@ -565,7 +560,6 @@ static int method_create_session(sd_bus *bus, sd_bus_message *message, void *use SessionClass c; int r; - assert(bus); assert(message); assert(m); @@ -732,15 +726,13 @@ static int method_create_session(sd_bus *bus, sd_bus_message *message, void *use log_warning("Existing logind session ID %s used by new audit session, ignoring", id); audit_id = 0; - free(id); - id = NULL; + id = mfree(id); } } if (!id) { do { - free(id); - id = NULL; + id = mfree(id); if (asprintf(&id, "c%lu", ++m->session_counter) < 0) return -ENOMEM; @@ -841,13 +833,12 @@ fail: return r; } -static int method_release_session(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_release_session(sd_bus_message *message, void *userdata, sd_bus_error *error) { Manager *m = userdata; Session *session; const char *name; int r; - assert(bus); assert(message); assert(m); @@ -866,13 +857,12 @@ static int method_release_session(sd_bus *bus, sd_bus_message *message, void *us return sd_bus_reply_method_return(message, NULL); } -static int method_activate_session(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_activate_session(sd_bus_message *message, void *userdata, sd_bus_error *error) { Manager *m = userdata; Session *session; const char *name; int r; - assert(bus); assert(message); assert(m); @@ -884,17 +874,16 @@ static int method_activate_session(sd_bus *bus, sd_bus_message *message, void *u if (r < 0) return r; - return bus_session_method_activate(bus, message, session, error); + return bus_session_method_activate(message, session, error); } -static int method_activate_session_on_seat(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_activate_session_on_seat(sd_bus_message *message, void *userdata, sd_bus_error *error) { const char *session_name, *seat_name; Manager *m = userdata; Session *session; Seat *seat; int r; - assert(bus); assert(message); assert(m); @@ -923,13 +912,12 @@ static int method_activate_session_on_seat(sd_bus *bus, sd_bus_message *message, return sd_bus_reply_method_return(message, NULL); } -static int method_lock_session(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_lock_session(sd_bus_message *message, void *userdata, sd_bus_error *error) { Manager *m = userdata; Session *session; const char *name; int r; - assert(bus); assert(message); assert(m); @@ -941,14 +929,13 @@ static int method_lock_session(sd_bus *bus, sd_bus_message *message, void *userd if (r < 0) return r; - return bus_session_method_lock(bus, message, session, error); + return bus_session_method_lock(message, session, error); } -static int method_lock_sessions(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_lock_sessions(sd_bus_message *message, void *userdata, sd_bus_error *error) { Manager *m = userdata; int r; - assert(bus); assert(message); assert(m); @@ -972,13 +959,12 @@ static int method_lock_sessions(sd_bus *bus, sd_bus_message *message, void *user return sd_bus_reply_method_return(message, NULL); } -static int method_kill_session(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_kill_session(sd_bus_message *message, void *userdata, sd_bus_error *error) { const char *name; Manager *m = userdata; Session *session; int r; - assert(bus); assert(message); assert(m); @@ -990,16 +976,15 @@ static int method_kill_session(sd_bus *bus, sd_bus_message *message, void *userd if (r < 0) return r; - return bus_session_method_kill(bus, message, session, error); + return bus_session_method_kill(message, session, error); } -static int method_kill_user(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_kill_user(sd_bus_message *message, void *userdata, sd_bus_error *error) { Manager *m = userdata; uint32_t uid; User *user; int r; - assert(bus); assert(message); assert(m); @@ -1011,16 +996,15 @@ static int method_kill_user(sd_bus *bus, sd_bus_message *message, void *userdata if (r < 0) return r; - return bus_user_method_kill(bus, message, user, error); + return bus_user_method_kill(message, user, error); } -static int method_terminate_session(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_terminate_session(sd_bus_message *message, void *userdata, sd_bus_error *error) { Manager *m = userdata; const char *name; Session *session; int r; - assert(bus); assert(message); assert(m); @@ -1032,16 +1016,15 @@ static int method_terminate_session(sd_bus *bus, sd_bus_message *message, void * if (r < 0) return r; - return bus_session_method_terminate(bus, message, session, error); + return bus_session_method_terminate(message, session, error); } -static int method_terminate_user(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_terminate_user(sd_bus_message *message, void *userdata, sd_bus_error *error) { Manager *m = userdata; uint32_t uid; User *user; int r; - assert(bus); assert(message); assert(m); @@ -1053,16 +1036,15 @@ static int method_terminate_user(sd_bus *bus, sd_bus_message *message, void *use if (r < 0) return r; - return bus_user_method_terminate(bus, message, user, error); + return bus_user_method_terminate(message, user, error); } -static int method_terminate_seat(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_terminate_seat(sd_bus_message *message, void *userdata, sd_bus_error *error) { Manager *m = userdata; const char *name; Seat *seat; int r; - assert(bus); assert(message); assert(m); @@ -1074,10 +1056,10 @@ static int method_terminate_seat(sd_bus *bus, sd_bus_message *message, void *use if (r < 0) return r; - return bus_seat_method_terminate(bus, message, seat, error); + return bus_seat_method_terminate(message, seat, error); } -static int method_set_user_linger(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_set_user_linger(sd_bus_message *message, void *userdata, sd_bus_error *error) { _cleanup_free_ char *cc = NULL; Manager *m = userdata; int b, r; @@ -1086,7 +1068,6 @@ static int method_set_user_linger(sd_bus *bus, sd_bus_message *message, void *us uint32_t uid; int interactive; - assert(bus); assert(message); assert(m); @@ -1266,12 +1247,11 @@ static int flush_devices(Manager *m) { return trigger_device(m, NULL); } -static int method_attach_device(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_attach_device(sd_bus_message *message, void *userdata, sd_bus_error *error) { const char *sysfs, *seat; Manager *m = userdata; int interactive, r; - assert(bus); assert(message); assert(m); @@ -1305,11 +1285,10 @@ static int method_attach_device(sd_bus *bus, sd_bus_message *message, void *user return sd_bus_reply_method_return(message, NULL); } -static int method_flush_devices(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_flush_devices(sd_bus_message *message, void *userdata, sd_bus_error *error) { Manager *m = userdata; int interactive, r; - assert(bus); assert(message); assert(m); @@ -1386,6 +1365,9 @@ static int bus_manager_log_shutdown( q = NULL; } + if (!isempty(m->wall_message)) + p = strjoina(p, " (", m->wall_message, ")"); + return log_struct(LOG_NOTICE, LOG_MESSAGE_ID(SD_MESSAGE_SHUTDOWN), p, @@ -1544,11 +1526,11 @@ static int delay_shutdown_or_sleep( if (m->inhibit_timeout_source) { r = sd_event_source_set_time(m->inhibit_timeout_source, timeout_val); if (r < 0) - return log_error_errno(r, "sd_event_source_set_time() failed: %m\n"); + return log_error_errno(r, "sd_event_source_set_time() failed: %m"); r = sd_event_source_set_enabled(m->inhibit_timeout_source, SD_EVENT_ONESHOT); if (r < 0) - return log_error_errno(r, "sd_event_source_set_enabled() failed: %m\n"); + return log_error_errno(r, "sd_event_source_set_enabled() failed: %m"); } else { r = sd_event_add_time(m->event, &m->inhibit_timeout_source, CLOCK_MONOTONIC, timeout_val, 0, manager_inhibit_timeout_handler, m); @@ -1728,7 +1710,7 @@ static int method_do_shutdown_or_sleep( return sd_bus_reply_method_return(message, NULL); } -static int method_poweroff(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_poweroff(sd_bus_message *message, void *userdata, sd_bus_error *error) { Manager *m = userdata; return method_do_shutdown_or_sleep( @@ -1742,7 +1724,7 @@ static int method_poweroff(sd_bus *bus, sd_bus_message *message, void *userdata, error); } -static int method_reboot(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_reboot(sd_bus_message *message, void *userdata, sd_bus_error *error) { Manager *m = userdata; return method_do_shutdown_or_sleep( @@ -1756,7 +1738,7 @@ static int method_reboot(sd_bus *bus, sd_bus_message *message, void *userdata, s error); } -static int method_suspend(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_suspend(sd_bus_message *message, void *userdata, sd_bus_error *error) { Manager *m = userdata; return method_do_shutdown_or_sleep( @@ -1770,6 +1752,80 @@ static int method_suspend(sd_bus *bus, sd_bus_message *message, void *userdata, error); } +static int nologin_timeout_handler( + sd_event_source *s, + uint64_t usec, + void *userdata) { + + Manager *m = userdata; + int r; + + log_info("Creating /run/nologin, blocking further logins..."); + + r = write_string_file_atomic("/run/nologin", "System is going down."); + if (r < 0) + log_error_errno(r, "Failed to create /run/nologin: %m"); + else + m->unlink_nologin = true; + + return 0; +} + +static int update_schedule_file(Manager *m) { + _cleanup_free_ char *temp_path = NULL; + _cleanup_fclose_ FILE *f = NULL; + int r; + + assert(m); + + r = mkdir_safe_label("/run/systemd/shutdown", 0755, 0, 0); + if (r < 0) + return log_error_errno(r, "Failed to create shutdown subdirectory: %m"); + + r = fopen_temporary("/run/systemd/shutdown/scheduled", &f, &temp_path); + if (r < 0) + return log_error_errno(r, "Failed to save information about scheduled shutdowns: %m"); + + (void) fchmod(fileno(f), 0644); + + fprintf(f, + "USEC="USEC_FMT"\n" + "WARN_WALL=%i\n" + "MODE=%s\n", + m->scheduled_shutdown_timeout, + m->enable_wall_messages, + m->scheduled_shutdown_type); + + if (!isempty(m->wall_message)) { + _cleanup_free_ char *t; + + t = cescape(m->wall_message); + if (!t) { + r = -ENOMEM; + goto fail; + } + + fprintf(f, "WALL_MESSAGE=%s\n", t); + } + + r = fflush_and_check(f); + if (r < 0) + goto fail; + + if (rename(temp_path, "/run/systemd/shutdown/scheduled") < 0) { + r = -errno; + goto fail; + } + + return 0; + +fail: + (void) unlink(temp_path); + (void) unlink("/run/systemd/shutdown/scheduled"); + + return log_error_errno(r, "Failed to write information about scheduled shutdowns: %m"); +} + static int manager_scheduled_shutdown_handler( sd_event_source *s, uint64_t usec, @@ -1794,12 +1850,12 @@ static int manager_scheduled_shutdown_handler( r = execute_shutdown_or_sleep(m, 0, target, &error); if (r < 0) - return log_error_errno(r, "Unable to execute transition to %s: %m\n", target); + return log_error_errno(r, "Unable to execute transition to %s: %m", target); return 0; } -static int method_schedule_shutdown(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_schedule_shutdown(sd_bus_message *message, void *userdata, sd_bus_error *error) { Manager *m = userdata; _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL; const char *action_multiple_sessions = NULL; @@ -1839,16 +1895,16 @@ static int method_schedule_shutdown(sd_bus *bus, sd_bus_message *message, void * if (m->scheduled_shutdown_timeout_source) { r = sd_event_source_set_time(m->scheduled_shutdown_timeout_source, elapse); if (r < 0) - return log_error_errno(r, "sd_event_source_set_time() failed: %m\n"); + return log_error_errno(r, "sd_event_source_set_time() failed: %m"); r = sd_event_source_set_enabled(m->scheduled_shutdown_timeout_source, SD_EVENT_ONESHOT); if (r < 0) - return log_error_errno(r, "sd_event_source_set_enabled() failed: %m\n"); + return log_error_errno(r, "sd_event_source_set_enabled() failed: %m"); } else { r = sd_event_add_time(m->event, &m->scheduled_shutdown_timeout_source, CLOCK_REALTIME, elapse, 0, manager_scheduled_shutdown_handler, m); if (r < 0) - return log_error_errno(r, "sd_event_add_time() failed: %m\n"); + return log_error_errno(r, "sd_event_add_time() failed: %m"); } r = free_and_strdup(&m->scheduled_shutdown_type, type); @@ -1857,6 +1913,21 @@ static int method_schedule_shutdown(sd_bus *bus, sd_bus_message *message, void * return log_oom(); } + if (m->nologin_timeout_source) { + r = sd_event_source_set_time(m->nologin_timeout_source, elapse); + if (r < 0) + return log_error_errno(r, "sd_event_source_set_time() failed: %m"); + + r = sd_event_source_set_enabled(m->nologin_timeout_source, SD_EVENT_ONESHOT); + if (r < 0) + return log_error_errno(r, "sd_event_source_set_enabled() failed: %m"); + } else { + r = sd_event_add_time(m->event, &m->nologin_timeout_source, + CLOCK_REALTIME, elapse - 5 * USEC_PER_MINUTE, 0, nologin_timeout_handler, m); + if (r < 0) + return log_error_errno(r, "sd_event_add_time() failed: %m"); + } + m->scheduled_shutdown_timeout = elapse; r = sd_bus_query_sender_creds(message, SD_BUS_CREDS_AUGMENT|SD_BUS_CREDS_TTY|SD_BUS_CREDS_UID, &creds); @@ -1877,10 +1948,17 @@ static int method_schedule_shutdown(sd_bus *bus, sd_bus_message *message, void * if (r < 0) return r; + if (!isempty(type)) { + r = update_schedule_file(m); + if (r < 0) + return r; + } else + (void) unlink("/run/systemd/shutdown/scheduled"); + return sd_bus_reply_method_return(message, NULL); } -static int method_cancel_scheduled_shutdown(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_cancel_scheduled_shutdown(sd_bus_message *message, void *userdata, sd_bus_error *error) { Manager *m = userdata; bool cancelled; @@ -1891,6 +1969,7 @@ static int method_cancel_scheduled_shutdown(sd_bus *bus, sd_bus_message *message m->scheduled_shutdown_timeout_source = sd_event_source_unref(m->scheduled_shutdown_timeout_source); m->wall_message_timeout_source = sd_event_source_unref(m->wall_message_timeout_source); + m->nologin_timeout_source = sd_event_source_unref(m->nologin_timeout_source); free(m->scheduled_shutdown_type); m->scheduled_shutdown_type = NULL; m->scheduled_shutdown_timeout = 0; @@ -1914,7 +1993,7 @@ static int method_cancel_scheduled_shutdown(sd_bus *bus, sd_bus_message *message return sd_bus_reply_method_return(message, "b", cancelled); } -static int method_hibernate(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_hibernate(sd_bus_message *message, void *userdata, sd_bus_error *error) { Manager *m = userdata; return method_do_shutdown_or_sleep( @@ -1928,7 +2007,7 @@ static int method_hibernate(sd_bus *bus, sd_bus_message *message, void *userdata error); } -static int method_hybrid_sleep(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_hybrid_sleep(sd_bus_message *message, void *userdata, sd_bus_error *error) { Manager *m = userdata; return method_do_shutdown_or_sleep( @@ -2034,7 +2113,7 @@ static int method_can_shutdown_or_sleep( return sd_bus_reply_method_return(message, "s", result); } -static int method_can_poweroff(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_can_poweroff(sd_bus_message *message, void *userdata, sd_bus_error *error) { Manager *m = userdata; return method_can_shutdown_or_sleep( @@ -2047,7 +2126,7 @@ static int method_can_poweroff(sd_bus *bus, sd_bus_message *message, void *userd error); } -static int method_can_reboot(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_can_reboot(sd_bus_message *message, void *userdata, sd_bus_error *error) { Manager *m = userdata; return method_can_shutdown_or_sleep( @@ -2060,7 +2139,7 @@ static int method_can_reboot(sd_bus *bus, sd_bus_message *message, void *userdat error); } -static int method_can_suspend(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_can_suspend(sd_bus_message *message, void *userdata, sd_bus_error *error) { Manager *m = userdata; return method_can_shutdown_or_sleep( @@ -2073,7 +2152,7 @@ static int method_can_suspend(sd_bus *bus, sd_bus_message *message, void *userda error); } -static int method_can_hibernate(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_can_hibernate(sd_bus_message *message, void *userdata, sd_bus_error *error) { Manager *m = userdata; return method_can_shutdown_or_sleep( @@ -2086,7 +2165,7 @@ static int method_can_hibernate(sd_bus *bus, sd_bus_message *message, void *user error); } -static int method_can_hybrid_sleep(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_can_hybrid_sleep(sd_bus_message *message, void *userdata, sd_bus_error *error) { Manager *m = userdata; return method_can_shutdown_or_sleep( @@ -2121,7 +2200,6 @@ static int property_get_reboot_to_firmware_setup( } static int method_set_reboot_to_firmware_setup( - sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { @@ -2129,7 +2207,6 @@ static int method_set_reboot_to_firmware_setup( int b, r; Manager *m = userdata; - assert(bus); assert(message); assert(m); @@ -2157,7 +2234,6 @@ static int method_set_reboot_to_firmware_setup( } static int method_can_reboot_to_firmware_setup( - sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { @@ -2167,7 +2243,6 @@ static int method_can_reboot_to_firmware_setup( const char *result; Manager *m = userdata; - assert(bus); assert(message); assert(m); @@ -2196,7 +2271,49 @@ static int method_can_reboot_to_firmware_setup( return sd_bus_reply_method_return(message, "s", result); } -static int method_inhibit(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +static int method_set_wall_message( + sd_bus_message *message, + void *userdata, + sd_bus_error *error) { + + int r; + Manager *m = userdata; + char *wall_message; + int enable_wall_messages; + + assert(message); + assert(m); + + r = sd_bus_message_read(message, "sb", &wall_message, &enable_wall_messages); + if (r < 0) + return r; + + r = bus_verify_polkit_async(message, + CAP_SYS_ADMIN, + "org.freedesktop.login1.set-wall-message", + false, + UID_INVALID, + &m->polkit_registry, + error); + if (r < 0) + return r; + if (r == 0) + return 1; /* Will call us back */ + + if (isempty(wall_message)) + m->wall_message = mfree(m->wall_message); + else { + r = free_and_strdup(&m->wall_message, wall_message); + if (r < 0) + return log_oom(); + } + + m->enable_wall_messages = enable_wall_messages; + + return sd_bus_reply_method_return(message, NULL); +} + +static int method_inhibit(sd_bus_message *message, void *userdata, sd_bus_error *error) { _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL; const char *who, *why, *what, *mode; _cleanup_free_ char *id = NULL; @@ -2209,7 +2326,6 @@ static int method_inhibit(sd_bus *bus, sd_bus_message *message, void *userdata, uid_t uid; int r; - assert(bus); assert(message); assert(m); @@ -2268,8 +2384,7 @@ static int method_inhibit(sd_bus *bus, sd_bus_message *message, void *userdata, return r; do { - free(id); - id = NULL; + id = mfree(id); if (asprintf(&id, "%lu", ++m->inhibit_counter) < 0) return -ENOMEM; @@ -2378,6 +2493,7 @@ const sd_bus_vtable manager_vtable[] = { SD_BUS_METHOD("Inhibit", "ssss", "h", method_inhibit, SD_BUS_VTABLE_UNPRIVILEGED), SD_BUS_METHOD("CanRebootToFirmwareSetup", NULL, "s", method_can_reboot_to_firmware_setup, SD_BUS_VTABLE_UNPRIVILEGED), SD_BUS_METHOD("SetRebootToFirmwareSetup", "b", NULL, method_set_reboot_to_firmware_setup, SD_BUS_VTABLE_UNPRIVILEGED), + SD_BUS_METHOD("SetWallMessage", "sb", NULL, method_set_wall_message, SD_BUS_VTABLE_UNPRIVILEGED), SD_BUS_SIGNAL("SessionNew", "so", 0), SD_BUS_SIGNAL("SessionRemoved", "so", 0), @@ -2412,7 +2528,7 @@ static int session_jobs_reply(Session *s, const char *unit, const char *result) return r; } -int match_job_removed(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +int match_job_removed(sd_bus_message *message, void *userdata, sd_bus_error *error) { const char *path, *result, *unit; Manager *m = userdata; Session *session; @@ -2420,14 +2536,13 @@ int match_job_removed(sd_bus *bus, sd_bus_message *message, void *userdata, sd_b User *user; int r; - assert(bus); assert(message); assert(m); r = sd_bus_message_read(message, "uoss", &id, &path, &unit, &result); if (r < 0) { bus_log_parse_error(r); - return r; + return 0; } if (m->action_job && streq(m->action_job, path)) { @@ -2436,8 +2551,7 @@ int match_job_removed(sd_bus *bus, sd_bus_message *message, void *userdata, sd_b /* Tell people that they now may take a lock again */ send_prepare_for(m, m->action_what, false); - free(m->action_job); - m->action_job = NULL; + m->action_job = mfree(m->action_job); m->action_unit = NULL; m->action_what = 0; return 0; @@ -2446,10 +2560,8 @@ int match_job_removed(sd_bus *bus, sd_bus_message *message, void *userdata, sd_b session = hashmap_get(m->session_units, unit); if (session) { - if (streq_ptr(path, session->scope_job)) { - free(session->scope_job); - session->scope_job = NULL; - } + if (streq_ptr(path, session->scope_job)) + session->scope_job = mfree(session->scope_job); session_jobs_reply(session, unit, result); @@ -2460,19 +2572,14 @@ int match_job_removed(sd_bus *bus, sd_bus_message *message, void *userdata, sd_b user = hashmap_get(m->user_units, unit); if (user) { - if (streq_ptr(path, user->service_job)) { - free(user->service_job); - user->service_job = NULL; - } + if (streq_ptr(path, user->service_job)) + user->service_job = mfree(user->service_job); - if (streq_ptr(path, user->slice_job)) { - free(user->slice_job); - user->slice_job = NULL; - } + if (streq_ptr(path, user->slice_job)) + user->slice_job = mfree(user->slice_job); - LIST_FOREACH(sessions_by_user, session, user->sessions) { + LIST_FOREACH(sessions_by_user, session, user->sessions) session_jobs_reply(session, unit, result); - } user_save(user); user_add_to_gc_queue(user); @@ -2481,21 +2588,20 @@ int match_job_removed(sd_bus *bus, sd_bus_message *message, void *userdata, sd_b return 0; } -int match_unit_removed(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +int match_unit_removed(sd_bus_message *message, void *userdata, sd_bus_error *error) { const char *path, *unit; Manager *m = userdata; Session *session; User *user; int r; - assert(bus); assert(message); assert(m); r = sd_bus_message_read(message, "so", &unit, &path); if (r < 0) { bus_log_parse_error(r); - return r; + return 0; } session = hashmap_get(m->session_units, unit); @@ -2509,7 +2615,7 @@ int match_unit_removed(sd_bus *bus, sd_bus_message *message, void *userdata, sd_ return 0; } -int match_properties_changed(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +int match_properties_changed(sd_bus_message *message, void *userdata, sd_bus_error *error) { _cleanup_free_ char *unit = NULL; Manager *m = userdata; const char *path; @@ -2517,7 +2623,6 @@ int match_properties_changed(sd_bus *bus, sd_bus_message *message, void *userdat User *user; int r; - assert(bus); assert(message); assert(m); @@ -2528,8 +2633,10 @@ int match_properties_changed(sd_bus *bus, sd_bus_message *message, void *userdat r = unit_name_from_dbus_path(path, &unit); if (r == -EINVAL) /* not a unit */ return 0; - if (r < 0) - return r; + if (r < 0) { + log_oom(); + return 0; + } session = hashmap_get(m->session_units, unit); if (session) @@ -2542,18 +2649,19 @@ int match_properties_changed(sd_bus *bus, sd_bus_message *message, void *userdat return 0; } -int match_reloading(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { +int match_reloading(sd_bus_message *message, void *userdata, sd_bus_error *error) { Manager *m = userdata; Session *session; Iterator i; int b, r; - assert(bus); + assert(message); + assert(m); r = sd_bus_message_read(message, "b", &b); if (r < 0) { bus_log_parse_error(r); - return r; + return 0; } if (b) @@ -2568,40 +2676,6 @@ int match_reloading(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus return 0; } -int match_name_owner_changed(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { - const char *name, *old, *new; - Manager *m = userdata; - Session *session; - Iterator i; - int r; - - - char *key; - - r = sd_bus_message_read(message, "sss", &name, &old, &new); - if (r < 0) { - bus_log_parse_error(r); - return r; - } - - if (isempty(old) || !isempty(new)) - return 0; - - key = set_remove(m->busnames, (char*) old); - if (!key) - return 0; - - /* Drop all controllers owned by this name */ - - free(key); - - HASHMAP_FOREACH(session, m->sessions, i) - if (session_is_controller(session, old)) - session_drop_controller(session); - - return 0; -} - int manager_send_changed(Manager *manager, const char *property, ...) { char **l;