diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/dbus-execute.c | 8 | ||||
-rw-r--r-- | src/core/execute.c | 30 | ||||
-rw-r--r-- | src/core/execute.h | 3 | ||||
-rw-r--r-- | src/core/load-fragment-gperf.gperf.in | 2 | ||||
-rw-r--r-- | src/core/load-fragment.c | 26 | ||||
-rw-r--r-- | src/core/load-fragment.h | 1 |
6 files changed, 65 insertions, 5 deletions
diff --git a/src/core/dbus-execute.c b/src/core/dbus-execute.c index 3645e680fe..afb2d8f10f 100644 --- a/src/core/dbus-execute.c +++ b/src/core/dbus-execute.c @@ -1230,6 +1230,8 @@ const sd_bus_vtable bus_exec_vtable[] = { SD_BUS_PROPERTY("TTYReset", "b", bus_property_get_bool, offsetof(ExecContext, tty_reset), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("TTYVHangup", "b", bus_property_get_bool, offsetof(ExecContext, tty_vhangup), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("TTYVTDisallocate", "b", bus_property_get_bool, offsetof(ExecContext, tty_vt_disallocate), SD_BUS_VTABLE_PROPERTY_CONST), + SD_BUS_PROPERTY("TTYRows", "q", bus_property_get_unsigned, offsetof(ExecContext, tty_rows), SD_BUS_VTABLE_PROPERTY_CONST), + SD_BUS_PROPERTY("TTYColumns", "q", bus_property_get_unsigned, offsetof(ExecContext, tty_cols), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("SyslogPriority", "i", bus_property_get_int, offsetof(ExecContext, syslog_priority), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("SyslogIdentifier", "s", NULL, offsetof(ExecContext, syslog_identifier), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("SyslogLevelPrefix", "b", bus_property_get_bool, offsetof(ExecContext, syslog_level_prefix), SD_BUS_VTABLE_PROPERTY_CONST), @@ -1860,6 +1862,12 @@ int bus_exec_context_set_transient_property( if (streq(name, "TTYVTDisallocate")) return bus_set_transient_bool(u, name, &c->tty_vt_disallocate, message, flags, error); + if (streq(name, "TTYRows")) + return bus_set_transient_unsigned(u, name, &c->tty_rows, message, flags, error); + + if (streq(name, "TTYColumns")) + return bus_set_transient_unsigned(u, name, &c->tty_cols, message, flags, error); + if (streq(name, "PrivateTmp")) return bus_set_transient_bool(u, name, &c->private_tmp, message, flags, error); diff --git a/src/core/execute.c b/src/core/execute.c index 26f847c1b0..425e3e5a37 100644 --- a/src/core/execute.c +++ b/src/core/execute.c @@ -213,6 +213,9 @@ static void exec_context_tty_reset(const ExecContext *context, const ExecParamet (void) reset_terminal(path); } + if (p && p->stdin_fd >= 0) + (void) terminal_set_size_fd(p->stdin_fd, path, context->tty_rows, context->tty_cols); + if (context->tty_vt_disallocate && path) (void) vt_disallocate(path); } @@ -466,6 +469,7 @@ static int setup_input( const int named_iofds[static 3]) { ExecInput i; + int r; assert(context); assert(params); @@ -479,6 +483,7 @@ static int setup_input( if (isatty(STDIN_FILENO)) { (void) ioctl(STDIN_FILENO, TIOCSCTTY, context->std_input == EXEC_INPUT_TTY_FORCE); (void) reset_terminal_fd(STDIN_FILENO, true); + (void) terminal_set_size_fd(STDIN_FILENO, NULL, context->tty_rows, context->tty_cols); } return STDIN_FILENO; @@ -504,6 +509,10 @@ static int setup_input( if (fd < 0) return fd; + r = terminal_set_size_fd(fd, exec_context_tty_path(context), context->tty_rows, context->tty_cols); + if (r < 0) + return r; + return move_fd(fd, STDIN_FILENO, false); } @@ -757,6 +766,7 @@ static int chown_terminal(int fd, uid_t uid) { } static int setup_confirm_stdio( + const ExecContext *context, const char *vc, int *ret_saved_stdin, int *ret_saved_stdout) { @@ -787,6 +797,10 @@ static int setup_confirm_stdio( if (r < 0) return r; + r = terminal_set_size_fd(fd, vc, context->tty_rows, context->tty_cols); + if (r < 0) + return r; + r = rearrange_stdio(fd, fd, STDERR_FILENO); /* Invalidates 'fd' also on failure */ TAKE_FD(fd); if (r < 0) @@ -848,13 +862,13 @@ enum { CONFIRM_EXECUTE = 1, }; -static int ask_for_confirmation(const char *vc, Unit *u, const char *cmdline) { +static int ask_for_confirmation(const ExecContext *context, const char *vc, Unit *u, const char *cmdline) { int saved_stdout = -1, saved_stdin = -1, r; _cleanup_free_ char *e = NULL; char c; /* For any internal errors, assume a positive response. */ - r = setup_confirm_stdio(vc, &saved_stdin, &saved_stdout); + r = setup_confirm_stdio(context, vc, &saved_stdin, &saved_stdout); if (r < 0) { write_confirm_error(r, vc, u); return CONFIRM_EXECUTE; @@ -3994,7 +4008,7 @@ static int exec_child( return log_oom(); } - r = ask_for_confirmation(vc, unit, cmdline); + r = ask_for_confirmation(context, vc, unit, cmdline); if (r != CONFIRM_EXECUTE) { if (r == CONFIRM_PRETEND_SUCCESS) { *exit_status = EXIT_SUCCESS; @@ -5066,6 +5080,8 @@ void exec_context_init(ExecContext *c) { #if HAVE_SECCOMP c->syscall_errno = SECCOMP_ERROR_NUMBER_KILL; #endif + c->tty_rows = UINT_MAX; + c->tty_cols = UINT_MAX; numa_policy_reset(&c->numa_policy); } @@ -5705,11 +5721,15 @@ void exec_context_dump(const ExecContext *c, FILE* f, const char *prefix) { "%sTTYPath: %s\n" "%sTTYReset: %s\n" "%sTTYVHangup: %s\n" - "%sTTYVTDisallocate: %s\n", + "%sTTYVTDisallocate: %s\n" + "%sTTYRows: %u\n" + "%sTTYColumns: %u\n", prefix, c->tty_path, prefix, yes_no(c->tty_reset), prefix, yes_no(c->tty_vhangup), - prefix, yes_no(c->tty_vt_disallocate)); + prefix, yes_no(c->tty_vt_disallocate), + prefix, c->tty_rows, + prefix, c->tty_cols); if (IN_SET(c->std_output, EXEC_OUTPUT_KMSG, diff --git a/src/core/execute.h b/src/core/execute.h index 18a4316d01..b0da375def 100644 --- a/src/core/execute.h +++ b/src/core/execute.h @@ -232,6 +232,9 @@ struct ExecContext { bool tty_vhangup; bool tty_vt_disallocate; + unsigned tty_rows; + unsigned tty_cols; + bool ignore_sigpipe; ExecKeyringMode keyring_mode; diff --git a/src/core/load-fragment-gperf.gperf.in b/src/core/load-fragment-gperf.gperf.in index 5ecba47e31..5315d2da88 100644 --- a/src/core/load-fragment-gperf.gperf.in +++ b/src/core/load-fragment-gperf.gperf.in @@ -41,6 +41,8 @@ {{type}}.TTYReset, config_parse_bool, 0, offsetof({{type}}, exec_context.tty_reset) {{type}}.TTYVHangup, config_parse_bool, 0, offsetof({{type}}, exec_context.tty_vhangup) {{type}}.TTYVTDisallocate, config_parse_bool, 0, offsetof({{type}}, exec_context.tty_vt_disallocate) +{{type}}.TTYRows, config_parse_tty_size, 0, offsetof({{type}}, exec_context.tty_rows) +{{type}}.TTYColumns, config_parse_tty_size, 0, offsetof({{type}}, exec_context.tty_cols) {{type}}.SyslogIdentifier, config_parse_unit_string_printf, 0, offsetof({{type}}, exec_context.syslog_identifier) {{type}}.SyslogFacility, config_parse_log_facility, 0, offsetof({{type}}, exec_context.syslog_priority) {{type}}.SyslogLevel, config_parse_log_level, 0, offsetof({{type}}, exec_context.syslog_priority) diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c index 62cadaf228..8cf821cd22 100644 --- a/src/core/load-fragment.c +++ b/src/core/load-fragment.c @@ -6494,3 +6494,29 @@ int config_parse_watchdog_sec( return 0; } + +int config_parse_tty_size( + const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + + unsigned *sz = data; + + assert(filename); + assert(lvalue); + assert(rvalue); + + if (isempty(rvalue)) { + *sz = UINT_MAX; + return 0; + } + + return config_parse_unsigned(unit, filename, line, section, section_line, lvalue, ltype, rvalue, data, userdata); +} diff --git a/src/core/load-fragment.h b/src/core/load-fragment.h index 9ff550410f..ab2a0393fc 100644 --- a/src/core/load-fragment.h +++ b/src/core/load-fragment.h @@ -148,6 +148,7 @@ CONFIG_PARSER_PROTOTYPE(config_parse_bpf_foreign_program); CONFIG_PARSER_PROTOTYPE(config_parse_cgroup_socket_bind); CONFIG_PARSER_PROTOTYPE(config_parse_restrict_network_interfaces); CONFIG_PARSER_PROTOTYPE(config_parse_watchdog_sec); +CONFIG_PARSER_PROTOTYPE(config_parse_tty_size); /* gperf prototypes */ const struct ConfigPerfItem* load_fragment_gperf_lookup(const char *key, GPERF_LEN_TYPE length); |