diff options
| author | Robin Haberkorn <rhaberkorn@fmsbw.de> | 2026-04-19 00:02:16 +0200 |
|---|---|---|
| committer | Robin Haberkorn <rhaberkorn@fmsbw.de> | 2026-04-19 00:02:16 +0200 |
| commit | d4c864e92f89003e73883fe0b259e6c2e3bfb4f3 (patch) | |
| tree | 9a13565b8a5595af4ef628b9a3587d84021a52e5 | |
| parent | 7ac75b4053cbc1c758d38732fcc4d1d93d4a9fd8 (diff) | |
UNIX: do not automatically restart syscalls on SIGINTHEADmaster-fmsbw-cimaster
* signal() sets SA_RESTART by default.
* Some syscalls can theoretically block indefinitely.
Even opening a special file could result in an indefinitely
blocking operation, that should be interruptible.
You must still poll teco_interrupted in these read() loops of course.
* Also makes sure that clipboard operations are interruptible
even if $SCITECO_CLIPBOARD_GET blocks.
Although I couldn't provoke problems in practice,
I did observe hangs with xclip on Wayland on Linux,
that could only be resolved by manually killing xclip.
| -rw-r--r-- | configure.ac | 2 | ||||
| -rw-r--r-- | src/main.c | 14 |
2 files changed, 15 insertions, 1 deletions
diff --git a/configure.ac b/configure.ac index 673fb33..e703aed 100644 --- a/configure.ac +++ b/configure.ac @@ -215,7 +215,7 @@ case $host in *-*-linux* | *-*-*bsd* | *-*-darwin* | *-*-cygwin* | *-*-haiku*) # NOTE: Keep this on a single line for compatibility # with ancient versions of Autoconf. - AC_CHECK_FUNCS([realpath readlink pathconf fchown dup dup2 getpid open read kill mmap popen pclose isatty fork execv setsid], , [ + AC_CHECK_FUNCS([realpath readlink pathconf fchown dup dup2 getpid open read kill mmap popen pclose isatty fork execv setsid sigaction], , [ AC_MSG_ERROR([Missing libc function]) ]) AC_SEARCH_LIBS(dladdr, [dl], , [ @@ -388,7 +388,21 @@ main(int argc, char **argv) getchar(); #endif + /* + * FIXME: Gracefully handle SIGTERM. + * This however would require polling for the flag in Curses + * getch() loops. + * GTK already catches SIGTERM. + */ +#ifdef HAVE_SIGACTION + static const struct sigaction sigint = { + .sa_handler = teco_sigint_handler, + .sa_flags = 0 /* don't auto-restart syscalls */ + }; + sigaction(SIGINT, &sigint, NULL); +#else signal(SIGINT, teco_sigint_handler); +#endif /* * Important for Unicode handling in curses and glib. |
