1
0
mirror of https://github.com/systemd/systemd.git synced 2025-03-21 02:50:18 +03:00

shared/pager: print the name of the pager we'll try next in debug message

I had a strange failure where the pager was hanging on invocation (gdm crashed
and the kernel got into a strange state where it was hanging on some tasks).
Based on the logs from 'SYSTEMCTL_LOG_LEVEL=debug journalctl', I couldn't even
tell which pager binary we're executing. So let's shorten the function a bit and
provide a bit more detail.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2022-05-31 10:59:12 +02:00
parent 5b69a7c540
commit b622d2f789

View File

@ -219,31 +219,30 @@ void pager_open(PagerFlags flags) {
/* Debian's alternatives command for pagers is called 'pager'. Note that we do not call
* sensible-pagers here, since that is just a shell script that implements a logic that is
* similar to this one anyway, but is Debian-specific. */
FOREACH_STRING(exe, "pager", "less", "more") {
/* Only less implements secure mode right now. */
if (use_secure_mode && !streq(exe, "less"))
static const char* pagers[] = { "pager", "less", "more", "(built-in)" };
for (unsigned i = 0; i < ELEMENTSOF(pagers); i++) {
/* Only less (and our trivial fallback) implement secure mode right now. */
if (use_secure_mode && !STR_IN_SET(pagers[i], "less", "(built-in)"))
continue;
r = loop_write(exe_name_pipe[1], exe, strlen(exe) + 1, false);
if (r < 0) {
r = loop_write(exe_name_pipe[1], pagers[i], strlen(pagers[i]) + 1, false);
if (r < 0) {
log_error_errno(r, "Failed to write pager name to socket: %m");
_exit(EXIT_FAILURE);
}
execlp(exe, exe, NULL);
log_full_errno(errno == ENOENT ? LOG_DEBUG : LOG_WARNING, errno,
"Failed to execute '%s', using next fallback pager: %m", exe);
}
/* Our builtin is also very secure. */
r = loop_write(exe_name_pipe[1], "(built-in)", strlen("(built-in)") + 1, false);
if (r < 0) {
log_error_errno(r, "Failed to write pager name to socket: %m");
_exit(EXIT_FAILURE);
if (i < ELEMENTSOF(pagers) - 1) {
execlp(pagers[i], pagers[i], NULL);
log_full_errno(errno == ENOENT ? LOG_DEBUG : LOG_WARNING, errno,
"Failed to execute '%s', will try '%s' next: %m", pagers[i], pagers[i+1]);
} else {
/* Close pipe to signal the parent to start sending data */
safe_close_pair(exe_name_pipe);
pager_fallback();
assert_not_reached();
}
}
/* Close pipe to signal the parent to start sending data */
safe_close_pair(exe_name_pipe);
pager_fallback();
/* not reached */
}
/* Return in the parent */