summaryrefslogtreecommitdiff
path: root/src/target.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2010-08-30 21:31:40 +0200
committerLennart Poettering <lennart@poettering.net>2010-08-30 23:03:58 +0200
commitb2bb3dbed9607c440b1a9ccacc515e28136d39ae (patch)
tree12bfdedab82abacb60ba3fe1e1a9e46989dc4785 /src/target.c
parent1ceec64c089c796028716c3ef9721ed0f0399569 (diff)
console: rework automatic getty on kernel console logic again
It is essential that the gettys are proper dependencies from getty.target so that they aren't killed and immediately restarted on runlevel changes. Hence rework the logic to implicitly add console gettys to getty.target as dependencies. This also adds an automatic hvc console for virtualizers. https://bugzilla.redhat.com/show_bug.cgi?id=501720
Diffstat (limited to 'src/target.c')
-rw-r--r--src/target.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/target.c b/src/target.c
index c7285fa737..c350d8fa19 100644
--- a/src/target.c
+++ b/src/target.c
@@ -21,6 +21,7 @@
#include <errno.h>
#include <signal.h>
+#include <unistd.h>
#include "unit.h"
#include "target.h"
@@ -28,6 +29,7 @@
#include "log.h"
#include "dbus-target.h"
#include "special.h"
+#include "unit-name.h"
static const UnitActiveState state_translation_table[_TARGET_STATE_MAX] = {
[TARGET_DEAD] = UNIT_INACTIVE,
@@ -76,6 +78,46 @@ static int target_add_default_dependencies(Target *t) {
return 0;
}
+static int target_add_getty_dependencies(Target *t) {
+ char *n;
+ int r;
+
+ assert(t);
+
+ if (!unit_has_name(UNIT(t), SPECIAL_GETTY_TARGET))
+ return 0;
+
+ /* Automatically add in a serial getty on the kernel
+ * console */
+ if (t->meta.manager->console) {
+ log_debug("Automatically adding serial getty for %s", t->meta.manager->console);
+ if (!(n = unit_name_replace_instance(SPECIAL_SERIAL_GETTY_SERVICE, t->meta.manager->console)))
+ 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;
+ }
+
+ /* 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;
@@ -90,6 +132,9 @@ 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;