diff options
author | Lennart Poettering <lennart@poettering.net> | 2011-05-18 01:07:31 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2011-05-18 01:07:36 +0200 |
commit | 6ea832a20700f5282c08c70f38422c6ab290a0b5 (patch) | |
tree | bcd9a7705c87f3828adf70938ec59cdcfe368e72 /src/load-fragment.c | |
parent | 9131f660eedb29d18a29e6efff49c485e683c56c (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.c | 49 |
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" }, |