init: check setupterm() return value and error return value - sfeed_curses - sfeed curses UI (now part of sfeed, development is in sfeed)
(HTM) git clone git://git.codemadness.org/sfeed_curses
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit 830e63da7d15879638f082e241ee489b895e7782
(DIR) parent c94a5e5e01d617d1f1c2f08058df832148c4adc9
(HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date: Sat, 20 Mar 2021 12:51:10 +0100
init: check setupterm() return value and error return value
POSIX specifies:
"If setupterm() detects an error and errret is a null pointer, setupterm()
writes a diagnostic message and exits."
Specify errret and cleanup ourselves. minicurses will ignore this pointer, it
will not use terminfo anyway. Initialize errret to 1 (success).
Make sure to define and check against `OK` or `ERR` for portability, which is
defined in POSIX.
Reference:
https://pubs.opengroup.org/onlinepubs/7908799/xcurses/del_curterm.html
Discussed with quinq, thanks!
Diffstat:
M minicurses.h | 9 +++++++--
M sfeed_curses.c | 6 +++++-
2 files changed, 12 insertions(+), 3 deletions(-)
---
(DIR) diff --git a/minicurses.h b/minicurses.h
@@ -1,5 +1,10 @@
#include <sys/ioctl.h>
+#undef ERR
+#define ERR (-1)
+#undef OK
+#define OK (0)
+
const char *clr_eol = "\x1b[K";
const char *clear_screen = "\x1b[H\x1b[2J";
const char *cursor_address = "\x1b[%d;%dH";
@@ -23,13 +28,13 @@ setupterm(char *term, int fildes, int *errret)
struct winsize winsz;
if (ioctl(fildes, TIOCGWINSZ, &winsz) == -1)
- return -1; /* ERR */
+ return ERR;
if (winsz.ws_col > 0)
columns = winsz.ws_col;
if (winsz.ws_row > 0)
lines = winsz.ws_row;
- return 0; /* OK */
+ return OK;
}
char *
(DIR) diff --git a/sfeed_curses.c b/sfeed_curses.c
@@ -636,6 +636,7 @@ void
init(void)
{
struct sigaction sa;
+ int errret = 1;
tcgetattr(0, &tsave);
memcpy(&tcur, &tsave, sizeof(tcur));
@@ -644,7 +645,10 @@ init(void)
tcur.c_cc[VTIME] = 0;
tcsetattr(0, TCSANOW, &tcur);
- setupterm(NULL, 1, NULL);
+ if (setupterm(NULL, 1, &errret) != OK || errret != 1) {
+ errno = 0;
+ die("setupterm: terminfo database or entry for $TERM not found");
+ }
resizewin();
appmode(1);