|
Packit |
8f70b4 |
/*
|
|
Packit |
8f70b4 |
* lftp - file transfer program
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* Copyright (c) 1996-2012 by Alexander V. Lukyanov (lav@yars.free.net)
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* This program is free software; you can redistribute it and/or modify
|
|
Packit |
8f70b4 |
* it under the terms of the GNU General Public License as published by
|
|
Packit |
8f70b4 |
* the Free Software Foundation; either version 3 of the License, or
|
|
Packit |
8f70b4 |
* (at your option) any later version.
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* This program is distributed in the hope that it will be useful,
|
|
Packit |
8f70b4 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
8f70b4 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
8f70b4 |
* GNU General Public License for more details.
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* You should have received a copy of the GNU General Public License
|
|
Packit |
8f70b4 |
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
8f70b4 |
*/
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
#include <config.h>
|
|
Packit |
8f70b4 |
#include "SignalHook.h"
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
int *SignalHook::counts=0;
|
|
Packit |
8f70b4 |
struct sigaction *SignalHook::old_handlers=0;
|
|
Packit |
8f70b4 |
bool *SignalHook::old_saved=0;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void SignalHook::cnt_handler(int sig)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
counts[sig]++;
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void SignalHook::set_signal(int sig,signal_handler handler)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
if(!old_saved[sig])
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
sigaction(sig,0,&old_handlers[sig]);
|
|
Packit |
8f70b4 |
if(sig==SIGINT && old_handlers[sig].sa_handler==(signal_handler)SIG_IGN)
|
|
Packit |
8f70b4 |
return;
|
|
Packit |
8f70b4 |
old_saved[sig]=true;
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
struct sigaction act;
|
|
Packit |
8f70b4 |
act.sa_handler=handler;
|
|
Packit |
8f70b4 |
act.sa_flags=0;
|
|
Packit |
8f70b4 |
sigemptyset(&act.sa_mask);
|
|
Packit |
8f70b4 |
sigaction(sig,&act,0);
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void SignalHook::Restore(int i)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
if(old_saved[i])
|
|
Packit |
8f70b4 |
sigaction(i,&old_handlers[i],0);
|
|
Packit |
8f70b4 |
SignalHook::Unblock(i);
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void SignalHook::RestoreAll()
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
for(int i=0; i<256; i++)
|
|
Packit |
8f70b4 |
Restore(i);
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void SignalHook::Block(int sig)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
sigset_t s;
|
|
Packit |
8f70b4 |
sigemptyset(&s);
|
|
Packit |
8f70b4 |
sigaddset(&s,sig);
|
|
Packit |
8f70b4 |
sigprocmask(SIG_BLOCK,&s,0);
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
void SignalHook::Unblock(int sig)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
sigset_t s;
|
|
Packit |
8f70b4 |
sigemptyset(&s);
|
|
Packit |
8f70b4 |
sigaddset(&s,sig);
|
|
Packit |
8f70b4 |
sigprocmask(SIG_UNBLOCK,&s,0);
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void SignalHook::ClassInit()
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
if(counts)
|
|
Packit |
8f70b4 |
return;
|
|
Packit |
8f70b4 |
counts=new int[256];
|
|
Packit |
8f70b4 |
old_handlers=new struct sigaction[256];
|
|
Packit |
8f70b4 |
old_saved=new bool[256];
|
|
Packit |
8f70b4 |
for(int i=0; i<256; i++)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
counts[i]=0;
|
|
Packit |
8f70b4 |
old_saved[i]=false;
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
Ignore(SIGPIPE); // want to get EPIPE
|
|
Packit |
8f70b4 |
#ifdef SIGXFSZ
|
|
Packit |
8f70b4 |
Ignore(SIGXFSZ); // and EFBIG
|
|
Packit |
8f70b4 |
#endif
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void SignalHook::Cleanup()
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
delete [] counts;
|
|
Packit |
8f70b4 |
delete [] old_handlers;
|
|
Packit |
8f70b4 |
delete [] old_saved;
|
|
Packit |
8f70b4 |
}
|