From 4e23ee03ca8cb0a408455a0a6d705c64fc2ec8d2 Mon Sep 17 00:00:00 2001 From: Rene Kita Date: Sun, 25 Dec 2022 15:11:44 +0100 Subject: [PATCH] Handle failed system calls Introduce a separate TU for utility functions util.c. Add a function exec_cmd to simplify execution of system commands with error handling. While at it, suppress a warning about unused result when executing a shell command. As we only display the command's output we do not care about the exit code. This fixes Debian bug #398989[0] [0]: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=398989 --- Makefile.in | 4 ++-- form.c | 6 +++--- main.c | 18 +++++++----------- util.c | 26 ++++++++++++++++++++++++++ util.h | 6 ++++++ 5 files changed, 44 insertions(+), 16 deletions(-) create mode 100644 util.c create mode 100644 util.h diff --git a/Makefile.in b/Makefile.in index 7241e0c..0d2539a 100644 --- a/Makefile.in +++ b/Makefile.in @@ -90,11 +90,11 @@ MODEL=@W3M_TARGET@-@W3M_LANG@ SRCS=main.c file.c buffer.c display.c etc.c search.c linein.c table.c local.c \ form.c map.c frame.c rc.c menu.c mailcap.c image.c \ symbol.c entity.c terms.c url.c ftp.c mimehead.c regex.c news.c \ - func.c cookie.c history.c backend.c $(KEYBIND_SRC) + func.c cookie.c history.c backend.c util.c $(KEYBIND_SRC) OBJS=main.o file.o buffer.o display.o etc.o search.o linein.o table.o local.o\ form.o map.o frame.o rc.o menu.o mailcap.o image.o \ symbol.o entity.o terms.o url.o ftp.o mimehead.o regex.o news.o \ - func.o cookie.o history.o backend.o $(KEYBIND_OBJ) + func.o cookie.o history.o backend.o util.o $(KEYBIND_OBJ) LSRCS=anchor.c parsetagx.c tagtable.c istream.c LOBJS=anchor.o parsetagx.o tagtable.o istream.o LLOBJS=version.o diff --git a/form.c b/form.c index a4b0022..7846c86 100644 --- a/form.c +++ b/form.c @@ -9,6 +9,7 @@ #include "myctype.h" #include "local.h" #include "regex.h" +#include "util.h" extern Str *textarea_str; extern int max_textarea; @@ -603,9 +604,8 @@ input_textarea(FormItemList *fi) form_fputs_decode(fi->value, f); fclose(f); - fmTerm(); - system(myEditor(Editor, tmpf, 1)->ptr); - fmInit(); + if (exec_cmd(myEditor(Editor, tmpf, 1)->ptr)) + goto input_end; if (fi->readonly) goto input_end; diff --git a/main.c b/main.c index 5712b88..265f70c 100644 --- a/main.c +++ b/main.c @@ -37,6 +37,8 @@ extern int do_getch(); #endif /* defined(USE_GPM) || defined(USE_SYSMOUSE) */ #endif +#include "util.h" + #ifdef __MINGW32_VERSION #include @@ -2242,7 +2244,7 @@ DEFUN(execsh, EXEC_SHELL SHELL, "Execute shell command and display output") if (cmd != NULL && *cmd != '\0') { fmTerm(); printf("\n"); - system(cmd); + (void)!system(cmd); /* We do not care about the exit code here! */ /* FIXME: gettextize? */ printf("\n[Hit any key]"); fflush(stdout); @@ -2792,9 +2794,7 @@ DEFUN(editBf, EDIT, "Edit local source") else cmd = myEditor(Editor, shell_quote(fn), cur_real_linenumber(Currentbuf)); - fmTerm(); - system(cmd->ptr); - fmInit(); + exec_cmd(cmd->ptr); displayBuffer(Currentbuf, B_FORCE_REDRAW); reload(); @@ -2815,10 +2815,8 @@ DEFUN(editScr, EDIT_SCREEN, "Edit rendered copy of document") } saveBuffer(Currentbuf, f, TRUE); fclose(f); - fmTerm(); - system(myEditor(Editor, shell_quote(tmpf), - cur_real_linenumber(Currentbuf))->ptr); - fmInit(); + exec_cmd(myEditor(Editor, shell_quote(tmpf), + cur_real_linenumber(Currentbuf))->ptr); unlink(tmpf); displayBuffer(Currentbuf, B_FORCE_REDRAW); } @@ -3111,10 +3109,8 @@ handleMailto(char *url) if ((pos = strchr(to->ptr, '?')) != NULL) Strtruncate(to, pos - to->ptr); } - fmTerm(); - system(myExtCommand(Mailer, shell_quote(file_unquote(to->ptr)), + exec_cmd(myExtCommand(Mailer, shell_quote(file_unquote(to->ptr)), FALSE)->ptr); - fmInit(); displayBuffer(Currentbuf, B_FORCE_REDRAW); pushHashHist(URLHist, url); return 1; diff --git a/util.c b/util.c new file mode 100644 index 0000000..77730f7 --- /dev/null +++ b/util.c @@ -0,0 +1,26 @@ +#include "util.h" + +#include "display.h" +#include "terms.h" + +#include +#include + +int +exec_cmd(char *cmd) +{ + int rv; + + fmTerm(); + if ((rv = system(cmd))) { + printf("\n[Hit any key]"); + fflush(stdout); + fmInit(); + getch(); + + return rv; + } + fmInit(); + + return 0; +} diff --git a/util.h b/util.h new file mode 100644 index 0000000..0367b1c --- /dev/null +++ b/util.h @@ -0,0 +1,6 @@ +#ifndef W3M_UTIL_H +#define W3M_UTIL_H + +int exec_cmd(char *cmd); + +#endif