mirror of
https://github.com/troglobit/finit.git
synced 2026-11-02 13:20:32 +00:00
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:
1 parent
fe27ed17eb
commit
4bcfd606b4
6 files changed
+76
-30
No files matched your search
+1
-1
@@ -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
@@ -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
@@ -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;
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in new issue
Block a user