diff --git a/man/systemd.exec.xml b/man/systemd.exec.xml index c1088a30133..3f3ed77f460 100644 --- a/man/systemd.exec.xml +++ b/man/systemd.exec.xml @@ -70,8 +70,12 @@ Units whose standard output or error output is connected to or (or their combinations with console output, see below) automatically acquire - dependencies of type After= on - systemd-journald.socket. + dependencies of type After= on systemd-journald.socket. + + + Units using the terminal (standard input, output, or error are connected to a terminal + or TTYPath= is used) automatically acquire an After= dependency + on systemd-vconsole-setup.service. Units using LogNamespace= will automatically gain ordering and requirement dependencies on the two socket units associated with diff --git a/rules.d/90-vconsole.rules.in b/rules.d/90-vconsole.rules.in index 845785492bb..bc7f8a1698a 100644 --- a/rules.d/90-vconsole.rules.in +++ b/rules.d/90-vconsole.rules.in @@ -9,4 +9,4 @@ # Each vtcon keeps its own state of fonts. # -ACTION=="add", SUBSYSTEM=="vtconsole", KERNEL=="vtcon*", RUN+="{{ROOTLIBEXECDIR}}/systemd-vconsole-setup" +ACTION=="add", SUBSYSTEM=="vtconsole", KERNEL=="vtcon*", RUN+="{{SYSTEMCTL_BINARY_PATH}} --no-block restart systemd-vconsole-setup.service" diff --git a/src/basic/special.h b/src/basic/special.h index 0e4342eb40d..ed3852a4504 100644 --- a/src/basic/special.h +++ b/src/basic/special.h @@ -85,6 +85,7 @@ #define SPECIAL_QUOTACHECK_SERVICE "systemd-quotacheck.service" #define SPECIAL_QUOTAON_SERVICE "quotaon.service" #define SPECIAL_REMOUNT_FS_SERVICE "systemd-remount-fs.service" +#define SPECIAL_VCONSOLE_SETUP_SERVICE "systemd-vconsole-setup.service" #define SPECIAL_VOLATILE_ROOT_SERVICE "systemd-volatile-root.service" #define SPECIAL_UDEVD_SERVICE "systemd-udevd.service" #define SPECIAL_GROWFS_SERVICE "systemd-growfs@.service" diff --git a/src/core/execute.c b/src/core/execute.c index 8ddd7362a3e..ca89e3b0035 100644 --- a/src/core/execute.c +++ b/src/core/execute.c @@ -6870,6 +6870,16 @@ bool exec_context_has_encrypted_credentials(ExecContext *c) { return false; } +int exec_context_add_default_dependencies(Unit *u, const ExecContext *c) { + assert(u); + assert(u->default_dependencies); + + if (c && exec_context_needs_term(c)) + return unit_add_dependency_by_name(u, UNIT_AFTER, SPECIAL_VCONSOLE_SETUP_SERVICE, + /* add_reference= */ true, UNIT_DEPENDENCY_DEFAULT); + return 0; +} + void exec_status_start(ExecStatus *s, pid_t pid) { assert(s); diff --git a/src/core/execute.h b/src/core/execute.h index d2f55074058..c2c983d0c30 100644 --- a/src/core/execute.h +++ b/src/core/execute.h @@ -486,6 +486,7 @@ void exec_context_revert_tty(ExecContext *c); int exec_context_get_clean_directories(ExecContext *c, char **prefix, ExecCleanMask mask, char ***ret); int exec_context_get_clean_mask(ExecContext *c, ExecCleanMask *ret); +int exec_context_add_default_dependencies(Unit *u, const ExecContext *c); void exec_status_start(ExecStatus *s, pid_t pid); void exec_status_exit(ExecStatus *s, const ExecContext *context, pid_t pid, int code, int status); diff --git a/src/core/mount.c b/src/core/mount.c index 549d7dbf986..f25188681d7 100644 --- a/src/core/mount.c +++ b/src/core/mount.c @@ -575,7 +575,7 @@ static int mount_add_default_dependencies(Mount *m) { return r; } - return 0; + return exec_context_add_default_dependencies(UNIT(m), &m->exec_context); } static int mount_verify(Mount *m) { diff --git a/src/core/service.c b/src/core/service.c index 5c16a39309e..7e3a8ee0820 100644 --- a/src/core/service.c +++ b/src/core/service.c @@ -740,7 +740,12 @@ static int service_add_default_dependencies(Service *s) { return r; /* Third, add us in for normal shutdown. */ - return unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, true, UNIT_DEPENDENCY_DEFAULT); + r = unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, true, UNIT_DEPENDENCY_DEFAULT); + if (r < 0) + return r; + + /* Fourth, add generic dependencies */ + return exec_context_add_default_dependencies(UNIT(s), &s->exec_context); } static void service_fix_stdio(Service *s) { diff --git a/src/core/socket.c b/src/core/socket.c index 2ed6611c9f1..0bd1b126526 100644 --- a/src/core/socket.c +++ b/src/core/socket.c @@ -276,7 +276,11 @@ static int socket_add_default_dependencies(Socket *s) { return r; } - return unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, true, UNIT_DEPENDENCY_DEFAULT); + r = unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, true, UNIT_DEPENDENCY_DEFAULT); + if (r < 0) + return r; + + return exec_context_add_default_dependencies(UNIT(s), &s->exec_context); } _pure_ static bool socket_has_exec(Socket *s) { diff --git a/src/core/swap.c b/src/core/swap.c index c6e2c8b1bd9..26a950b058d 100644 --- a/src/core/swap.c +++ b/src/core/swap.c @@ -270,7 +270,11 @@ static int swap_add_default_dependencies(Swap *s) { if (r < 0) return r; - return unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, true, UNIT_DEPENDENCY_DEFAULT); + r = unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, true, UNIT_DEPENDENCY_DEFAULT); + if (r < 0) + return r; + + return exec_context_add_default_dependencies(UNIT(s), &s->exec_context); } static int swap_verify(Swap *s) { diff --git a/src/vconsole/vconsole-setup.c b/src/vconsole/vconsole-setup.c index 58fb5348f9a..4d9915cbbaa 100644 --- a/src/vconsole/vconsole-setup.c +++ b/src/vconsole/vconsole-setup.c @@ -51,11 +51,11 @@ typedef struct Context { } Context; static const char * const vc_meta_names[_VC_META_MAX] = { - [VC_KEYMAP] = "vconsole.keymap", - [VC_KEYMAP_TOGGLE] = "vconsole.keymap_toggle", - [VC_FONT] = "vconsole.font", - [VC_FONT_MAP] = "vconsole.font_map", - [VC_FONT_UNIMAP] = "vconsole.font_unimap", + [VC_KEYMAP] = "vconsole.keymap", + [VC_KEYMAP_TOGGLE] = "vconsole.keymap_toggle", + [VC_FONT] = "vconsole.font", + [VC_FONT_MAP] = "vconsole.font_map", + [VC_FONT_UNIMAP] = "vconsole.font_unimap", }; /* compatibility with obsolete multiple-dot scheme */ @@ -380,17 +380,12 @@ static void setup_remaining_vcs(int src_fd, unsigned src_idx, bool utf8) { struct unimapdesc unimapd; _cleanup_free_ struct unipair* unipairs = NULL; _cleanup_free_ void *fontbuf = NULL; - unsigned i; - int log_level; + int log_level = LOG_WARNING; int r; unipairs = new(struct unipair, USHRT_MAX); - if (!unipairs) { - log_oom(); - return; - } - - log_level = LOG_WARNING; + if (!unipairs) + return (void) log_oom(); /* get metadata of the current font (width, height, count) */ r = ioctl(src_fd, KDFONTOP, &cfo); @@ -440,7 +435,7 @@ static void setup_remaining_vcs(int src_fd, unsigned src_idx, bool utf8) { if (cfo.op != KD_FONT_OP_SET) log_full(log_level, "Fonts will not be copied to remaining consoles"); - for (i = 1; i <= 63; i++) { + for (unsigned i = 1; i <= 63; i++) { char ttyname[sizeof("/dev/tty63")]; _cleanup_close_ int fd_d = -EBADF; @@ -484,10 +479,8 @@ static void setup_remaining_vcs(int src_fd, unsigned src_idx, bool utf8) { continue; } - /* - * copy unicode translation table unimapd is a ushort count and a pointer - * to an array of struct unipair { ushort, ushort } - */ + /* Copy unicode translation table unimapd is a ushort count and a pointer + * to an array of struct unipair { ushort, ushort }. */ r = ioctl(fd_d, PIO_UNIMAPCLR, &adv); if (r < 0) { log_warning_errno(errno, "PIO_UNIMAPCLR failed, unimaps might be incorrect for tty%u: %m", i); @@ -505,15 +498,13 @@ static void setup_remaining_vcs(int src_fd, unsigned src_idx, bool utf8) { } static int find_source_vc(char **ret_path, unsigned *ret_idx) { - _cleanup_free_ char *path = NULL; int r, err = 0; - unsigned i; - path = new(char, sizeof("/dev/tty63")); + _cleanup_free_ char *path = new(char, sizeof("/dev/tty63")); if (!path) return log_oom(); - for (i = 1; i <= 63; i++) { + for (unsigned i = 1; i <= 63; i++) { _cleanup_close_ int fd = -EBADF; r = verify_vc_allocation(i); diff --git a/units/console-getty.service.in b/units/console-getty.service.in index 606b7dbe16b..d7e90ed8479 100644 --- a/units/console-getty.service.in +++ b/units/console-getty.service.in @@ -10,9 +10,9 @@ [Unit] Description=Console Getty Documentation=man:agetty(8) man:systemd-getty-generator(8) -After=systemd-user-sessions.service plymouth-quit-wait.service +After=systemd-user-sessions.service plymouth-quit-wait.service getty-pre.target {% if HAVE_SYSV_COMPAT %} -After=rc-local.service getty-pre.target +After=rc-local.service {% endif %} Before=getty.target diff --git a/units/container-getty@.service.in b/units/container-getty@.service.in index 8d7e20d5ecf..b8c47d4dd06 100644 --- a/units/container-getty@.service.in +++ b/units/container-getty@.service.in @@ -11,9 +11,9 @@ Description=Container Getty on /dev/pts/%I Documentation=man:agetty(8) man:systemd-getty-generator(8) Documentation=man:machinectl(1) -After=systemd-user-sessions.service plymouth-quit-wait.service +After=systemd-user-sessions.service plymouth-quit-wait.service getty-pre.target {% if HAVE_SYSV_COMPAT %} -After=rc-local.service getty-pre.target +After=rc-local.service {% endif %} Before=getty.target IgnoreOnIsolate=yes diff --git a/units/debug-shell.service.in b/units/debug-shell.service.in index 1588bb95966..2c2c8dd4f5f 100644 --- a/units/debug-shell.service.in +++ b/units/debug-shell.service.in @@ -13,6 +13,7 @@ Documentation=man:systemd-debug-generator(8) DefaultDependencies=no IgnoreOnIsolate=yes ConditionPathExists={{DEBUGTTY}} +After=systemd-vconsole-setup.service [Service] Environment=TERM=linux diff --git a/units/systemd-vconsole-setup.service.in b/units/systemd-vconsole-setup.service.in index c07869feddd..00095283075 100644 --- a/units/systemd-vconsole-setup.service.in +++ b/units/systemd-vconsole-setup.service.in @@ -11,6 +11,7 @@ Description=Setup Virtual Console Documentation=man:systemd-vconsole-setup.service(8) man:vconsole.conf(5) DefaultDependencies=no +Before=sysinit.target Before=initrd-switch-root.target shutdown.target ConditionPathExists=/dev/tty0