X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fgeneral.c;h=079f8b7cd30efc77b9d66f105e3f6007e1374c69;hb=0f091044f8998faba2becd0f8c3ad9d5bc5976fb;hp=33946ad905c53663808db3b6c2645301fa6a80c7;hpb=a719a4bedec2bc512b7f95f7446e02f6662ebbc7;p=adns.git diff --git a/src/general.c b/src/general.c index 33946ad..079f8b7 100644 --- a/src/general.c +++ b/src/general.c @@ -24,6 +24,9 @@ #include #include +#include +#include +#include #include #include "internal.h" @@ -270,3 +273,32 @@ void adns__isort(void *array, int nobjs, int sz, void *tempbuf, } } } + +/* SIGPIPE protection. */ + +void adns__sigpipe_protect(adns_state ads) { + sigset_t toblock; + struct sigaction sa; + int r; + + if (ads->iflags & adns_if_nosigpipe) return; + + sigfillset(&toblock); + sigdelset(&toblock,SIGPIPE); + + sa.sa_handler= SIG_IGN; + sigfillset(&sa.sa_mask); + sa.sa_flags= 0; + + r= sigprocmask(SIG_SETMASK,&toblock,&ads->stdsigmask); assert(!r); + r= sigaction(SIGPIPE,&sa,&ads->stdsigpipe); assert(!r); +} + +void adns__sigpipe_unprotect(adns_state ads) { + int r; + + if (ads->iflags & adns_if_nosigpipe) return; + + r= sigaction(SIGPIPE,&ads->stdsigpipe,0); assert(!r); + r= sigprocmask(SIG_SETMASK,&ads->stdsigmask,0); assert(!r); +}