mirror of
https://github.com/systemd/systemd.git
synced 2024-12-27 02:53:33 +08:00
pager: add a trivial internal pager
In the very unlikely scenario where none of the external pagers is available, use an internal implementation to pass stdin to stdout. Don't bother with trying 'cat', because it's no more useful than the internal pager. https://bugzilla.redhat.com/show_bug.cgi?id=713707
This commit is contained in:
parent
7c83341a59
commit
4a8e40ebd0
18
src/pager.c
18
src/pager.c
@ -20,6 +20,7 @@
|
|||||||
***/
|
***/
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
#include <fcntl.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -31,6 +32,18 @@
|
|||||||
|
|
||||||
static pid_t pager_pid = 0;
|
static pid_t pager_pid = 0;
|
||||||
|
|
||||||
|
static void pager_fallback(void) {
|
||||||
|
ssize_t n;
|
||||||
|
do {
|
||||||
|
n = splice(STDIN_FILENO, NULL, STDOUT_FILENO, NULL, 64*1024, 0);
|
||||||
|
} while (n > 0);
|
||||||
|
if (n < 0) {
|
||||||
|
log_error("Internal pager failed: %m");
|
||||||
|
_exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
_exit(EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
void pager_open(void) {
|
void pager_open(void) {
|
||||||
int fd[2];
|
int fd[2];
|
||||||
const char *pager;
|
const char *pager;
|
||||||
@ -96,10 +109,9 @@ void pager_open(void) {
|
|||||||
|
|
||||||
execlp("less", "less", NULL);
|
execlp("less", "less", NULL);
|
||||||
execlp("more", "more", NULL);
|
execlp("more", "more", NULL);
|
||||||
execlp("cat", "cat", NULL);
|
|
||||||
|
|
||||||
log_error("Unable to execute pager: %m");
|
pager_fallback();
|
||||||
_exit(EXIT_FAILURE);
|
/* not reached */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return in the parent */
|
/* Return in the parent */
|
||||||
|
Loading…
Reference in New Issue
Block a user