getty: move automatic serial getty logic into generator
This commit is contained in:
parent
2fc9784656
commit
2a796654b9
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,3 +1,4 @@
|
||||||
|
systemd-getty-generator
|
||||||
systemd-nspawn
|
systemd-nspawn
|
||||||
systemd-stdio-bridge
|
systemd-stdio-bridge
|
||||||
systemd-machine-id-setup
|
systemd-machine-id-setup
|
||||||
|
|
15
Makefile.am
15
Makefile.am
|
@ -143,11 +143,14 @@ rootlibexec_PROGRAMS = \
|
||||||
systemd-detect-virt \
|
systemd-detect-virt \
|
||||||
systemd-sysctl
|
systemd-sysctl
|
||||||
|
|
||||||
|
systemgenerator_PROGRAMS = \
|
||||||
|
systemd-getty-generator
|
||||||
|
|
||||||
if HAVE_LIBCRYPTSETUP
|
if HAVE_LIBCRYPTSETUP
|
||||||
rootlibexec_PROGRAMS += \
|
rootlibexec_PROGRAMS += \
|
||||||
systemd-cryptsetup
|
systemd-cryptsetup
|
||||||
|
|
||||||
systemgenerator_PROGRAMS = \
|
systemgenerator_PROGRAMS += \
|
||||||
systemd-cryptsetup-generator
|
systemd-cryptsetup-generator
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -856,6 +859,16 @@ systemd_cryptsetup_generator_CFLAGS = \
|
||||||
systemd_cryptsetup_generator_LDADD = \
|
systemd_cryptsetup_generator_LDADD = \
|
||||||
libsystemd-basic.la
|
libsystemd-basic.la
|
||||||
|
|
||||||
|
systemd_getty_generator_SOURCES = \
|
||||||
|
src/getty-generator.c \
|
||||||
|
src/unit-name.c
|
||||||
|
|
||||||
|
systemd_getty_generator_CFLAGS = \
|
||||||
|
$(AM_CFLAGS)
|
||||||
|
|
||||||
|
systemd_getty_generator_LDADD = \
|
||||||
|
libsystemd-basic.la
|
||||||
|
|
||||||
systemd_user_sessions_SOURCES = \
|
systemd_user_sessions_SOURCES = \
|
||||||
src/user-sessions.c \
|
src/user-sessions.c \
|
||||||
src/cgroup-util.c
|
src/cgroup-util.c
|
||||||
|
|
2
TODO
2
TODO
|
@ -24,8 +24,6 @@ F15:
|
||||||
|
|
||||||
* capability_bounding_set_drop not used.
|
* capability_bounding_set_drop not used.
|
||||||
|
|
||||||
* remove getty magic, move it into a generator
|
|
||||||
|
|
||||||
* recreate private socket on SIGUSR2
|
* recreate private socket on SIGUSR2
|
||||||
|
|
||||||
Features:
|
Features:
|
||||||
|
|
|
@ -222,6 +222,7 @@ int main(int argc, char *argv[]) {
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (argc > 1)
|
||||||
arg_dest = argv[1];
|
arg_dest = argv[1];
|
||||||
|
|
||||||
log_set_target(LOG_TARGET_SYSLOG_OR_KMSG);
|
log_set_target(LOG_TARGET_SYSLOG_OR_KMSG);
|
||||||
|
|
127
src/getty-generator.c
Normal file
127
src/getty-generator.c
Normal file
|
@ -0,0 +1,127 @@
|
||||||
|
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
|
||||||
|
|
||||||
|
/***
|
||||||
|
This file is part of systemd.
|
||||||
|
|
||||||
|
Copyright 2010 Lennart Poettering
|
||||||
|
|
||||||
|
systemd is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
systemd is distributed in the hope that it will be useful, but
|
||||||
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
***/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "log.h"
|
||||||
|
#include "util.h"
|
||||||
|
#include "unit-name.h"
|
||||||
|
|
||||||
|
const char *arg_dest = "/tmp";
|
||||||
|
|
||||||
|
static int add_symlink(const char *fservice, const char *tservice) {
|
||||||
|
char *from = NULL, *to = NULL;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
asprintf(&from, SYSTEM_DATA_UNIT_PATH "/%s", fservice);
|
||||||
|
asprintf(&to, "%s/getty.target.wants/%s", arg_dest, tservice);
|
||||||
|
|
||||||
|
if (!from || !to) {
|
||||||
|
log_error("Out of memory");
|
||||||
|
r = -ENOMEM;
|
||||||
|
goto finish;
|
||||||
|
}
|
||||||
|
|
||||||
|
mkdir_parents(to, 0755);
|
||||||
|
|
||||||
|
if ((r = symlink(from, to)) < 0) {
|
||||||
|
log_error("Failed to create symlink from %s to %s: %m", from, to);
|
||||||
|
r = -errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
finish:
|
||||||
|
|
||||||
|
free(from);
|
||||||
|
free(to);
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
int r = EXIT_SUCCESS;
|
||||||
|
char *active;
|
||||||
|
|
||||||
|
if (argc > 2) {
|
||||||
|
log_error("This program takes one or no arguments.");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argc > 1)
|
||||||
|
arg_dest = argv[1];
|
||||||
|
|
||||||
|
log_set_target(LOG_TARGET_SYSLOG_OR_KMSG);
|
||||||
|
log_parse_environment();
|
||||||
|
log_open();
|
||||||
|
|
||||||
|
if (detect_container(NULL) > 0) {
|
||||||
|
log_debug("Automatic adding console shell.");
|
||||||
|
|
||||||
|
if (add_symlink("console-shell.service", "console-shell.service") < 0)
|
||||||
|
r = EXIT_FAILURE;
|
||||||
|
|
||||||
|
/* Don't add any further magic if we are in a container */
|
||||||
|
goto finish;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (read_one_line_file("/sys/class/tty/console/active", &active) >= 0) {
|
||||||
|
const char *tty;
|
||||||
|
|
||||||
|
truncate_nl(active);
|
||||||
|
if ((tty = strrchr(active, ' ')))
|
||||||
|
tty ++;
|
||||||
|
else
|
||||||
|
tty = active;
|
||||||
|
|
||||||
|
/* Automatically add in a serial getty on the kernel
|
||||||
|
* console */
|
||||||
|
if (!tty_is_vc(tty)) {
|
||||||
|
char *n;
|
||||||
|
|
||||||
|
/* We assume that gettys on virtual terminals are
|
||||||
|
* started via manual configuration and do this magic
|
||||||
|
* only for non-VC terminals. */
|
||||||
|
|
||||||
|
log_debug("Automatically adding serial getty for /dev/%s.", tty);
|
||||||
|
|
||||||
|
if (!(n = unit_name_replace_instance("serial-getty@.service", tty)) ||
|
||||||
|
add_symlink("serial-getty@.service", n) < 0)
|
||||||
|
r = EXIT_FAILURE;
|
||||||
|
|
||||||
|
free(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(active);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Automatically add in a serial getty on the first
|
||||||
|
* virtualizer console */
|
||||||
|
if (access("/sys/class/tty/hvc0", F_OK) == 0) {
|
||||||
|
log_debug("Automatic adding serial getty for hvc0.");
|
||||||
|
|
||||||
|
if (add_symlink("serial-getty@.service", "serial-getty@hvc0.service") < 0)
|
||||||
|
r = EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
finish:
|
||||||
|
return r;
|
||||||
|
}
|
|
@ -63,8 +63,6 @@
|
||||||
#define SPECIAL_KEXEC_TARGET "kexec.target"
|
#define SPECIAL_KEXEC_TARGET "kexec.target"
|
||||||
#define SPECIAL_DBUS_SERVICE "dbus.service"
|
#define SPECIAL_DBUS_SERVICE "dbus.service"
|
||||||
#define SPECIAL_DBUS_SOCKET "dbus.socket"
|
#define SPECIAL_DBUS_SOCKET "dbus.socket"
|
||||||
#define SPECIAL_GETTY_TARGET "getty.target"
|
|
||||||
#define SPECIAL_SERIAL_GETTY_SERVICE "serial-getty@.service"
|
|
||||||
#define SPECIAL_REMOUNT_ROOTFS_SERVICE "remount-rootfs.service"
|
#define SPECIAL_REMOUNT_ROOTFS_SERVICE "remount-rootfs.service"
|
||||||
|
|
||||||
#ifndef SPECIAL_SYSLOG_SERVICE
|
#ifndef SPECIAL_SYSLOG_SERVICE
|
||||||
|
|
67
src/target.c
67
src/target.c
|
@ -83,70 +83,6 @@ static int target_add_default_dependencies(Target *t) {
|
||||||
return unit_add_dependency_by_name(UNIT(t), UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, NULL, true);
|
return unit_add_dependency_by_name(UNIT(t), UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, NULL, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int target_add_getty_dependencies(Target *t) {
|
|
||||||
char *n, *active;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
assert(t);
|
|
||||||
|
|
||||||
if (!unit_has_name(UNIT(t), SPECIAL_GETTY_TARGET))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (detect_container(NULL) > 0)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
if (read_one_line_file("/sys/class/tty/console/active", &active) >= 0) {
|
|
||||||
const char *tty;
|
|
||||||
|
|
||||||
truncate_nl(active);
|
|
||||||
if ((tty = strrchr(active, ' ')))
|
|
||||||
tty ++;
|
|
||||||
else
|
|
||||||
tty = active;
|
|
||||||
|
|
||||||
/* Automatically add in a serial getty on the kernel
|
|
||||||
* console */
|
|
||||||
if (!tty_is_vc(tty)) {
|
|
||||||
|
|
||||||
/* We assume that gettys on virtual terminals are
|
|
||||||
* started via manual configuration and do this magic
|
|
||||||
* only for non-VC terminals. */
|
|
||||||
|
|
||||||
log_debug("Automatically adding serial getty for /dev/%s", tty);
|
|
||||||
if (!(n = unit_name_replace_instance(SPECIAL_SERIAL_GETTY_SERVICE, tty))) {
|
|
||||||
free(active);
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
r = unit_add_two_dependencies_by_name(UNIT(t), UNIT_AFTER, UNIT_WANTS, n, NULL, true);
|
|
||||||
free(n);
|
|
||||||
|
|
||||||
if (r < 0) {
|
|
||||||
free(active);
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
free(active);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Automatically add in a serial getty on the first
|
|
||||||
* virtualizer console */
|
|
||||||
if (access("/sys/class/tty/hvc0", F_OK) == 0) {
|
|
||||||
log_debug("Automatic adding serial getty for hvc0");
|
|
||||||
if (!(n = unit_name_replace_instance(SPECIAL_SERIAL_GETTY_SERVICE, "hvc0")))
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
r = unit_add_two_dependencies_by_name(UNIT(t), UNIT_AFTER, UNIT_WANTS, n, NULL, true);
|
|
||||||
free(n);
|
|
||||||
|
|
||||||
if (r < 0)
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int target_load(Unit *u) {
|
static int target_load(Unit *u) {
|
||||||
Target *t = TARGET(u);
|
Target *t = TARGET(u);
|
||||||
int r;
|
int r;
|
||||||
|
@ -161,9 +97,6 @@ static int target_load(Unit *u) {
|
||||||
if (u->meta.default_dependencies)
|
if (u->meta.default_dependencies)
|
||||||
if ((r = target_add_default_dependencies(t)) < 0)
|
if ((r = target_add_default_dependencies(t)) < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
if ((r = target_add_getty_dependencies(t)) < 0)
|
|
||||||
return r;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in a new issue