terminal-util: make resolve_dev_console() less weird
Let's normalize the behaviour: return a negative errno style error code, and return the resolved string directly as argument.
This commit is contained in:
parent
bef41af233
commit
7b91264852
|
@ -672,37 +672,55 @@ int vtnr_from_tty(const char *tty) {
|
|||
return i;
|
||||
}
|
||||
|
||||
char *resolve_dev_console(char **active) {
|
||||
int resolve_dev_console(char **ret) {
|
||||
_cleanup_free_ char *active = NULL;
|
||||
char *tty;
|
||||
int r;
|
||||
|
||||
/* Resolve where /dev/console is pointing to, if /sys is actually ours
|
||||
* (i.e. not read-only-mounted which is a sign for container setups) */
|
||||
assert(ret);
|
||||
|
||||
/* Resolve where /dev/console is pointing to, if /sys is actually ours (i.e. not read-only-mounted which is a
|
||||
* sign for container setups) */
|
||||
|
||||
if (path_is_read_only_fs("/sys") > 0)
|
||||
return NULL;
|
||||
return -ENOMEDIUM;
|
||||
|
||||
if (read_one_line_file("/sys/class/tty/console/active", active) < 0)
|
||||
return NULL;
|
||||
r = read_one_line_file("/sys/class/tty/console/active", &active);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
/* If multiple log outputs are configured the last one is what
|
||||
* /dev/console points to */
|
||||
tty = strrchr(*active, ' ');
|
||||
/* If multiple log outputs are configured the last one is what /dev/console points to */
|
||||
tty = strrchr(active, ' ');
|
||||
if (tty)
|
||||
tty++;
|
||||
else
|
||||
tty = *active;
|
||||
tty = active;
|
||||
|
||||
if (streq(tty, "tty0")) {
|
||||
char *tmp;
|
||||
active = mfree(active);
|
||||
|
||||
/* Get the active VC (e.g. tty1) */
|
||||
if (read_one_line_file("/sys/class/tty/tty0/active", &tmp) >= 0) {
|
||||
free(*active);
|
||||
tty = *active = tmp;
|
||||
}
|
||||
r = read_one_line_file("/sys/class/tty/tty0/active", &active);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
tty = active;
|
||||
}
|
||||
|
||||
return tty;
|
||||
if (tty == active) {
|
||||
*ret = active;
|
||||
active = NULL;
|
||||
} else {
|
||||
char *tmp;
|
||||
|
||||
tmp = strdup(tty);
|
||||
if (!tmp)
|
||||
return -ENOMEM;
|
||||
|
||||
*ret = tmp;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int get_kernel_consoles(char ***ret) {
|
||||
|
@ -777,16 +795,17 @@ fallback:
|
|||
}
|
||||
|
||||
bool tty_is_vc_resolve(const char *tty) {
|
||||
_cleanup_free_ char *active = NULL;
|
||||
_cleanup_free_ char *resolved = NULL;
|
||||
|
||||
assert(tty);
|
||||
|
||||
tty = skip_dev_prefix(tty);
|
||||
|
||||
if (streq(tty, "console")) {
|
||||
tty = resolve_dev_console(&active);
|
||||
if (!tty)
|
||||
if (resolve_dev_console(&resolved) < 0)
|
||||
return false;
|
||||
|
||||
tty = resolved;
|
||||
}
|
||||
|
||||
return tty_is_vc(tty);
|
||||
|
|
|
@ -82,7 +82,7 @@ int ask_string(char **ret, const char *text, ...) _printf_(2, 3);
|
|||
|
||||
int vt_disallocate(const char *name);
|
||||
|
||||
char *resolve_dev_console(char **active);
|
||||
int resolve_dev_console(char **ret);
|
||||
int get_kernel_consoles(char ***ret);
|
||||
bool tty_is_vc(const char *tty);
|
||||
bool tty_is_vc_resolve(const char *tty);
|
||||
|
|
|
@ -3871,8 +3871,7 @@ static int exec_context_load_environment(const Unit *unit, const ExecContext *c,
|
|||
}
|
||||
|
||||
static bool tty_may_match_dev_console(const char *tty) {
|
||||
_cleanup_free_ char *active = NULL;
|
||||
char *console;
|
||||
_cleanup_free_ char *resolved = NULL;
|
||||
|
||||
if (!tty)
|
||||
return true;
|
||||
|
@ -3883,13 +3882,11 @@ static bool tty_may_match_dev_console(const char *tty) {
|
|||
if (streq(tty, "console"))
|
||||
return true;
|
||||
|
||||
console = resolve_dev_console(&active);
|
||||
/* if we could not resolve, assume it may */
|
||||
if (!console)
|
||||
return true;
|
||||
if (resolve_dev_console(&resolved) < 0)
|
||||
return true; /* if we could not resolve, assume it may */
|
||||
|
||||
/* "tty0" means the active VC, so it may be the same sometimes */
|
||||
return streq(console, tty) || (streq(console, "tty0") && tty_is_vc(tty));
|
||||
return streq(resolved, tty) || (streq(resolved, "tty0") && tty_is_vc(tty));
|
||||
}
|
||||
|
||||
bool exec_context_may_touch_console(const ExecContext *ec) {
|
||||
|
|
Loading…
Reference in New Issue