vconsole-setup: skip setfont(8) when the console driver lacks font support
Don't run setfont(8) on consoles that don't support fonts. systemd-vconsole-setup neither fails nor reports errors on such consoles unlike setfont(8) which emits the following error [1]: systemd-vconsole-setup[169]: setfont: ERROR kdfontop.c:183 put_font_kdfontop: Unable to load such font with such kernel version The check already existed in setup_remaining_vcs() but it was performed too late. [1] this was simply ignored by setfont(8) until https://github.com/legionus/kbd/commit/1e15af4d8b272ca50e9ee1d0c584c5859102c848
This commit is contained in:
committed by
Luca Boccassi
parent
b5bd726f8c
commit
7da67c3f8b
@@ -215,6 +215,22 @@ static int verify_vc_display_mode(int fd) {
|
|||||||
return mode != KD_TEXT ? -EBUSY : 0;
|
return mode != KD_TEXT ? -EBUSY : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int verify_vc_support_font(int fd) {
|
||||||
|
struct console_font_op cfo = {
|
||||||
|
.op = KD_FONT_OP_GET,
|
||||||
|
.width = UINT_MAX,
|
||||||
|
.height = UINT_MAX,
|
||||||
|
.charcount = UINT_MAX,
|
||||||
|
};
|
||||||
|
|
||||||
|
assert(fd >= 0);
|
||||||
|
|
||||||
|
if (ioctl(fd, KDFONTOP, &cfo) < 0)
|
||||||
|
return ERRNO_IS_NOT_SUPPORTED(errno) ? 0 : -errno;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static int toggle_utf8_vc(const char *name, int fd, bool utf8) {
|
static int toggle_utf8_vc(const char *name, int fd, bool utf8) {
|
||||||
int r;
|
int r;
|
||||||
struct termios tc = {};
|
struct termios tc = {};
|
||||||
@@ -315,7 +331,7 @@ static int keyboard_load_and_wait(const char *vc, Context *c, bool utf8) {
|
|||||||
return 1; /* Report that we did something */
|
return 1; /* Report that we did something */
|
||||||
}
|
}
|
||||||
|
|
||||||
static int font_load_and_wait(const char *vc, Context *c) {
|
static int font_load_and_wait(int fd, const char *vc, Context *c) {
|
||||||
const char* args[9];
|
const char* args[9];
|
||||||
unsigned i = 0;
|
unsigned i = 0;
|
||||||
int r;
|
int r;
|
||||||
@@ -340,6 +356,16 @@ static int font_load_and_wait(const char *vc, Context *c) {
|
|||||||
return 0; /* Report that we skipped this */
|
return 0; /* Report that we skipped this */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* May be called on the dummy console (e.g. during keymap setup with fbcon deferred takeover). Font
|
||||||
|
* changes are not supported here and will fail. */
|
||||||
|
r = verify_vc_support_font(fd);
|
||||||
|
if (r < 0)
|
||||||
|
return log_error_errno(r, "Failed to check '%s' has font support: %m", vc);
|
||||||
|
if (r == 0) {
|
||||||
|
log_notice("'%s' has no font support, skipping.", vc);
|
||||||
|
return 0; /* Report that we skipped this */
|
||||||
|
}
|
||||||
|
|
||||||
args[i++] = KBD_SETFONT;
|
args[i++] = KBD_SETFONT;
|
||||||
args[i++] = "-C";
|
args[i++] = "-C";
|
||||||
args[i++] = vc;
|
args[i++] = vc;
|
||||||
@@ -371,9 +397,8 @@ static int font_load_and_wait(const char *vc, Context *c) {
|
|||||||
_exit(EXIT_FAILURE);
|
_exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* setfont returns EX_OSERR when ioctl(KDFONTOP/PIO_FONTX/PIO_FONTX) fails. This might mean various
|
/* setfont returns EX_OSERR when ioctl(KDFONTOP/PIO_FONTX/PIO_FONTX) fails. Let's be generous and not
|
||||||
* things, but in particular lack of a graphical console. Let's be generous and not treat this as an
|
* treat this as an error. */
|
||||||
* error. */
|
|
||||||
r = pidref_wait_for_terminate_and_check(KBD_SETFONT, &pidref, WAIT_LOG_ABNORMAL);
|
r = pidref_wait_for_terminate_and_check(KBD_SETFONT, &pidref, WAIT_LOG_ABNORMAL);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r; /* WAIT_LOG_ABNORMAL means we already have logged about these kinds of errors */
|
return r; /* WAIT_LOG_ABNORMAL means we already have logged about these kinds of errors */
|
||||||
@@ -404,7 +429,7 @@ static void setup_remaining_vcs(int src_fd, unsigned src_idx, bool utf8) {
|
|||||||
struct unimapdesc unimapd;
|
struct unimapdesc unimapd;
|
||||||
_cleanup_free_ struct unipair* unipairs = NULL;
|
_cleanup_free_ struct unipair* unipairs = NULL;
|
||||||
_cleanup_free_ void *fontbuf = NULL;
|
_cleanup_free_ void *fontbuf = NULL;
|
||||||
int log_level = LOG_WARNING, r;
|
int r;
|
||||||
|
|
||||||
assert(src_fd >= 0);
|
assert(src_fd >= 0);
|
||||||
|
|
||||||
@@ -415,14 +440,7 @@ static void setup_remaining_vcs(int src_fd, unsigned src_idx, bool utf8) {
|
|||||||
/* get metadata of the current font (width, height, count) */
|
/* get metadata of the current font (width, height, count) */
|
||||||
r = ioctl(src_fd, KDFONTOP, &cfo);
|
r = ioctl(src_fd, KDFONTOP, &cfo);
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
/* We might be called to operate on the dummy console (to setup keymap
|
log_warning_errno(errno, "KD_FONT_OP_GET failed while trying to get the font metadata: %m");
|
||||||
* mainly) when fbcon deferred takeover is used for example. In such case,
|
|
||||||
* setting font is not supported and is expected to fail. */
|
|
||||||
if (errno == ENOSYS)
|
|
||||||
log_level = LOG_DEBUG;
|
|
||||||
|
|
||||||
log_full_errno(log_level, errno,
|
|
||||||
"KD_FONT_OP_GET failed while trying to get the font metadata: %m");
|
|
||||||
} else {
|
} else {
|
||||||
/* verify parameter sanity first */
|
/* verify parameter sanity first */
|
||||||
if (cfo.width > 32 || cfo.height > 32 || cfo.charcount > 512)
|
if (cfo.width > 32 || cfo.height > 32 || cfo.charcount > 512)
|
||||||
@@ -458,7 +476,7 @@ static void setup_remaining_vcs(int src_fd, unsigned src_idx, bool utf8) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (cfo.op != KD_FONT_OP_SET)
|
if (cfo.op != KD_FONT_OP_SET)
|
||||||
log_full(log_level, "Fonts will not be copied to remaining consoles");
|
log_warning("Fonts will not be copied to remaining consoles");
|
||||||
|
|
||||||
for (unsigned i = 1; i <= 63; i++) {
|
for (unsigned i = 1; i <= 63; i++) {
|
||||||
char ttyname[sizeof("/dev/tty63")];
|
char ttyname[sizeof("/dev/tty63")];
|
||||||
@@ -656,7 +674,7 @@ static int run(int argc, char **argv) {
|
|||||||
|
|
||||||
(void) toggle_utf8_vc(vc, fd, utf8);
|
(void) toggle_utf8_vc(vc, fd, utf8);
|
||||||
|
|
||||||
int setfont_status = font_load_and_wait(vc, &c);
|
int setfont_status = font_load_and_wait(fd, vc, &c);
|
||||||
int loadkeys_status = keyboard_load_and_wait(vc, &c, utf8);
|
int loadkeys_status = keyboard_load_and_wait(vc, &c, utf8);
|
||||||
|
|
||||||
if (idx > 0) {
|
if (idx > 0) {
|
||||||
|
|||||||
Reference in New Issue
Block a user