mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-02-26 09:57:26 +03:00
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-stdio-bridge
|
||||
systemd-machine-id-setup
|
||||
|
15
Makefile.am
15
Makefile.am
@ -143,11 +143,14 @@ rootlibexec_PROGRAMS = \
|
||||
systemd-detect-virt \
|
||||
systemd-sysctl
|
||||
|
||||
systemgenerator_PROGRAMS = \
|
||||
systemd-getty-generator
|
||||
|
||||
if HAVE_LIBCRYPTSETUP
|
||||
rootlibexec_PROGRAMS += \
|
||||
systemd-cryptsetup
|
||||
|
||||
systemgenerator_PROGRAMS = \
|
||||
systemgenerator_PROGRAMS += \
|
||||
systemd-cryptsetup-generator
|
||||
endif
|
||||
|
||||
@ -856,6 +859,16 @@ systemd_cryptsetup_generator_CFLAGS = \
|
||||
systemd_cryptsetup_generator_LDADD = \
|
||||
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 = \
|
||||
src/user-sessions.c \
|
||||
src/cgroup-util.c
|
||||
|
2
TODO
2
TODO
@ -24,8 +24,6 @@ F15:
|
||||
|
||||
* capability_bounding_set_drop not used.
|
||||
|
||||
* remove getty magic, move it into a generator
|
||||
|
||||
* recreate private socket on SIGUSR2
|
||||
|
||||
Features:
|
||||
|
@ -222,7 +222,8 @@ int main(int argc, char *argv[]) {
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
arg_dest = argv[1];
|
||||
if (argc > 1)
|
||||
arg_dest = argv[1];
|
||||
|
||||
log_set_target(LOG_TARGET_SYSLOG_OR_KMSG);
|
||||
log_parse_environment();
|
||||
|
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_DBUS_SERVICE "dbus.service"
|
||||
#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"
|
||||
|
||||
#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);
|
||||
}
|
||||
|
||||
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) {
|
||||
Target *t = TARGET(u);
|
||||
int r;
|
||||
@ -161,9 +97,6 @@ static int target_load(Unit *u) {
|
||||
if (u->meta.default_dependencies)
|
||||
if ((r = target_add_default_dependencies(t)) < 0)
|
||||
return r;
|
||||
|
||||
if ((r = target_add_getty_dependencies(t)) < 0)
|
||||
return r;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user