"Fossies" - the Fresh Open Source Software Archive  

Source code changes of the file "libedit/sig.c" between
tnftp-20151004.tar.gz and tnftp-20200705.tar.gz

About: tnftp is an enhanced ftp client (prior name "lukemftp").

sig.c  (tnftp-20151004):sig.c  (tnftp-20200705)
/* $NetBSD: sig.c,v 1.6 2005/06/09 16:48:58 lukem Exp $ */ /* $NetBSD: sig.c,v 1.9 2020/07/04 13:43:21 lukem Exp $ */
/* from NetBSD: sig.c,v 1.11 2003/08/07 16:44:33 agc Exp */ /* from NetBSD: sig.c,v 1.26 2016/05/09 21:46:56 christos Exp */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
* The Regents of the University of California. All rights reserved. * The Regents of the University of California. All rights reserved.
* *
* This code is derived from software contributed to Berkeley by * This code is derived from software contributed to Berkeley by
* Christos Zoulas of Cornell University. * Christos Zoulas of Cornell University.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
skipping to change at line 36 skipping to change at line 36
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include "tnftp.h" #include "config.h"
#include "sys.h"
#if 0 /* tnftp */
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)sig.c 8.1 (Berkeley) 6/4/93";
#else
__RCSID(" NetBSD: sig.c,v 1.26 2016/05/09 21:46:56 christos Exp ");
#endif
#endif /* not lint && not SCCSID */
#endif /* tnftp */
/* /*
* sig.c: Signal handling stuff. * sig.c: Signal handling stuff.
* our policy is to trap all signals, set a good state * our policy is to trap all signals, set a good state
* and pass the ball to our caller. * and pass the ball to our caller.
*/ */
#include "el.h" #if 0 /* tnftp */
#include <errno.h>
#include <stdlib.h> #include <stdlib.h>
#endif /* tnftp */
#include "src/progressbar.h" /* for xsignal_restart() */ #include "el.h"
#include "common.h"
private EditLine *sel = NULL; static EditLine *sel = NULL;
private const int sighdl[] = { static const int sighdl[] = {
#define _DO(a) (a), #define _DO(a) (a),
ALLSIGS ALLSIGS
#undef _DO #undef _DO
- 1 - 1
}; };
private void sig_handler(int); static void sig_handler(int);
/* sig_handler(): /* sig_handler():
* This is the handler called for all signals * This is the handler called for all signals
* XXX: we cannot pass any data so we just store the old editline * XXX: we cannot pass any data so we just store the old editline
* state in a private variable * state in a private variable
*/ */
private void static void
sig_handler(int signo) sig_handler(int signo)
{ {
int i; int i, save_errno;
sigset_t nset, oset; sigset_t nset, oset;
save_errno = errno;
(void) sigemptyset(&nset); (void) sigemptyset(&nset);
(void) sigaddset(&nset, signo); (void) sigaddset(&nset, signo);
(void) sigprocmask(SIG_BLOCK, &nset, &oset); (void) sigprocmask(SIG_BLOCK, &nset, &oset);
sel->el_signal->sig_no = signo;
switch (signo) { switch (signo) {
case SIGCONT: case SIGCONT:
tty_rawmode(sel); tty_rawmode(sel);
if (ed_redisplay(sel, 0) == CC_REFRESH) if (ed_redisplay(sel, 0) == CC_REFRESH)
re_refresh(sel); re_refresh(sel);
term__flush(); terminal__flush(sel);
break; break;
case SIGWINCH: case SIGWINCH:
el_resize(sel); el_resize(sel);
break; break;
default: default:
tty_cookedmode(sel); tty_cookedmode(sel);
break; break;
} }
for (i = 0; sighdl[i] != -1; i++) for (i = 0; sighdl[i] != -1; i++)
if (signo == sighdl[i]) if (signo == sighdl[i])
break; break;
(void) xsignal_restart(signo, sel->el_signal[i], 1); (void) sigaction(signo, &sel->el_signal->sig_action[i], NULL);
sel->el_signal->sig_action[i].sa_handler = SIG_ERR;
sel->el_signal->sig_action[i].sa_flags = 0;
sigemptyset(&sel->el_signal->sig_action[i].sa_mask);
(void) sigprocmask(SIG_SETMASK, &oset, NULL); (void) sigprocmask(SIG_SETMASK, &oset, NULL);
(void) kill(0, signo); (void) kill(0, signo);
errno = save_errno;
} }
/* sig_init(): /* sig_init():
* Initialize all signal stuff * Initialize all signal stuff
*/ */
protected int libedit_private int
sig_init(EditLine *el) sig_init(EditLine *el)
{ {
int i; size_t i;
sigset_t nset, oset; sigset_t *nset, oset;
(void) sigemptyset(&nset); el->el_signal = el_malloc(sizeof(*el->el_signal));
#define _DO(a) (void) sigaddset(&nset, a); if (el->el_signal == NULL)
return -1;
nset = &el->el_signal->sig_set;
(void) sigemptyset(nset);
#define _DO(a) (void) sigaddset(nset, a);
ALLSIGS ALLSIGS
#undef _DO #undef _DO
(void) sigprocmask(SIG_BLOCK, &nset, &oset); (void) sigprocmask(SIG_BLOCK, nset, &oset);
#define SIGSIZE (sizeof(sighdl) / sizeof(sighdl[0]) * sizeof(el_signalhan
dler_t))
el->el_signal = (el_signalhandler_t *) el_malloc(SIGSIZE); for (i = 0; sighdl[i] != -1; i++) {
if (el->el_signal == NULL) el->el_signal->sig_action[i].sa_handler = SIG_ERR;
return (-1); el->el_signal->sig_action[i].sa_flags = 0;
for (i = 0; sighdl[i] != -1; i++) sigemptyset(&el->el_signal->sig_action[i].sa_mask);
el->el_signal[i] = SIG_ERR; }
(void) sigprocmask(SIG_SETMASK, &oset, NULL); (void) sigprocmask(SIG_SETMASK, &oset, NULL);
return (0); return 0;
} }
/* sig_end(): /* sig_end():
* Clear all signal stuff * Clear all signal stuff
*/ */
protected void libedit_private void
sig_end(EditLine *el) sig_end(EditLine *el)
{ {
el_free((ptr_t) el->el_signal); el_free(el->el_signal);
el->el_signal = NULL; el->el_signal = NULL;
} }
/* sig_set(): /* sig_set():
* set all the signal handlers * set all the signal handlers
*/ */
protected void libedit_private void
sig_set(EditLine *el) sig_set(EditLine *el)
{ {
int i; size_t i;
sigset_t nset, oset; sigset_t oset;
struct sigaction osa, nsa;
nsa.sa_handler = sig_handler;
nsa.sa_flags = 0;
sigemptyset(&nsa.sa_mask);
(void) sigemptyset(&nset); (void) sigprocmask(SIG_BLOCK, &el->el_signal->sig_set, &oset);
#define _DO(a) (void) sigaddset(&nset, a);
ALLSIGS
#undef _DO
(void) sigprocmask(SIG_BLOCK, &nset, &oset);
for (i = 0; sighdl[i] != -1; i++) { for (i = 0; sighdl[i] != -1; i++) {
el_signalhandler_t s;
/* This could happen if we get interrupted */ /* This could happen if we get interrupted */
if ((s = xsignal_restart(sighdl[i], sig_handler, 1)) != sig_handl if (sigaction(sighdl[i], &nsa, &osa) != -1 &&
er) osa.sa_handler != sig_handler)
el->el_signal[i] = s; el->el_signal->sig_action[i] = osa;
} }
sel = el; sel = el;
(void) sigprocmask(SIG_SETMASK, &oset, NULL); (void) sigprocmask(SIG_SETMASK, &oset, NULL);
} }
/* sig_clr(): /* sig_clr():
* clear all the signal handlers * clear all the signal handlers
*/ */
protected void libedit_private void
sig_clr(EditLine *el) sig_clr(EditLine *el)
{ {
int i; size_t i;
sigset_t nset, oset; sigset_t oset;
(void) sigemptyset(&nset); (void) sigprocmask(SIG_BLOCK, &el->el_signal->sig_set, &oset);
#define _DO(a) (void) sigaddset(&nset, a);
ALLSIGS
#undef _DO
(void) sigprocmask(SIG_BLOCK, &nset, &oset);
for (i = 0; sighdl[i] != -1; i++) for (i = 0; sighdl[i] != -1; i++)
if (el->el_signal[i] != SIG_ERR) if (el->el_signal->sig_action[i].sa_handler != SIG_ERR)
(void) xsignal_restart(sighdl[i], el->el_signal[i], 1); (void)sigaction(sighdl[i],
&el->el_signal->sig_action[i], NULL);
sel = NULL; /* we are going to die if the handler is sel = NULL; /* we are going to die if the handler is
* called */ * called */
(void) sigprocmask(SIG_SETMASK, &oset, NULL); (void)sigprocmask(SIG_SETMASK, &oset, NULL);
} }
 End of changes. 33 change blocks. 
53 lines changed or deleted 71 lines changed or added

Home  |  About  |  Features  |  All  |  Newest  |  Dox  |  Diffs  |  RSS Feeds  |  Screenshots  |  Comments  |  Imprint  |  Privacy  |  HTTP(S)