diff options
author | Thorsten Kukuk <kukuk@suse.com> | 2023-04-19 16:11:55 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2023-04-25 14:33:09 +0200 |
commit | 092e6cd19adf1ff6bc979034cbe287d92ca2efd7 (patch) | |
tree | fb8a9dd07a7cac3eca66d463962892d6f2640eac /src/login/logind-session-dbus.c | |
parent | 4d26b2277a9a982b8c061d7da2300b266161b716 (diff) | |
download | systemd-092e6cd19adf1ff6bc979034cbe287d92ca2efd7.tar.gz |
sd-login: add SetTTY session object #26611
Diffstat (limited to 'src/login/logind-session-dbus.c')
-rw-r--r-- | src/login/logind-session-dbus.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/login/logind-session-dbus.c b/src/login/logind-session-dbus.c index e3bebc9188..00a0e8fd58 100644 --- a/src/login/logind-session-dbus.c +++ b/src/login/logind-session-dbus.c @@ -23,6 +23,7 @@ #include "path-util.h" #include "signal-util.h" #include "strv.h" +#include "terminal-util.h" #include "user-util.h" static int property_get_user( @@ -421,6 +422,41 @@ static int method_set_display(sd_bus_message *message, void *userdata, sd_bus_er return sd_bus_reply_method_return(message, NULL); } +static int method_set_tty(sd_bus_message *message, void *userdata, sd_bus_error *error) { + Session *s = ASSERT_PTR(userdata); + int fd, r, flags; + _cleanup_free_ char *q = NULL; + + assert(message); + + r = sd_bus_message_read(message, "h", &fd); + if (r < 0) + return r; + + if (!session_is_controller(s, sd_bus_message_get_sender(message))) + return sd_bus_error_set(error, BUS_ERROR_NOT_IN_CONTROL, "You must be in control of this session to set tty"); + + assert(fd >= 0); + + flags = fcntl(fd, F_GETFL, 0); + if (flags < 0) + return -errno; + if ((flags & O_ACCMODE) != O_RDWR) + return -EACCES; + if (FLAGS_SET(flags, O_PATH)) + return -ENOTTY; + + r = getttyname_malloc(fd, &q); + if (r < 0) + return r; + + r = session_set_tty(s, q); + if (r < 0) + return r; + + return sd_bus_reply_method_return(message, NULL); +} + static int method_take_device(sd_bus_message *message, void *userdata, sd_bus_error *error) { Session *s = ASSERT_PTR(userdata); uint32_t major, minor; @@ -909,6 +945,11 @@ static const sd_bus_vtable session_vtable[] = { SD_BUS_NO_RESULT, method_set_display, SD_BUS_VTABLE_UNPRIVILEGED), + SD_BUS_METHOD_WITH_ARGS("SetTTY", + SD_BUS_ARGS("h", tty_fd), + SD_BUS_NO_RESULT, + method_set_tty, + SD_BUS_VTABLE_UNPRIVILEGED), SD_BUS_METHOD_WITH_ARGS("TakeDevice", SD_BUS_ARGS("u", major, "u", minor), SD_BUS_RESULT("h", fd, "b", inactive), |