[w3m-dev 03758] Re: SVR4 signal behavior

* etc.c (reset_signals): use mySignal()
	(setup_child): ditto
	(myExec): ditto
	(mySignal): added, use sigaction if available
* fm.h (TRAP_ON): use mySignal
	(TRAP_OFF): ditto
* istream.c (ISclose): ditto
* main.c (sig_chld): ditto
	(main): ditto
	(do_dump): ditto
	(resize_hook): ditto
	(resize_handler): ditto
	(srchcore): ditto
	(readsh): ditto
	(SigAlarm): ditto
* proto.h (mySignal): added
* terms.c (error_dump): use mySignal()
	(set_int): ditto
	(mouse_init): ditto
From: Atsushi YOKOYAMA <yoko-a@cmh.fuchu.toshiba.co.jp>
This commit is contained in:
Fumitoshi UKAI
2003-02-18 15:43:23 +00:00
parent dc59ad1784
commit 8d7f5e6241
7 changed files with 101 additions and 54 deletions
+24 -1
View File
@@ -1,3 +1,26 @@
2003-02-19 Atsushi YOKOYAMA <yoko-a@cmh.fuchu.toshiba.co.jp>
* [w3m-dev 03758] Re: SVR4 signal behavior
* etc.c (reset_signals): use mySignal()
(setup_child): ditto
(myExec): ditto
(mySignal): added, use sigaction if available
* fm.h (TRAP_ON): use mySignal
(TRAP_OFF): ditto
* istream.c (ISclose): ditto
* main.c (sig_chld): ditto
(main): ditto
(do_dump): ditto
(resize_hook): ditto
(resize_handler): ditto
(srchcore): ditto
(readsh): ditto
(SigAlarm): ditto
* proto.h (mySignal): added
* terms.c (error_dump): use mySignal()
(set_int): ditto
(mouse_init): ditto
2003-02-19 Hironori SAKAMOTO <hsaka@mth.biglobe.ne.jp> 2003-02-19 Hironori SAKAMOTO <hsaka@mth.biglobe.ne.jp>
* [w3m-dev 03753] Fixed multipart.cgi * [w3m-dev 03753] Fixed multipart.cgi
@@ -7174,4 +7197,4 @@ a * [w3m-dev 03276] compile error on EWS4800
* release-0-2-1 * release-0-2-1
* import w3m-0.2.1 * import w3m-0.2.1
$Id: ChangeLog,v 1.753 2003/02/18 15:26:38 ukai Exp $ $Id: ChangeLog,v 1.754 2003/02/18 15:43:23 ukai Exp $
+36 -13
View File
@@ -1,4 +1,4 @@
/* $Id: etc.c,v 1.64 2003/02/06 17:21:43 ukai Exp $ */ /* $Id: etc.c,v 1.65 2003/02/18 15:43:23 ukai Exp $ */
#include "fm.h" #include "fm.h"
#include <pwd.h> #include <pwd.h>
#include "myctype.h" #include "myctype.h"
@@ -1335,21 +1335,21 @@ romanAlphabet(int n)
static void static void
reset_signals(void) reset_signals(void)
{ {
signal(SIGHUP, SIG_DFL); /* terminate process */ mySignal(SIGHUP, SIG_DFL); /* terminate process */
signal(SIGINT, SIG_DFL); /* terminate process */ mySignal(SIGINT, SIG_DFL); /* terminate process */
signal(SIGQUIT, SIG_DFL); /* terminate process */ mySignal(SIGQUIT, SIG_DFL); /* terminate process */
signal(SIGTERM, SIG_DFL); /* terminate process */ mySignal(SIGTERM, SIG_DFL); /* terminate process */
signal(SIGILL, SIG_DFL); /* create core image */ mySignal(SIGILL, SIG_DFL); /* create core image */
signal(SIGIOT, SIG_DFL); /* create core image */ mySignal(SIGIOT, SIG_DFL); /* create core image */
signal(SIGFPE, SIG_DFL); /* create core image */ mySignal(SIGFPE, SIG_DFL); /* create core image */
#ifdef SIGBUS #ifdef SIGBUS
signal(SIGBUS, SIG_DFL); /* create core image */ mySignal(SIGBUS, SIG_DFL); /* create core image */
#endif /* SIGBUS */ #endif /* SIGBUS */
#ifdef SIGCHLD #ifdef SIGCHLD
signal(SIGCHLD, SIG_IGN); mySignal(SIGCHLD, SIG_IGN);
#endif #endif
#ifdef SIGPIPE #ifdef SIGPIPE
signal(SIGPIPE, SIG_IGN); mySignal(SIGPIPE, SIG_IGN);
#endif #endif
} }
@@ -1379,7 +1379,7 @@ void
setup_child(int child, int i, int f) setup_child(int child, int i, int f)
{ {
reset_signals(); reset_signals();
signal(SIGINT, SIG_IGN); mySignal(SIGINT, SIG_IGN);
if (!child) if (!child)
SETPGRP(); SETPGRP();
close_tty(); close_tty();
@@ -1450,7 +1450,7 @@ open_pipe_rw(FILE ** fr, FILE ** fw)
void void
myExec(char *command) myExec(char *command)
{ {
signal(SIGINT, SIG_DFL); mySignal(SIGINT, SIG_DFL);
execl("/bin/sh", "sh", "-c", command, NULL); execl("/bin/sh", "sh", "-c", command, NULL);
exit(127); exit(127);
} }
@@ -1973,3 +1973,26 @@ FQDN(char *host)
} }
#endif /* USE_COOKIE */ #endif /* USE_COOKIE */
void (*mySignal(int signal_number, void (*action)(int)))(int)
{
#ifdef SA_RESTART
struct sigaction new_action, old_action;
sigemptyset(&new_action.sa_mask);
new_action.sa_handler = action;
if (signal_number == SIGALRM) {
#ifdef SA_INTERRUPT
new_action.sa_flags = SA_INTERRUPT;
#else
new_action.sa_flags = 0;
#endif
} else {
new_action.sa_flags = SA_RESTART;
}
sigaction(signal_number, &new_action, &old_action);
return(old_action.sa_handler);
#else
return(signal(signal_number, action));
#endif
}
+3 -3
View File
@@ -1,4 +1,4 @@
/* $Id: fm.h,v 1.112 2003/02/05 16:43:57 ukai Exp $ */ /* $Id: fm.h,v 1.113 2003/02/18 15:43:24 ukai Exp $ */
/* /*
* w3m: WWW wo Miru utility * w3m: WWW wo Miru utility
* *
@@ -781,7 +781,7 @@ global char fmInitialized init(FALSE);
global char QuietMessage init(FALSE); global char QuietMessage init(FALSE);
global char TrapSignal init(TRUE); global char TrapSignal init(TRUE);
#define TRAP_ON if (TrapSignal) { \ #define TRAP_ON if (TrapSignal) { \
prevtrap = signal(SIGINT, KeyAbort); \ prevtrap = mySignal(SIGINT, KeyAbort); \
if (fmInitialized) \ if (fmInitialized) \
term_cbreak(); \ term_cbreak(); \
} }
@@ -789,7 +789,7 @@ global char TrapSignal init(TRUE);
if (fmInitialized) \ if (fmInitialized) \
term_raw(); \ term_raw(); \
if (prevtrap) \ if (prevtrap) \
signal(SIGINT, prevtrap); \ mySignal(SIGINT, prevtrap); \
} }
extern unsigned char GlobalKeymap[]; extern unsigned char GlobalKeymap[];
+3 -3
View File
@@ -1,4 +1,4 @@
/* $Id: istream.c,v 1.20 2003/01/20 15:25:30 ukai Exp $ */ /* $Id: istream.c,v 1.21 2003/02/18 15:43:25 ukai Exp $ */
#include "fm.h" #include "fm.h"
#include "myctype.h" #include "myctype.h"
#include "istream.h" #include "istream.h"
@@ -183,9 +183,9 @@ ISclose(InputStream stream)
if (stream == NULL || stream->base.close == NULL || if (stream == NULL || stream->base.close == NULL ||
stream->base.type & IST_UNCLOSE) stream->base.type & IST_UNCLOSE)
return -1; return -1;
prevtrap = signal(SIGINT, SIG_IGN); prevtrap = mySignal(SIGINT, SIG_IGN);
stream->base.close(stream->base.handle); stream->base.close(stream->base.handle);
signal(SIGINT, prevtrap); mySignal(SIGINT, prevtrap);
return 0; return 0;
} }
+20 -20
View File
@@ -1,4 +1,4 @@
/* $Id: main.c,v 1.210 2003/02/05 16:45:08 ukai Exp $ */ /* $Id: main.c,v 1.211 2003/02/18 15:43:25 ukai Exp $ */
#define MAINPROGRAM #define MAINPROGRAM
#include "fm.h" #include "fm.h"
#include <signal.h> #include <signal.h>
@@ -317,7 +317,7 @@ sig_chld(int signo)
#else #else
wait(&p_stat); wait(&p_stat);
#endif #endif
signal(SIGCHLD, sig_chld); mySignal(SIGCHLD, sig_chld);
return; return;
} }
#endif #endif
@@ -730,7 +730,7 @@ main(int argc, char **argv, char **envp)
if (!w3m_dump && !w3m_backend) { if (!w3m_dump && !w3m_backend) {
fmInit(); fmInit();
#ifdef SIGWINCH #ifdef SIGWINCH
signal(SIGWINCH, resize_hook); mySignal(SIGWINCH, resize_hook);
#else /* not SIGWINCH */ #else /* not SIGWINCH */
setlinescols(); setlinescols();
setupscreen(); setupscreen();
@@ -751,12 +751,12 @@ main(int argc, char **argv, char **envp)
backend(); backend();
if (w3m_dump) if (w3m_dump)
signal(SIGINT, SIG_IGN); mySignal(SIGINT, SIG_IGN);
#ifdef SIGCHLD #ifdef SIGCHLD
signal(SIGCHLD, sig_chld); mySignal(SIGCHLD, sig_chld);
#endif #endif
#ifdef SIGPIPE #ifdef SIGPIPE
signal(SIGPIPE, SigPipe); mySignal(SIGPIPE, SigPipe);
#endif #endif
orig_GC_warn_proc = GC_set_warn_proc(wrap_GC_warn_proc); orig_GC_warn_proc = GC_set_warn_proc(wrap_GC_warn_proc);
@@ -1024,7 +1024,7 @@ main(int argc, char **argv, char **envp)
#endif /* USE_MOUSE */ #endif /* USE_MOUSE */
#ifdef USE_ALARM #ifdef USE_ALARM
if (CurrentAlarm->sec > 0) { if (CurrentAlarm->sec > 0) {
signal(SIGALRM, SigAlarm); mySignal(SIGALRM, SigAlarm);
alarm(CurrentAlarm->sec); alarm(CurrentAlarm->sec);
} }
#endif #endif
@@ -1033,7 +1033,7 @@ main(int argc, char **argv, char **envp)
need_resize_screen = FALSE; need_resize_screen = FALSE;
resize_screen(); resize_screen();
} }
signal(SIGWINCH, resize_handler); mySignal(SIGWINCH, resize_handler);
#endif #endif
#ifdef USE_IMAGE #ifdef USE_IMAGE
if (activeImage && displayImage && Currentbuf->img && if (activeImage && displayImage && Currentbuf->img &&
@@ -1045,7 +1045,7 @@ main(int argc, char **argv, char **envp)
#endif #endif
c = getch(); c = getch();
#ifdef SIGWINCH #ifdef SIGWINCH
signal(SIGWINCH, resize_hook); mySignal(SIGWINCH, resize_hook);
#endif #endif
#ifdef USE_ALARM #ifdef USE_ALARM
if (CurrentAlarm->sec > 0) { if (CurrentAlarm->sec > 0) {
@@ -1163,9 +1163,9 @@ do_dump(Buffer *buf)
{ {
MySignalHandler(*volatile prevtrap) (SIGNAL_ARG) = NULL; MySignalHandler(*volatile prevtrap) (SIGNAL_ARG) = NULL;
prevtrap = signal(SIGINT, intTrap); prevtrap = mySignal(SIGINT, intTrap);
if (SETJMP(IntReturn) != 0) { if (SETJMP(IntReturn) != 0) {
signal(SIGINT, prevtrap); mySignal(SIGINT, prevtrap);
return; return;
} }
if (w3m_dump & DUMP_EXTRA) if (w3m_dump & DUMP_EXTRA)
@@ -1176,7 +1176,7 @@ do_dump(Buffer *buf)
dump_source(buf); dump_source(buf);
if (w3m_dump == DUMP_BUFFER) if (w3m_dump == DUMP_BUFFER)
saveBuffer(buf, stdout, FALSE); saveBuffer(buf, stdout, FALSE);
signal(SIGINT, prevtrap); mySignal(SIGINT, prevtrap);
} }
void void
@@ -1358,7 +1358,7 @@ static MySignalHandler
resize_hook(SIGNAL_ARG) resize_hook(SIGNAL_ARG)
{ {
need_resize_screen = TRUE; need_resize_screen = TRUE;
signal(SIGWINCH, resize_hook); mySignal(SIGWINCH, resize_hook);
SIGNAL_RETURN; SIGNAL_RETURN;
} }
@@ -1366,7 +1366,7 @@ static MySignalHandler
resize_handler(SIGNAL_ARG) resize_handler(SIGNAL_ARG)
{ {
resize_screen(); resize_screen();
signal(SIGWINCH, resize_handler); mySignal(SIGWINCH, resize_handler);
SIGNAL_RETURN; SIGNAL_RETURN;
} }
@@ -1387,7 +1387,7 @@ SigPipe(SIGNAL_ARG)
#ifdef USE_MIGEMO #ifdef USE_MIGEMO
init_migemo(); init_migemo();
#endif #endif
signal(SIGPIPE, SigPipe); mySignal(SIGPIPE, SigPipe);
SIGNAL_RETURN; SIGNAL_RETURN;
} }
#endif #endif
@@ -1564,7 +1564,7 @@ srchcore(char *str, int (*func) (Buffer *, char *))
if (SearchString == NULL || *SearchString == '\0') if (SearchString == NULL || *SearchString == '\0')
return SR_NOTFOUND; return SR_NOTFOUND;
prevtrap = signal(SIGINT, intTrap); prevtrap = mySignal(SIGINT, intTrap);
crmode(); crmode();
if (SETJMP(IntReturn) == 0) { if (SETJMP(IntReturn) == 0) {
for (i = 0; i < PREC_NUM; i++) { for (i = 0; i < PREC_NUM; i++) {
@@ -1573,7 +1573,7 @@ srchcore(char *str, int (*func) (Buffer *, char *))
clear_mark(Currentbuf->currentLine); clear_mark(Currentbuf->currentLine);
} }
} }
signal(SIGINT, prevtrap); mySignal(SIGINT, prevtrap);
term_raw(); term_raw();
return result; return result;
} }
@@ -1973,10 +1973,10 @@ readsh(void)
displayBuffer(Currentbuf, B_NORMAL); displayBuffer(Currentbuf, B_NORMAL);
return; return;
} }
prevtrap = signal(SIGINT, intTrap); prevtrap = mySignal(SIGINT, intTrap);
crmode(); crmode();
buf = getshell(cmd); buf = getshell(cmd);
signal(SIGINT, prevtrap); mySignal(SIGINT, prevtrap);
term_raw(); term_raw();
if (buf == NULL) { if (buf == NULL) {
disp_message("Execution failed", TRUE); disp_message("Execution failed", TRUE);
@@ -5581,7 +5581,7 @@ SigAlarm(SIGNAL_ARG)
if (!Currentbuf->event) if (!Currentbuf->event)
CurrentAlarm = &DefaultAlarm; CurrentAlarm = &DefaultAlarm;
if (CurrentAlarm->sec > 0) { if (CurrentAlarm->sec > 0) {
signal(SIGALRM, SigAlarm); mySignal(SIGALRM, SigAlarm);
alarm(CurrentAlarm->sec); alarm(CurrentAlarm->sec);
} }
} }
+2 -1
View File
@@ -1,4 +1,4 @@
/* $Id: proto.h,v 1.90 2003/02/06 17:21:44 ukai Exp $ */ /* $Id: proto.h,v 1.91 2003/02/18 15:43:25 ukai Exp $ */
/* /*
* This file was automatically generated by version 1.7 of cextract. * This file was automatically generated by version 1.7 of cextract.
* Manual editing not recommended. * Manual editing not recommended.
@@ -610,6 +610,7 @@ extern char *url_unquote_conv(char *url, char code);
extern char *expandName(char *name); extern char *expandName(char *name);
extern Str tmpfname(int type, char *ext); extern Str tmpfname(int type, char *ext);
extern time_t mymktime(char *timestr); extern time_t mymktime(char *timestr);
extern void (*mySignal(int signal_number, void (*action)(int)))(int);
#ifdef USE_COOKIE #ifdef USE_COOKIE
extern char *FQDN(char *host); extern char *FQDN(char *host);
extern Str find_cookie(ParsedURL *pu); extern Str find_cookie(ParsedURL *pu);
+13 -13
View File
@@ -1,4 +1,4 @@
/* $Id: terms.c,v 1.45 2003/02/06 17:23:18 ukai Exp $ */ /* $Id: terms.c,v 1.46 2003/02/18 15:43:26 ukai Exp $ */
/* /*
* An original curses library for EUC-kanji by Akinori ITO, December 1989 * An original curses library for EUC-kanji by Akinori ITO, December 1989
* revised by Akinori ITO, January 1995 * revised by Akinori ITO, January 1995
@@ -603,7 +603,7 @@ reset_exit(SIGNAL_ARG)
MySignalHandler MySignalHandler
error_dump(SIGNAL_ARG) error_dump(SIGNAL_ARG)
{ {
signal(SIGIOT, SIG_DFL); mySignal(SIGIOT, SIG_DFL);
reset_tty(); reset_tty();
abort(); abort();
SIGNAL_RETURN; SIGNAL_RETURN;
@@ -612,17 +612,17 @@ error_dump(SIGNAL_ARG)
void void
set_int(void) set_int(void)
{ {
signal(SIGHUP, reset_exit); mySignal(SIGHUP, reset_exit);
signal(SIGINT, reset_exit); mySignal(SIGINT, reset_exit);
signal(SIGQUIT, reset_exit); mySignal(SIGQUIT, reset_exit);
signal(SIGTERM, reset_exit); mySignal(SIGTERM, reset_exit);
signal(SIGILL, error_dump); mySignal(SIGILL, error_dump);
signal(SIGIOT, error_dump); mySignal(SIGIOT, error_dump);
signal(SIGFPE, error_dump); mySignal(SIGFPE, error_dump);
#ifdef SIGBUS #ifdef SIGBUS
signal(SIGBUS, error_dump); mySignal(SIGBUS, error_dump);
#endif /* SIGBUS */ #endif /* SIGBUS */
/* signal(SIGSEGV, error_dump); */ /* mySignal(SIGSEGV, error_dump); */
} }
@@ -2082,13 +2082,13 @@ mouse_init()
} }
#endif /* defined(FBIO_MODEINFO) || #endif /* defined(FBIO_MODEINFO) ||
* defined(CONS_MODEINFO) */ * defined(CONS_MODEINFO) */
signal(SIGUSR2, SIG_IGN); mySignal(SIGUSR2, SIG_IGN);
mi.operation = MOUSE_MODE; mi.operation = MOUSE_MODE;
mi.u.mode.mode = 0; mi.u.mode.mode = 0;
mi.u.mode.signal = SIGUSR2; mi.u.mode.signal = SIGUSR2;
sysm_handler = NULL; sysm_handler = NULL;
if (ioctl(tty, CONS_MOUSECTL, &mi) != -1) { if (ioctl(tty, CONS_MOUSECTL, &mi) != -1) {
signal(SIGUSR2, sysmouse); mySignal(SIGUSR2, sysmouse);
mi.operation = MOUSE_SHOW; mi.operation = MOUSE_SHOW;
ioctl(tty, CONS_MOUSECTL, &mi); ioctl(tty, CONS_MOUSECTL, &mi);
sysm_handler = sysm_process_mouse; sysm_handler = sysm_process_mouse;