diff options
Diffstat (limited to 'src/login')
-rw-r--r-- | src/login/.gitignore | 1 | ||||
-rw-r--r-- | src/login/70-power-switch.rules | 2 | ||||
-rw-r--r-- | src/login/elogind-user.m4 (renamed from src/login/elogind-user) | 5 | ||||
-rw-r--r-- | src/login/inhibit.c | 4 | ||||
-rw-r--r-- | src/login/loginctl.c | 162 | ||||
-rw-r--r-- | src/login/logind-action.c | 1 | ||||
-rw-r--r-- | src/login/logind-action.h | 2 | ||||
-rw-r--r-- | src/login/logind-button.c | 14 | ||||
-rw-r--r-- | src/login/logind-dbus.c | 2 | ||||
-rw-r--r-- | src/login/logind-session.c | 23 | ||||
-rw-r--r-- | src/login/logind-user.c | 14 | ||||
-rw-r--r-- | src/login/logind.c | 2 | ||||
-rw-r--r-- | src/login/pam_elogind.c | 2 | ||||
-rw-r--r-- | src/login/sysfs-show.c | 2 |
14 files changed, 191 insertions, 45 deletions
diff --git a/src/login/.gitignore b/src/login/.gitignore index 5c0b2ac68..bc9ac41a2 100644 --- a/src/login/.gitignore +++ b/src/login/.gitignore @@ -2,3 +2,4 @@ /org.freedesktop.login1.policy /71-seat.rules /73-seat-late.rules +/elogind-user diff --git a/src/login/70-power-switch.rules b/src/login/70-power-switch.rules index 36d2a3eb4..e2855b50f 100644 --- a/src/login/70-power-switch.rules +++ b/src/login/70-power-switch.rules @@ -13,6 +13,6 @@ SUBSYSTEM=="input", KERNEL=="event*", ATTRS{name}=="twl4030_pwrbutton", TAG+="po SUBSYSTEM=="input", KERNEL=="event*", ATTRS{name}=="tps65217_pwr_but", TAG+="power-switch" SUBSYSTEM=="input", KERNEL=="event*", ATTRS{name}=="* WMI hotkeys", TAG+="power-switch" SUBSYSTEM=="input", KERNEL=="event*", \ - SUBSYSTEMS=="platform", DRIVERS=="gpio-keys", ATTRS{keys}=="116", TAG+="power-switch" + SUBSYSTEMS=="platform", DRIVERS=="gpio-keys", ATTRS{keys}=="*,116|116,*|116|*,116,*", TAG+="power-switch" LABEL="power_switch_end" diff --git a/src/login/elogind-user b/src/login/elogind-user.m4 index 8112d7464..7933508f2 100644 --- a/src/login/elogind-user +++ b/src/login/elogind-user.m4 @@ -3,4 +3,9 @@ # Used by systemd --user instances. account include system-auth + +m4_ifdef(`HAVE_SELINUX', +session required pam_selinux.so close +session required pam_selinux.so nottys open +)m4_dnl session include system-auth diff --git a/src/login/inhibit.c b/src/login/inhibit.c index 89e529d01..bfee1ca06 100644 --- a/src/login/inhibit.c +++ b/src/login/inhibit.c @@ -179,9 +179,7 @@ static int parse_argv(int argc, char *argv[]) { return 0; case ARG_VERSION: - puts(PACKAGE_STRING); - puts(SYSTEMD_FEATURES); - return 0; + return version(); case ARG_WHAT: arg_what = optarg; diff --git a/src/login/loginctl.c b/src/login/loginctl.c index babfa349c..ce0adc45c 100644 --- a/src/login/loginctl.c +++ b/src/login/loginctl.c @@ -37,8 +37,8 @@ #include "strv.h" #include "unit-name.h" #include "sysfs-show.h" -// #include "logs-show.h" -#include "cgroup-show.h" +//#include "logs-show.h" +//#include "cgroup-show.h" #include "cgroup-util.h" #include "spawn-polkit-agent.h" #include "verbs.h" @@ -712,19 +712,165 @@ static int print_seat_status_info(sd_bus *bus, const char *path, bool *new_line) return 0; } +static int print_property(const char *name, sd_bus_message *m, const char *contents) { + int r; + + assert(name); + assert(m); + assert(contents); + + if (arg_property && !strv_find(arg_property, name)) + /* skip what we didn't read */ + return sd_bus_message_skip(m, contents); + + switch (contents[0]) { + + case SD_BUS_TYPE_STRUCT_BEGIN: + + if (contents[1] == SD_BUS_TYPE_STRING && STR_IN_SET(name, "Display", "Seat", "ActiveSession")) { + const char *s; + + r = sd_bus_message_read(m, "(so)", &s, NULL); + if (r < 0) + return bus_log_parse_error(r); + + if (arg_all || !isempty(s)) + printf("%s=%s\n", name, s); + + return 0; + + } else if (contents[1] == SD_BUS_TYPE_UINT32 && streq(name, "User")) { + uint32_t uid; + + r = sd_bus_message_read(m, "(uo)", &uid, NULL); + if (r < 0) + return bus_log_parse_error(r); + + if (!uid_is_valid(uid)) { + log_error("Invalid user ID: " UID_FMT, uid); + return -EINVAL; + } + + printf("%s=" UID_FMT "\n", name, uid); + + return 0; + } + + break; + + case SD_BUS_TYPE_ARRAY: + + if (contents[1] == SD_BUS_TYPE_STRUCT_BEGIN && streq(name, "Sessions")) { + const char *s; + bool space = false; + + r = sd_bus_message_enter_container(m, SD_BUS_TYPE_ARRAY, "(so)"); + if (r < 0) + return bus_log_parse_error(r); + + printf("%s=", name); + + while ((r = sd_bus_message_read(m, "(so)", &s, NULL)) > 0) { + printf("%s%s", space ? " " : "", s); + space = true; + } + + printf("\n"); + + if (r < 0) + return bus_log_parse_error(r); + + r = sd_bus_message_exit_container(m); + if (r < 0) + return bus_log_parse_error(r); + + return 0; + } + + break; + } + + r = bus_print_property(name, m, arg_all); + if (r < 0) + return bus_log_parse_error(r); + + if (r == 0) { + r = sd_bus_message_skip(m, contents); + if (r < 0) + return bus_log_parse_error(r); + + if (arg_all) + printf("%s=[unprintable]\n", name); + } + + return 0; +} + static int show_properties(sd_bus *bus, const char *path, bool *new_line) { + _cleanup_bus_message_unref_ sd_bus_message *reply = NULL; + _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; int r; + assert(bus); + assert(path); + assert(new_line); + + r = sd_bus_call_method( + bus, + "org.freedesktop.login1", + path, + "org.freedesktop.DBus.Properties", + "GetAll", + &error, + &reply, + "s", ""); + if (r < 0) + return log_error_errno(r, "Failed to get properties: %s", bus_error_message(&error, r)); + + r = sd_bus_message_enter_container(reply, SD_BUS_TYPE_ARRAY, "{sv}"); + if (r < 0) + return bus_log_parse_error(r); + if (*new_line) printf("\n"); *new_line = true; - r = bus_print_all_properties(bus, "org.freedesktop.login1", path, arg_property, arg_all); + while ((r = sd_bus_message_enter_container(reply, SD_BUS_TYPE_DICT_ENTRY, "sv")) > 0) { + const char *name, *contents; + + r = sd_bus_message_read(reply, "s", &name); + if (r < 0) + return bus_log_parse_error(r); + + r = sd_bus_message_peek_type(reply, NULL, &contents); + if (r < 0) + return bus_log_parse_error(r); + + r = sd_bus_message_enter_container(reply, SD_BUS_TYPE_VARIANT, contents); + if (r < 0) + return bus_log_parse_error(r); + + r = print_property(name, reply, contents); + if (r < 0) + return r; + + r = sd_bus_message_exit_container(reply); + if (r < 0) + return bus_log_parse_error(r); + + r = sd_bus_message_exit_container(reply); + if (r < 0) + return bus_log_parse_error(r); + } if (r < 0) - log_error_errno(r, "Could not get properties: %m"); + return bus_log_parse_error(r); - return r; + r = sd_bus_message_exit_container(reply); + if (r < 0) + return bus_log_parse_error(r); + + return 0; } static int show_session(int argc, char *argv[], void *userdata) { @@ -1557,9 +1703,7 @@ static int parse_argv(int argc, char *argv[]) { return 0; case ARG_VERSION: - puts(PACKAGE_STRING); - puts(SYSTEMD_FEATURES); - return 0; + return version(); case 'p': { r = strv_extend(&arg_property, optarg); @@ -1700,7 +1844,7 @@ int main(int argc, char *argv[]) { if (r <= 0) goto finish; - r = bus_open_transport(arg_transport, arg_host, false, &bus); + r = bus_connect_transport(arg_transport, arg_host, false, &bus); if (r < 0) { log_error_errno(r, "Failed to create bus connection: %m"); goto finish; diff --git a/src/login/logind-action.c b/src/login/logind-action.c index 5406cd45b..9b2ec6e24 100644 --- a/src/login/logind-action.c +++ b/src/login/logind-action.c @@ -154,7 +154,6 @@ int manager_handle_action( offending->uid, strna(u), offending->pid, strna(comm)); - warn_melody(); return -EPERM; } diff --git a/src/login/logind-action.h b/src/login/logind-action.h index 99b06bff8..6b63b92d3 100644 --- a/src/login/logind-action.h +++ b/src/login/logind-action.h @@ -22,7 +22,7 @@ ***/ typedef enum HandleAction { - HANDLE_IGNORE, + HANDLE_IGNORE = 0, HANDLE_POWEROFF, HANDLE_REBOOT, HANDLE_HALT, diff --git a/src/login/logind-button.c b/src/login/logind-button.c index 210b889c4..f40e35a8c 100644 --- a/src/login/logind-button.c +++ b/src/login/logind-button.c @@ -66,12 +66,11 @@ void button_free(Button *b) { sd_event_source_unref(b->io_event_source); sd_event_source_unref(b->check_event_source); - if (b->fd >= 0) { + if (b->fd >= 0) /* If the device has been unplugged close() returns * ENODEV, let's ignore this, hence we don't use * safe_close() */ (void) close(b->fd); - } free(b->name); free(b->seat); @@ -239,10 +238,7 @@ int button_open(Button *b) { assert(b); - if (b->fd >= 0) { - close(b->fd); - b->fd = -1; - } + b->fd = safe_close(b->fd); p = strjoina("/dev/input/", b->name); @@ -251,8 +247,7 @@ int button_open(Button *b) { return log_warning_errno(errno, "Failed to open %s: %m", b->name); if (ioctl(b->fd, EVIOCGNAME(sizeof(name)), name) < 0) { - log_error_errno(errno, "Failed to get input name: %m"); - r = -errno; + r = log_error_errno(errno, "Failed to get input name: %m"); goto fail; } @@ -267,8 +262,7 @@ int button_open(Button *b) { return 0; fail: - close(b->fd); - b->fd = -1; + b->fd = safe_close(b->fd); return r; } diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c index e59795eed..0c1f90dea 100644 --- a/src/login/logind-dbus.c +++ b/src/login/logind-dbus.c @@ -1528,7 +1528,7 @@ int manager_dispatch_delayed(Manager *manager, bool timeout) { assert(manager); - if (manager->action_what == 0) + if ( (0 == manager->action_what) || (HANDLE_IGNORE == manager->pending_action) ) return 0; if (manager_is_inhibited(manager, manager->action_what, INHIBIT_DELAY, NULL, false, false, 0, &offending)) { diff --git a/src/login/logind-session.c b/src/login/logind-session.c index 016886805..ca1ea5868 100644 --- a/src/login/logind-session.c +++ b/src/login/logind-session.c @@ -530,7 +530,7 @@ static int session_start_scope(Session *s) { if (!scope) return log_oom(); - r = manager_start_scope(s->manager, scope, s->leader, s->user->slice, description, "logind.service", "systemd-user-sessions.service", &error, &job); + r = manager_start_scope(s->manager, scope, s->leader, s->user->slice, description, "systemd-logind.service", "systemd-user-sessions.service", &error, &job); if (r < 0) { log_error("Failed to start session scope %s: %s %s", scope, bus_error_message(&error, r), error.name); @@ -538,6 +538,7 @@ static int session_start_scope(Session *s) { return r; } else { s->scope = scope; + free(s->scope_job); s->scope_job = job; } @@ -1109,22 +1110,25 @@ int session_prepare_vt(Session *s) { r = fchown(vt, s->user->uid, -1); if (r < 0) { - r = -errno; - log_error_errno(errno, "Cannot change owner of /dev/tty%u: %m", s->vtnr); + r = log_error_errno(errno, + "Cannot change owner of /dev/tty%u: %m", + s->vtnr); goto error; } r = ioctl(vt, KDSKBMODE, K_OFF); if (r < 0) { - r = -errno; - log_error_errno(errno, "Cannot set K_OFF on /dev/tty%u: %m", s->vtnr); + r = log_error_errno(errno, + "Cannot set K_OFF on /dev/tty%u: %m", + s->vtnr); goto error; } r = ioctl(vt, KDSETMODE, KD_GRAPHICS); if (r < 0) { - r = -errno; - log_error_errno(errno, "Cannot set KD_GRAPHICS on /dev/tty%u: %m", s->vtnr); + r = log_error_errno(errno, + "Cannot set KD_GRAPHICS on /dev/tty%u: %m", + s->vtnr); goto error; } @@ -1136,8 +1140,9 @@ int session_prepare_vt(Session *s) { mode.acqsig = SIGRTMIN + 1; r = ioctl(vt, VT_SETMODE, &mode); if (r < 0) { - r = -errno; - log_error_errno(errno, "Cannot set VT_PROCESS on /dev/tty%u: %m", s->vtnr); + r = log_error_errno(errno, + "Cannot set VT_PROCESS on /dev/tty%u: %m", + s->vtnr); goto error; } diff --git a/src/login/logind-user.c b/src/login/logind-user.c index 63adc8210..0f7f31aa8 100644 --- a/src/login/logind-user.c +++ b/src/login/logind-user.c @@ -925,26 +925,26 @@ int config_parse_tmpfs_size( errno = 0; ul = strtoul(rvalue, &f, 10); if (errno != 0 || f != e) { - log_syntax(unit, LOG_ERR, filename, line, errno ? errno : EINVAL, "Failed to parse percentage value, ignoring: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, errno, "Failed to parse percentage value, ignoring: %s", rvalue); return 0; } if (ul <= 0 || ul >= 100) { - log_syntax(unit, LOG_ERR, filename, line, errno ? errno : EINVAL, "Percentage value out of range, ignoring: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, 0, "Percentage value out of range, ignoring: %s", rvalue); return 0; } *sz = PAGE_ALIGN((size_t) ((physical_memory() * (uint64_t) ul) / (uint64_t) 100)); } else { - off_t o; + uint64_t k; - r = parse_size(rvalue, 1024, &o); - if (r < 0 || (off_t) (size_t) o != o) { - log_syntax(unit, LOG_ERR, filename, line, r < 0 ? -r : ERANGE, "Failed to parse size value, ignoring: %s", rvalue); + r = parse_size(rvalue, 1024, &k); + if (r < 0 || (uint64_t) (size_t) k != k) { + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse size value, ignoring: %s", rvalue); return 0; } - *sz = PAGE_ALIGN((size_t) o); + *sz = PAGE_ALIGN((size_t) k); } return 0; diff --git a/src/login/logind.c b/src/login/logind.c index 9e637c741..2e4342b0a 100644 --- a/src/login/logind.c +++ b/src/login/logind.c @@ -218,7 +218,7 @@ static void manager_free(Manager *m) { /* Avoid the creation of new processes forked by the * kernel; at this point, we will not listen to the * signals anyway */ - if (detect_container(NULL) <= 0) + if (detect_container() <= 0) (void) cg_uninstall_release_agent(SYSTEMD_CGROUP_CONTROLLER); manager_shutdown_cgroup(m, true); diff --git a/src/login/pam_elogind.c b/src/login/pam_elogind.c index 7ccaec56f..f66f1ce84 100644 --- a/src/login/pam_elogind.c +++ b/src/login/pam_elogind.c @@ -257,7 +257,7 @@ _public_ PAM_EXTERN int pam_sm_open_session( } /* Make sure we don't enter a loop by talking to - * logind when it is actually waiting for the + * systemd-logind when it is actually waiting for the * background to finish start-up. If the service is * "systemd-user" we simply set XDG_RUNTIME_DIR and * leave. */ diff --git a/src/login/sysfs-show.c b/src/login/sysfs-show.c index 9a9fb7622..f38f06baf 100644 --- a/src/login/sysfs-show.c +++ b/src/login/sysfs-show.c @@ -114,7 +114,7 @@ static int show_sysfs_one( "%s%s:%s%s%s%s", is_master ? "[MASTER] " : "", subsystem, sysname, - name ? " \"" : "", name ? name : "", name ? "\"" : "") < 0) + name ? " \"" : "", strempty(name), name ? "\"" : "") < 0) return -ENOMEM; free(k); |