Refactor screen_init(), use methods developed in pimd project

- Refactor screen_init()
  - use native impl. of TTY probing from pimd project
    - check if TIOCWINSZ works
    - check if we're running in watch(1), for initctl
  - check if ANSI goto(999,999) escape seq. works (invasive)
  - fallback to 80x24
- Drop screen_exit()
- Rename screen_init() to get_width(), for now, matching pimd
- Relocate call in main() to banner(), first fn to write to TTY

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
Joachim Wiberg committed 2021-03-04 23:23:31 +01:00
1 parent fe27ed17eb
commit 4bcfd606b4
6 files changed
+76 -30

No files matched your search

+1 -1
View File
@@ -32,7 +32,7 @@ AC_PROG_MKDIR_P
# Configuration. # Configuration.
AC_HEADER_STDC AC_HEADER_STDC
AC_CHECK_HEADERS([fstaby.h termios.h]) AC_CHECK_HEADERS([fstaby.h termios.h sys/ioctl.h])
AC_CHECK_FUNCS([strstr getopt getfsenty]) AC_CHECK_FUNCS([strstr getopt getfsenty])
# Check for uint[8,16,32]_t # Check for uint[8,16,32]_t
+4 -6
View File
@@ -478,10 +478,6 @@ int main(int argc, char *argv[])
chdir("/"); chdir("/");
umask(0); umask(0);
/* Set up canvas */
if (!rescue && !debug)
screen_init();
/* Allow progress, if enabled */ /* Allow progress, if enabled */
enable_progress(1); enable_progress(1);
@@ -490,8 +486,10 @@ int main(int argc, char *argv[])
*/ */
emergency_shell(); emergency_shell();
/* Load plugins early, the first hook is in banner(), so we /*
* need plugins loaded before calling it. */ * Load plugins early, the first hook is in banner(), so we
* need plugins loaded before calling it.
*/
plugin_init(&loop); plugin_init(&loop);
/* /*
+7 -1
View File
@@ -121,7 +121,7 @@ static void add_console(char *cons)
num_cons++; num_cons++;
} }
void console_init(void) static void find_active_consoles(void)
{ {
char *cons, *ptr, *tok; char *cons, *ptr, *tok;
char buf[512]; char buf[512];
@@ -148,6 +148,12 @@ void console_init(void)
} }
} }
void console_init(void)
{
find_active_consoles();
screen_init();
}
ssize_t cprintf(const char *fmt, ...) ssize_t cprintf(const char *fmt, ...)
{ {
const size_t len = strlen(fmt) * 2; const size_t len = strlen(fmt) * 2;
+1 -4
View File
@@ -50,9 +50,7 @@ void log_exit(void)
* Unless in debug mode at shutdown, Reinitialize screen, * Unless in debug mode at shutdown, Reinitialize screen,
* terminal may have been resized at runtime * terminal may have been resized at runtime
*/ */
if (debug) if (!debug)
screen_exit();
else
screen_init(); screen_init();
enable_progress(1); enable_progress(1);
@@ -79,7 +77,6 @@ void log_debug(void)
if (debug) { if (debug) {
loglevel = LOG_DEBUG; loglevel = LOG_DEBUG;
screen_exit();
} else { } else {
loglevel = LOG_NOTICE; loglevel = LOG_NOTICE;
screen_init(); screen_init();
+62 -15
View File
@@ -28,9 +28,15 @@
#include <string.h> #include <string.h>
#include <stdarg.h> #include <stdarg.h>
#include <stdlib.h> #include <stdlib.h>
#ifdef HAVE_TERMIOS_H
# include <termios.h>
#endif
#include <time.h> #include <time.h>
#include <unistd.h> #include <unistd.h>
#include <utmp.h> #include <utmp.h>
#ifdef HAVE_SYS_IOCTL_H
# include <sys/ioctl.h>
#endif
#include <sys/sysinfo.h> /* sysinfo() */ #include <sys/sysinfo.h> /* sysinfo() */
#include <lite/lite.h> /* strlcat() */ #include <lite/lite.h> /* strlcat() */
#include "util.h" #include "util.h"
@@ -202,25 +208,66 @@ char *sanitize(char *arg, size_t len)
} }
/* /*
* Called at boot, and shutdown, to (re)initialize the * Called by initctl, and by finit at boot and shutdown, to
* screen size for print() et al. * (re)initialize the screen size for print() et al.
*/ */
void screen_init(void) int screen_init(void)
{ {
if (!isatty(STDOUT_FILENO)) #ifdef HAVE_TERMIOS_H
return; struct pollfd fd = { STDIN_FILENO, POLLIN, 0 };
struct winsize ws = { 0 };
struct termios tc, saved;
initscr(&screen_rows, &screen_cols); /*
} * Basic TTY init, CLOCaL is important or TIOCWINSZ will block
* until DCD is asserted, and we won't ever get it.
*/
tcgetattr(STDERR_FILENO, &tc);
saved = tc;
tc.c_cflag |= (CLOCAL | CREAD);
tc.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
tcsetattr(STDERR_FILENO, TCSANOW, &tc);
/* /* 1. Try TIOCWINSZ to query window size from kernel */
* Called when debug mode is enabled to revert back if (!ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws)) {
* to old-school safe defaults. screen_rows = ws.ws_row;
*/ screen_cols = ws.ws_col;
void screen_exit(void)
{ /* Likely doesn't work in PID 1 after kernel starts us ... */
screen_rows = 24; if (!ws.ws_row && !ws.ws_col)
screen_cols = 80; goto fallback;
} else if (!isatty(STDOUT_FILENO)) {
/* 2. We may be running under watch(1) */
screen_cols = atonum(getenv("COLUMNS"));
screen_rows = atonum(getenv("LINES"));
} else {
fallback:
/* 3. ANSI goto + query cursor position trick as fallback */
fprintf(stderr, "\e7\e[r\e[999;999H\e[6n");
if (poll(&fd, 1, 300) > 0) {
int row, col;
if (scanf("\e[%d;%dR", &row, &col) == 2) {
screen_cols = col;
screen_rows = row;
}
}
/* Jump back to where we started (\e7) */
fprintf(stderr, "\e8");
}
tcsetattr(STDERR_FILENO, TCSANOW, &saved);
/* Sanity check */
if (screen_cols <= 0)
screen_cols = 80;
if (screen_rows <= 0)
screen_rows = 24;
#endif
return screen_cols;
} }
/** /**
+1 -3
View File
@@ -55,9 +55,7 @@ char *uptime (long secs, char *buf, size_t len);
char *sanitize (char *arg, size_t len); char *sanitize (char *arg, size_t len);
void screen_init (void); int screen_init (void);
void screen_exit (void);
int screen_width (void);
static inline char *strterm(char *str, size_t len) static inline char *strterm(char *str, size_t len)
{ {