summaryrefslogtreecommitdiff
path: root/src/load-fragment.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2011-05-18 01:07:31 +0200
committerLennart Poettering <lennart@poettering.net>2011-05-18 01:07:36 +0200
commit6ea832a20700f5282c08c70f38422c6ab290a0b5 (patch)
treebcd9a7705c87f3828adf70938ec59cdcfe368e72 /src/load-fragment.c
parent9131f660eedb29d18a29e6efff49c485e683c56c (diff)
exec: hangup/reset/deallocate VTs in gettys
Explicitly disconnect all clients from a VT when a getty starts/finishes (requires TIOCVHANGUP, available in 2.6.29). Explicitly deallocate getty VTs in order to flush scrollback buffer. Explicitly reset terminals to a defined state before spawning getty.
Diffstat (limited to 'src/load-fragment.c')
-rw-r--r--src/load-fragment.c49
1 files changed, 45 insertions, 4 deletions
diff --git a/src/load-fragment.c b/src/load-fragment.c
index 7c39d238f6..321214ef46 100644
--- a/src/load-fragment.c
+++ b/src/load-fragment.c
@@ -188,6 +188,43 @@ static int config_parse_string_printf(
return 0;
}
+static int config_parse_path_printf(
+ const char *filename,
+ unsigned line,
+ const char *section,
+ const char *lvalue,
+ int ltype,
+ const char *rvalue,
+ void *data,
+ void *userdata) {
+
+ Unit *u = userdata;
+ char **s = data;
+ char *k;
+
+ assert(filename);
+ assert(lvalue);
+ assert(rvalue);
+ assert(s);
+ assert(u);
+
+ if (!(k = unit_full_printf(u, rvalue)))
+ return -ENOMEM;
+
+ if (!path_is_absolute(k)) {
+ log_error("[%s:%u] Not an absolute path: %s", filename, line, k);
+ free(k);
+ return -EINVAL;
+ }
+
+ path_kill_slashes(k);
+
+ free(*s);
+ *s = k;
+
+ return 0;
+}
+
static int config_parse_listen(
const char *filename,
unsigned line,
@@ -1719,6 +1756,7 @@ static void dump_items(FILE *f, const ConfigItem *items) {
{ config_parse_bool, "BOOLEAN" },
{ config_parse_string, "STRING" },
{ config_parse_path, "PATH" },
+ { config_parse_path_printf, "PATH" },
{ config_parse_strv, "STRING [...]" },
{ config_parse_nice, "NICE" },
{ config_parse_oom_score_adjust, "OOMSCOREADJUST" },
@@ -1812,8 +1850,8 @@ static int load_from_path(Unit *u, const char *path) {
};
#define EXEC_CONTEXT_CONFIG_ITEMS(context, section) \
- { "WorkingDirectory", config_parse_path, 0, &(context).working_directory, section }, \
- { "RootDirectory", config_parse_path, 0, &(context).root_directory, section }, \
+ { "WorkingDirectory", config_parse_path_printf, 0, &(context).working_directory, section }, \
+ { "RootDirectory", config_parse_path_printf, 0, &(context).root_directory, section }, \
{ "User", config_parse_string_printf, 0, &(context).user, section }, \
{ "Group", config_parse_string_printf, 0, &(context).group, section }, \
{ "SupplementaryGroups", config_parse_strv, 0, &(context).supplementary_groups, section }, \
@@ -1831,7 +1869,10 @@ static int load_from_path(Unit *u, const char *path) {
{ "StandardInput", config_parse_input, 0, &(context).std_input, section }, \
{ "StandardOutput", config_parse_output, 0, &(context).std_output, section }, \
{ "StandardError", config_parse_output, 0, &(context).std_error, section }, \
- { "TTYPath", config_parse_path, 0, &(context).tty_path, section }, \
+ { "TTYPath", config_parse_path_printf, 0, &(context).tty_path, section }, \
+ { "TTYReset", config_parse_bool, 0, &(context).tty_reset, section }, \
+ { "TTYVHangup", config_parse_bool, 0, &(context).tty_vhangup, section }, \
+ { "TTYVTDisallocate", config_parse_bool, 0, &(context).tty_vt_disallocate, section }, \
{ "SyslogIdentifier", config_parse_string_printf, 0, &(context).syslog_identifier, section }, \
{ "SyslogFacility", config_parse_facility, 0, &(context).syslog_priority, section }, \
{ "SyslogLevel", config_parse_level, 0, &(context).syslog_priority, section }, \
@@ -1899,7 +1940,7 @@ static int load_from_path(Unit *u, const char *path) {
{ "ConditionSecurity", config_parse_condition_string, CONDITION_SECURITY, u, "Unit" },
{ "ConditionNull", config_parse_condition_null, 0, u, "Unit" },
- { "PIDFile", config_parse_path, 0, &u->service.pid_file, "Service" },
+ { "PIDFile", config_parse_path_printf, 0, &u->service.pid_file, "Service" },
{ "ExecStartPre", config_parse_exec, 0, u->service.exec_command+SERVICE_EXEC_START_PRE, "Service" },
{ "ExecStart", config_parse_exec, 0, u->service.exec_command+SERVICE_EXEC_START, "Service" },
{ "ExecStartPost", config_parse_exec, 0, u->service.exec_command+SERVICE_EXEC_START_POST, "Service" },