More HP-inspired patches

The Hermit Hacker scrappy at hub.org
Wed Sep 15 11:53:43 UTC 1999


If I'm understanding this patch, I definitely don't agree with it...

Reading it through, since I (FreeBSD) do HAVE_SIGACTION, its going to use
your xsignal to replace my system signal function, that is reliable?
*raised eyebrow*

I'd sooner see something that goes:

#if defined(HPUX) 
# define HAVE_BAD_SIGNAL
#endif

And use that instead of the HAVE_SIGACTION you are currently using...



On Tue, 14 Sep 1999, Heath Kehoe wrote:

> The included patch addresses several issues, mostly related to HP/UX.
> 
>  * Created a new libinn function xsignal(), which implements a signal()
>    function using sigaction().  This is because HP/UX (along with other
>    SYSV-derived systems) has an "unreliable" signal.  You have to re-set
>    the signal handler when a signal goes off, and a signal may cause
>    a system call to fail (with EINTR).  Using sigaction, you don't have
>    these problems.
> 
>    I created a symbol USE_SIGACTION, that when defined, the xsignal
>    function does a call to sigaction.  Otherwise, xsignal simply uses
>    signal.  (The innfeed source already has something like this.)
>    Currently, USE_SIGACTION only gets defined for HP/UX (in clibrary.h).
>    Perhaps we could define it through configure, but I don't know
>    enough about autoconf to set it up right now.
> 
>  * HP/UX headers define LOG_NEWS, but syslogd ignores it (and if you
>    have 'news' in syslog.conf, syslogd says 'unknown facility').
>    So I put in a check in config.h for HPUX to reset the log facility
>    to LOG_LOCAL1.
> 
> Would anyone object if I made the syslog facility configurable
> via inn.conf?  That way it'll be easier to customize which facility
> is used.
> 
>  * With HP/UX, you definitely do not want to mix mmap-accesses of
>    a file with read()s and write()s of the same file.  Writes may
>    get lost, and reads will see stale data, unless you do lots of
>    msyncs (which is a pain).  The buffindexed code uses mmap-accesses
>    in all but four places, so I modified those last few pwrite()s
>    to use mmap instead.  With this change, buffindexed has been
>    working reliably on my servers.  Without this change, the OV
>    buffers invariably become corrupt.
> 
> --Heath
> 
> 
> diff -rc ../inn-1999-09-13_03-00/MANIFEST ./MANIFEST
> *** ../inn-1999-09-13_03-00/MANIFEST	Fri Aug 27 00:29:06 1999
> --- ./MANIFEST	Tue Sep 14 16:03:49 1999
> ***************
> *** 375,380 ****
> --- 375,381 ----
>   lib/xmalloc.c               1 Failsafe memory allocation wrapper
>   lib/xmemerr.c               1 Memory allocation error routine
>   lib/xrealloc.c              1 Failsafe memory reallocation wrapper
> + lib/xsignal.c               1 signal() wrapper using sigaction
>   lib/xwrite.c                1 Write that handles partial transfers
>   lib/xwritev.c               1 Writev that handles partial transfers
>   ltconfig                    1 Script for libtool
> diff -rc ../inn-1999-09-13_03-00/backends/batcher.c ./backends/batcher.c
> *** ../inn-1999-09-13_03-00/backends/batcher.c	Sat Sep 11 06:08:40 1999
> --- ./backends/batcher.c	Mon Sep 13 13:15:46 1999
> ***************
> *** 192,198 ****
>   {
>       GotInterrupt = TRUE;
>       /* Let two interrupts kill us. */
> !     (void)signal(s, SIG_DFL);
>   }
>   
>   
> --- 192,198 ----
>   {
>       GotInterrupt = TRUE;
>       /* Let two interrupts kill us. */
> !     (void)xsignal(s, SIG_DFL);
>   }
>   
>   
> ***************
> *** 322,331 ****
>       ArtsInCB = 0;
>       Cookie = -1;
>       GotInterrupt = FALSE;
> !     (void)signal(SIGHUP, CATCHinterrupt);
> !     (void)signal(SIGINT, CATCHinterrupt);
> !     (void)signal(SIGTERM, CATCHinterrupt);
> !     /* (void)signal(SIGPIPE, CATCHinterrupt); */
>       (void)GetTimeInfo(&Now);
>       STATbegin = TIMEINFOasDOUBLE(Now);
>   
> --- 322,331 ----
>       ArtsInCB = 0;
>       Cookie = -1;
>       GotInterrupt = FALSE;
> !     (void)xsignal(SIGHUP, CATCHinterrupt);
> !     (void)xsignal(SIGINT, CATCHinterrupt);
> !     (void)xsignal(SIGTERM, CATCHinterrupt);
> !     /* (void)xsignal(SIGPIPE, CATCHinterrupt); */
>       (void)GetTimeInfo(&Now);
>       STATbegin = TIMEINFOasDOUBLE(Now);
>   
> diff -rc ../inn-1999-09-13_03-00/backends/buffchan.c ./backends/buffchan.c
> *** ../inn-1999-09-13_03-00/backends/buffchan.c	Wed May 20 22:00:10 1998
> --- ./backends/buffchan.c	Mon Sep 13 13:15:46 1999
> ***************
> *** 366,372 ****
>       int		s;
>   {
>       GotInterrupt = TRUE;
> !     (void)signal(s, SIG_DFL);
>   }
>   
>   
> --- 366,372 ----
>       int		s;
>   {
>       GotInterrupt = TRUE;
> !     (void)xsignal(s, SIG_DFL);
>   }
>   
>   
> ***************
> *** 399,410 ****
>       GotInterrupt = FALSE;
>       (void)umask(NEWSUMASK);
>   
> !     (void)signal(SIGHUP, CATCHinterrupt);
> !     (void)signal(SIGINT, CATCHinterrupt);
> !     (void)signal(SIGQUIT, CATCHinterrupt);
> !     (void)signal(SIGPIPE, CATCHinterrupt);
> !     (void)signal(SIGTERM, CATCHinterrupt);
> !     (void)signal(SIGALRM, CATCHinterrupt);
>   
>       /* Parse JCL. */
>       while ((i = getopt(ac, av, "bc:C:d:f:l:L:m:p:rs:u")) != EOF)
> --- 399,410 ----
>       GotInterrupt = FALSE;
>       (void)umask(NEWSUMASK);
>   
> !     (void)xsignal(SIGHUP, CATCHinterrupt);
> !     (void)xsignal(SIGINT, CATCHinterrupt);
> !     (void)xsignal(SIGQUIT, CATCHinterrupt);
> !     (void)xsignal(SIGPIPE, CATCHinterrupt);
> !     (void)xsignal(SIGTERM, CATCHinterrupt);
> !     (void)xsignal(SIGALRM, CATCHinterrupt);
>   
>       /* Parse JCL. */
>       while ((i = getopt(ac, av, "bc:C:d:f:l:L:m:p:rs:u")) != EOF)
> diff -rc ../inn-1999-09-13_03-00/backends/innxbatch.c ./backends/innxbatch.c
> *** ../inn-1999-09-13_03-00/backends/innxbatch.c	Wed May 20 22:00:11 1998
> --- ./backends/innxbatch.c	Mon Sep 13 13:15:46 1999
> ***************
> *** 307,313 ****
>   {
>       GotInterrupt = TRUE;
>       /* Let two interrupts kill us. */
> !     (void)signal(s, SIG_DFL);
>   }
>   
>   
> --- 307,313 ----
>   {
>       GotInterrupt = TRUE;
>       /* Let two interrupts kill us. */
> !     (void)xsignal(s, SIG_DFL);
>   }
>   
>   
> ***************
> *** 408,415 ****
>     /* Open a connection to the remote server. */
>     if (ConnectTimeout) {
>       GotAlarm = FALSE;
> !     old = signal(SIGALRM, CATCHalarm);
> !     (void)alarm(ConnectTimeout);
>       JMPyes = TRUE;
>       if (setjmp(JMPwhere)) {
>         (void)fprintf(stderr, "Can't connect to %s, timed out\n",
> --- 408,414 ----
>     /* Open a connection to the remote server. */
>     if (ConnectTimeout) {
>       GotAlarm = FALSE;
> !     old = xsignal(SIGALRM, CATCHalarm);
>       JMPyes = TRUE;
>       if (setjmp(JMPwhere)) {
>         (void)fprintf(stderr, "Can't connect to %s, timed out\n",
> ***************
> *** 416,421 ****
> --- 415,421 ----
>   		    REMhost);
>         exit(1);
>       }
> +     (void)alarm(ConnectTimeout);
>     }
>     if (NNTPconnect(REMhost, NNTP_PORT, &From, &To, buff) < 0 || GotAlarm) {
>       i = errno;
> ***************
> *** 442,448 ****
>     }
>     if (ConnectTimeout) {
>       (void)alarm(0);
> !     (void)signal(SIGALRM, old);
>       JMPyes = FALSE;
>     }
>     
> --- 442,448 ----
>     }
>     if (ConnectTimeout) {
>       (void)alarm(0);
> !     (void)xsignal(SIGALRM, old);
>       JMPyes = FALSE;
>     }
>     
> ***************
> *** 458,475 ****
>       (void)perror("cant setsockopt(RCVBUF)");
>   #endif	/* defined(SOL_SOCKET) && defined(SO_SNDBUF) && defined(SO_RCVBUF) */
>   
>     /* Set up signal handlers. */
> !   (void)signal(SIGHUP, CATCHinterrupt);
> !   (void)signal(SIGINT, CATCHinterrupt);
> !   (void)signal(SIGTERM, CATCHinterrupt);
> !   (void)signal(SIGPIPE, SIG_IGN);
>     if (TotalTimeout) {
>       (void)alarm(TotalTimeout);
> -     (void)signal(SIGALRM, CATCHalarm);
>     }
> - 
> -   GotInterrupt = FALSE;
> -   GotAlarm = FALSE;
>   
>     /* Start timing. */
>     if (GetTimeInfo(&Now) < 0) {
> --- 458,475 ----
>       (void)perror("cant setsockopt(RCVBUF)");
>   #endif	/* defined(SOL_SOCKET) && defined(SO_SNDBUF) && defined(SO_RCVBUF) */
>   
> +   GotInterrupt = FALSE;
> +   GotAlarm = FALSE;
> + 
>     /* Set up signal handlers. */
> !   (void)xsignal(SIGHUP, CATCHinterrupt);
> !   (void)xsignal(SIGINT, CATCHinterrupt);
> !   (void)xsignal(SIGTERM, CATCHinterrupt);
> !   (void)xsignal(SIGPIPE, SIG_IGN);
>     if (TotalTimeout) {
> +     (void)xsignal(SIGALRM, CATCHalarm);
>       (void)alarm(TotalTimeout);
>     }
>   
>     /* Start timing. */
>     if (GetTimeInfo(&Now) < 0) {
> diff -rc ../inn-1999-09-13_03-00/backends/innxmit.c ./backends/innxmit.c
> *** ../inn-1999-09-13_03-00/backends/innxmit.c	Thu Jun 10 22:40:04 1999
> --- ./backends/innxmit.c	Mon Sep 13 13:15:46 1999
> ***************
> *** 935,941 ****
>   {
>       GotInterrupt = TRUE;
>       /* Let two interrupts kill us. */
> !     (void)signal(s, SIG_DFL);
>   }
>   
>   
> --- 935,941 ----
>   {
>       GotInterrupt = TRUE;
>       /* Let two interrupts kill us. */
> !     (void)xsignal(s, SIG_DFL);
>   }
>   
>   
> ***************
> *** 1295,1302 ****
>   	/* Open a connection to the remote server. */
>   	if (ConnectTimeout) {
>   	    GotAlarm = FALSE;
> ! 	    old = signal(SIGALRM, CATCHalarm);
> ! 	    (void)alarm(ConnectTimeout);
>   	    JMPyes = TRUE;
>   	    if (setjmp(JMPwhere)) {
>   		(void)fprintf(stderr, "Can't connect to %s, timed out\n",
> --- 1295,1301 ----
>   	/* Open a connection to the remote server. */
>   	if (ConnectTimeout) {
>   	    GotAlarm = FALSE;
> ! 	    old = xsignal(SIGALRM, CATCHalarm);
>   	    JMPyes = TRUE;
>   	    if (setjmp(JMPwhere)) {
>   		(void)fprintf(stderr, "Can't connect to %s, timed out\n",
> ***************
> *** 1304,1309 ****
> --- 1303,1309 ----
>   		SMshutdown();
>   		exit(1);
>   	    }
> + 	    (void)alarm(ConnectTimeout);
>   	}
>   	if (NNTPconnect(REMhost, port, &From, &To, buff) < 0 || GotAlarm) {
>   	    i = errno;
> ***************
> *** 1331,1337 ****
>   	}
>   	if (ConnectTimeout) {
>   	    (void)alarm(0);
> ! 	    (void)signal(SIGALRM, old);
>   	    JMPyes = FALSE;
>   	}
>   
> --- 1331,1337 ----
>   	}
>   	if (ConnectTimeout) {
>   	    (void)alarm(0);
> ! 	    (void)xsignal(SIGALRM, old);
>   	    JMPyes = FALSE;
>   	}
>   
> ***************
> *** 1384,1396 ****
>       }
>   
>       /* Set up signal handlers. */
> !     (void)signal(SIGHUP, CATCHinterrupt);
> !     (void)signal(SIGINT, CATCHinterrupt);
> !     (void)signal(SIGTERM, CATCHinterrupt);
> !     (void)signal(SIGPIPE, SIG_IGN);
>       if (TotalTimeout) {
>   	(void)alarm(TotalTimeout);
> - 	(void)signal(SIGALRM, CATCHalarm);
>       }
>   
>       /* Main processing loop. */
> --- 1384,1396 ----
>       }
>   
>       /* Set up signal handlers. */
> !     (void)xsignal(SIGHUP, CATCHinterrupt);
> !     (void)xsignal(SIGINT, CATCHinterrupt);
> !     (void)xsignal(SIGTERM, CATCHinterrupt);
> !     (void)xsignal(SIGPIPE, SIG_IGN);
>       if (TotalTimeout) {
> + 	(void)xsignal(SIGALRM, CATCHalarm);
>   	(void)alarm(TotalTimeout);
>       }
>   
>       /* Main processing loop. */
> diff -rc ../inn-1999-09-13_03-00/include/clibrary.h.in ./include/clibrary.h.in
> *** ../inn-1999-09-13_03-00/include/clibrary.h.in	Tue Sep  7 23:09:47 1999
> --- ./include/clibrary.h.in	Mon Sep 13 13:15:46 1999
> ***************
> *** 232,237 ****
> --- 232,241 ----
>   #undef HAVE_UNION_WAIT
>   #endif
>   
> + #if defined(HPUX) && ! defined(USE_SIGACTION)
> + #define USE_SIGACTION
> + #endif
> + 
>   #if ! defined(INADDR_NONE) && ! defined(_AIX41)
>   #define		INADDR_NONE 	(unsigned long)0xffffffff
>   #endif
> diff -rc ../inn-1999-09-13_03-00/include/config.h.in ./include/config.h.in
> *** ../inn-1999-09-13_03-00/include/config.h.in	Wed Aug 25 19:49:39 1999
> --- ./include/config.h.in	Mon Sep 13 23:24:05 1999
> ***************
> *** 193,198 ****
> --- 193,204 ----
>   # define LOG_FACILITY	LOG_LOCAL1
>   #endif
>   
> + /* HP/UX headers define LOG_NEWS, but syslogd doesn't recognize it.  Bleagh!  */
> + #ifdef HPUX
> + # undef LOG_FACILITY
> + # define LOG_FACILITY	LOG_LOCAL1
> + #endif
> + 
>   #define LOG_INN_SERVER		LOG_FACILITY
>   
>   /* Facility all other programs should log under. */
> diff -rc ../inn-1999-09-13_03-00/include/libinn.h ./include/libinn.h
> *** ../inn-1999-09-13_03-00/include/libinn.h	Mon Sep 13 00:49:57 1999
> --- ./include/libinn.h	Tue Sep 14 00:05:10 1999
> ***************
> *** 258,263 ****
> --- 258,264 ----
>   extern BOOL	fdreserve(int fdnum);
>   extern FILE	*Fopen(const char *p, char *type, int index);
>   extern int	Fclose(FILE *fp);
> + extern void	(*xsignal(int signum, void (*sigfunc)(int )))(int );
>   
>   const char  *Aliasgetnamebyhash(const HASH hash);
>   HASH Aliasgethashbyhash(const HASH hash);
> diff -rc ../inn-1999-09-13_03-00/innd/cc.c ./innd/cc.c
> *** ../inn-1999-09-13_03-00/innd/cc.c	Mon Sep 13 00:52:01 1999
> --- ./innd/cc.c	Mon Sep 13 13:15:46 1999
> ***************
> *** 2010,2016 ****
>        *  needed (i.e. something has deleted our named socket.
>        */
>   #if     defined(SIGUSR1)
> !     (void)signal(SIGUSR1, CCresetup);
>   #endif  /* defined(SIGUSR1) */
>   }
>   
> --- 2010,2016 ----
>        *  needed (i.e. something has deleted our named socket.
>        */
>   #if     defined(SIGUSR1)
> !     (void)xsignal(SIGUSR1, CCresetup);
>   #endif  /* defined(SIGUSR1) */
>   }
>   
> ***************
> *** 2043,2049 ****
>   CCresetup(s)
>       int         s;
>   {
> !     (void)signal(s, CCresetup);
>       CCclose();
>       CCsetup();
>   }
> --- 2043,2051 ----
>   CCresetup(s)
>       int         s;
>   {
> ! #ifndef USE_SIGACTION
> !     (void)xsignal(s, CCresetup);
> ! #endif
>       CCclose();
>       CCsetup();
>   }
> diff -rc ../inn-1999-09-13_03-00/innd/innd.c ./innd/innd.c
> *** ../inn-1999-09-13_03-00/innd/innd.c	Fri Aug 27 00:36:04 1999
> --- ./innd/innd.c	Mon Sep 13 13:15:46 1999
> ***************
> *** 514,520 ****
>   {
>       GotTerminate = TRUE;
>       KillerSignal = s;
> !     (void)signal(s, CatchTerminate);
>   }
>   
>   
> --- 514,522 ----
>   {
>       GotTerminate = TRUE;
>       KillerSignal = s;
> ! #ifndef USE_SIGACTION
> !     (void)xsignal(s, CatchTerminate);
> ! #endif
>   }
>   
>   
> ***************
> *** 764,770 ****
>       if (Debug) {
>   	Log = stdout;
>   	Errlog = stderr;
> ! 	(void)signal(SIGINT, CatchTerminate);
>       }
>       else {
>   	if (ShouldFork) {
> --- 766,772 ----
>       if (Debug) {
>   	Log = stdout;
>   	Errlog = stderr;
> ! 	(void)xsignal(SIGINT, CatchTerminate);
>       }
>       else {
>   	if (ShouldFork) {
> ***************
> *** 851,859 ****
>       /* Set up the various parts of the system.  Channel feeds start
>        * processes so call PROCsetup before ICDsetup.  NNTP needs to know
>        * if it's a slave, so call RCsetup before NCsetup. */
> !     (void)signal(SIGTERM, CatchTerminate);
>   #if	defined(SIGDANGER)
> !     (void)signal(SIGDANGER, CatchTerminate);
>   #endif	/* defined(SIGDANGER) */
>       CHANsetup(i);
>       PROCsetup(10);
> --- 853,861 ----
>       /* Set up the various parts of the system.  Channel feeds start
>        * processes so call PROCsetup before ICDsetup.  NNTP needs to know
>        * if it's a slave, so call RCsetup before NCsetup. */
> !     (void)xsignal(SIGTERM, CatchTerminate);
>   #if	defined(SIGDANGER)
> !     (void)xsignal(SIGDANGER, CatchTerminate);
>   #endif	/* defined(SIGDANGER) */
>       CHANsetup(i);
>       PROCsetup(10);
> diff -rc ../inn-1999-09-13_03-00/innd/proc.c ./innd/proc.c
> *** ../inn-1999-09-13_03-00/innd/proc.c	Tue Apr 14 15:28:16 1998
> --- ./innd/proc.c	Mon Sep 13 13:15:46 1999
> ***************
> *** 55,61 ****
>       int			s;
>   {
>       PROCreap();
> !     (void)signal(s, PROCcatchsignal);
>   }
>   
>   
> --- 55,63 ----
>       int			s;
>   {
>       PROCreap();
> ! #ifndef USE_SIGACTION
> !     (void)xsignal(s, PROCcatchsignal);
> ! #endif
>   }
>   
>   
> ***************
> *** 175,181 ****
>   	*pp = PROCnull;
>   
>   #if	defined(SIGCHLD)
> !     (void)signal(SIGCHLD, PROCcatchsignal);
>   #endif	/* defined(SIGCHLD) */
> !     (void)signal(SIGPIPE, PROCcatchsignal);
>   }
> --- 177,183 ----
>   	*pp = PROCnull;
>   
>   #if	defined(SIGCHLD)
> !     (void)xsignal(SIGCHLD, PROCcatchsignal);
>   #endif	/* defined(SIGCHLD) */
> !     (void)xsignal(SIGPIPE, PROCcatchsignal);
>   }
> diff -rc ../inn-1999-09-13_03-00/lib/Makefile ./lib/Makefile
> *** ../inn-1999-09-13_03-00/lib/Makefile	Thu Sep  9 02:59:34 1999
> --- ./lib/Makefile	Mon Sep 13 13:15:46 1999
> ***************
> *** 19,25 ****
>   	makedir.c md5.c nonblocking.c parsedate.c perl.c pread.c pwrite.c \
>   	radix32.c readin.c remopen.c reservedfd.c resource.c rwlock.c \
>   	sendarticle.c sendpass.c tempname.c waitnb.c wildmat.c xfopena.c \
> ! 	xmalloc.c xmemerr.c xrealloc.c xwrite.c xwritev.c
>   OBJECTS = $(MISSING_OBJ) \
>   	argparse.o checkart.o cleanfrom.o clientactive.o clientlib.o \
>   	closeonexec.o concat.o conffile.o dbz.o defdist.o findheader.o \
> --- 19,25 ----
>   	makedir.c md5.c nonblocking.c parsedate.c perl.c pread.c pwrite.c \
>   	radix32.c readin.c remopen.c reservedfd.c resource.c rwlock.c \
>   	sendarticle.c sendpass.c tempname.c waitnb.c wildmat.c xfopena.c \
> ! 	xmalloc.c xmemerr.c xrealloc.c xsignal.c xwrite.c xwritev.c
>   OBJECTS = $(MISSING_OBJ) \
>   	argparse.o checkart.o cleanfrom.o clientactive.o clientlib.o \
>   	closeonexec.o concat.o conffile.o dbz.o defdist.o findheader.o \
> ***************
> *** 28,34 ****
>   	makedir.o md5.o nonblocking.o parsedate.o pread.o pwrite.o radix32.o \
>   	readin.o remopen.o reservedfd.o resource.o rwlock.o sendarticle.o \
>   	sendpass.o tempname.o waitnb.o wildmat.o xfopena.o xmalloc.o \
> ! 	xmemerr.o xrealloc.o xwrite.o xwritev.o
>   LOBJECTS	= $(OBJECTS:.o=.lo)
>   
>   all:			libinn.$(EXTLIB) perl.o ../include/autoconfig.h
> --- 28,34 ----
>   	makedir.o md5.o nonblocking.o parsedate.o pread.o pwrite.o radix32.o \
>   	readin.o remopen.o reservedfd.o resource.o rwlock.o sendarticle.o \
>   	sendpass.o tempname.o waitnb.o wildmat.o xfopena.o xmalloc.o \
> ! 	xmemerr.o xrealloc.o xsignal.o xwrite.o xwritev.o
>   LOBJECTS	= $(OBJECTS:.o=.lo)
>   
>   all:			libinn.$(EXTLIB) perl.o ../include/autoconfig.h
> diff -rc ../inn-1999-09-13_03-00/nnrpd/nnrpd.c ./nnrpd/nnrpd.c
> *** ../inn-1999-09-13_03-00/nnrpd/nnrpd.c	Fri Jul 30 20:52:35 1999
> --- ./nnrpd/nnrpd.c	Mon Sep 13 13:15:46 1999
> ***************
> *** 517,523 ****
>       int		s;
>   {
>       ChangeTrace = TRUE;
> !     (void)signal(s, ToggleTrace);
>   }
>   
>   /*
> --- 517,525 ----
>       int		s;
>   {
>       ChangeTrace = TRUE;
> ! #ifndef USE_SIGACTION
> !     (void)xsignal(s, ToggleTrace);
> ! #endif
>   }
>   
>   /*
> ***************
> *** 545,551 ****
>          if (pid <= 0)
>          	    break;
>       }
> !     (void)signal(s, WaitChild);
>   }
>   
>   STATIC void SetupDaemon(void) {
> --- 547,555 ----
>          if (pid <= 0)
>          	    break;
>       }
> ! #ifndef USE_SIGACTION
> !     (void)xsignal(s, WaitChild);
> ! #endif
>   }
>   
>   STATIC void SetupDaemon(void) {
> ***************
> *** 800,806 ****
>   	fclose(pidfile);
>   
>   	/* Set signal handle to care for dead children */
> ! 	(void)signal(SIGCHLD, WaitChild);
>   	SetupDaemon();
>    
>   	TITLEset("nnrpd: accepting connections");
> --- 804,810 ----
>   	fclose(pidfile);
>   
>   	/* Set signal handle to care for dead children */
> ! 	(void)xsignal(SIGCHLD, WaitChild);
>   	SetupDaemon();
>    
>   	TITLEset("nnrpd: accepting connections");
> ***************
> *** 841,847 ****
>   	}
>   
>   	/* Only automatically reap children in the listening process */
> ! 	(void)signal(SIGCHLD, SIG_DFL);
>    
>       } else {
>   	SetupDaemon();
> --- 845,851 ----
>   	}
>   
>   	/* Only automatically reap children in the listening process */
> ! 	(void)xsignal(SIGCHLD, SIG_DFL);
>    
>       } else {
>   	SetupDaemon();
> ***************
> *** 868,877 ****
>       strcpy (LogName, "?");
>   
>       /* Catch SIGPIPE so that we can exit out of long write loops */
> !     (void)signal(SIGPIPE, CatchPipe);
>   
>       /* Arrange to toggle tracing. */
> !     (void)signal(SIGHUP, ToggleTrace);
>   
>       /* Get permissions and see if we can talk to this client */
>       StartConnection();
> --- 872,881 ----
>       strcpy (LogName, "?");
>   
>       /* Catch SIGPIPE so that we can exit out of long write loops */
> !     (void)xsignal(SIGPIPE, CatchPipe);
>   
>       /* Arrange to toggle tracing. */
> !     (void)xsignal(SIGHUP, ToggleTrace);
>   
>       /* Get permissions and see if we can talk to this client */
>       StartConnection();
> diff -rc ../inn-1999-09-13_03-00/storage/buffindexed/buffindexed.c ./storage/buffindexed/buffindexed.c
> *** ../inn-1999-09-13_03-00/storage/buffindexed/buffindexed.c	Fri Sep 10 02:57:47 1999
> --- ./storage/buffindexed/buffindexed.c	Mon Sep 13 20:14:57 1999
> ***************
> *** 257,262 ****
> --- 257,280 ----
>   STATIC void *ovopensearch(char *group, int low, int high, BOOL needov);
>   STATIC void ovclosesearch(void *handle, BOOL freeblock);
>   
> + STATIC OFFSET_T mmappwrite(int fd, void *buf, OFFSET_T nbyte, OFFSET_T offset) {
> +   int		pagefudge, len;
> +   OFFSET_T	mmapoffset;
> +   caddr_t	addr;
> + 
> +   pagefudge = offset % pagesize;
> +   mmapoffset = offset - pagefudge;
> +   len = pagefudge + nbyte;
> + 
> +   if ((addr = mmap((caddr_t) 0, len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, mmapoffset)) == (caddr_t) -1) {
> +     return -1;
> +   }
> +   memcpy(addr+pagefudge, buf, nbyte);
> +   munmap(addr, len);
> +   return nbyte;
> + }
> + 
> + 
>   STATIC BOOL ovparse_part_line(char *l) {
>     char		*p;
>     struct stat	sb;
> ***************
> *** 697,703 ****
>   /* just search ov, do not set curindex */
>   STATIC OV getsrchov(OV ov, ARTNUM artnum, OVINDEXHEAD *ovihp, SRCH type) {
>     OVBUFF	*ovbuff;
> !   OVINDEXHEAD	ovindexhead;
>   
>     if (type != SRCH_FRWD && type != SRCH_BKWD)
>       return ovnull;
> --- 715,724 ----
>   /* just search ov, do not set curindex */
>   STATIC OV getsrchov(OV ov, ARTNUM artnum, OVINDEXHEAD *ovihp, SRCH type) {
>     OVBUFF	*ovbuff;
> !   OVINDEXHEAD	*ovindexhead;
> !   caddr_t	addr;
> !   int		pagefudge, len;
> !   OFFSET_T	offset, mmapoffset;
>   
>     if (type != SRCH_FRWD && type != SRCH_BKWD)
>       return ovnull;
> ***************
> *** 705,723 ****
>       ovbuff = getovbuff(ov);
>       if (ovbuff == NULL)
>         return ovnull;
> !     if (pread(ovbuff->fd, (POINTER)&ovindexhead, sizeof(ovindexhead), ovbuff->base + (ov.blocknum * OV_BLOCKSIZE)) != sizeof(ovindexhead)) {
> !       syslog(L_ERROR, "%s: could not read index record index '%d', blocknum '%d': %m", LocalLogName, ov.index, ov.blocknum);
> !       return ovnull;
>       }
> !     if (ovindexhead.base <= artnum && ovindexhead.base + OVINDEXMAX - ovindexhead.baseoffset > artnum) {
>         if (ovihp)
> ! 	*ovihp = ovindexhead;
>         return ov;
>       }
>       if (type == SRCH_FRWD)
> !       ov = ovindexhead.next;
>       else
> !       ov = ovindexhead.prev;
>     }
>     return ovnull;
>   }
> --- 726,754 ----
>       ovbuff = getovbuff(ov);
>       if (ovbuff == NULL)
>         return ovnull;
> ! 
> !     offset = ovbuff->base + (ov.blocknum * OV_BLOCKSIZE);
> !     pagefudge = offset % pagesize;
> !     mmapoffset = offset - pagefudge;
> !     len = pagefudge + OV_BLOCKSIZE;
> ! 
> !     if ((addr = mmap((caddr_t) 0, len, PROT_READ, MAP_SHARED, ovbuff->fd, mmapoffset)) == (caddr_t) -1) {
> ! 	syslog(L_ERROR, "%s: could not mmap index record index '%d', blocknum '%d': %m", LocalLogName, ov.index, ov.blocknum);
> ! 	return ovnull;
>       }
> !     ovindexhead = (OVINDEXHEAD *)(addr + pagefudge);
> ! 
> !     if (ovindexhead->base <= artnum && ovindexhead->base + OVINDEXMAX - ovindexhead->baseoffset > artnum) {
>         if (ovihp)
> ! 	*ovihp = *ovindexhead;
> !       munmap(addr, len);
>         return ov;
>       }
>       if (type == SRCH_FRWD)
> !       ov = ovindexhead->next;
>       else
> !       ov = ovindexhead->prev;
> !     munmap(addr, len);
>     }
>     return ovnull;
>   }
> ***************
> *** 1231,1237 ****
>       ovblock.ovindexhead.prev = ovnull;
>       ovblock.ovindexhead.next = ovnull;
>       ovblock.ovindexhead.base = base;
> !     if (pwrite(ovbuff->fd, (POINTER)&ovblock, sizeof(ovblock), ovbuff->base + (ov.blocknum * OV_BLOCKSIZE)) != sizeof(ovblock)) {
>         syslog(L_ERROR, "%s: ovsetcurindexblock could not initialize ovbuff block index '%d', blocknum '%d': %m", LocalLogName, ov.index, ov.blocknum);
>         return FALSE;
>       }
> --- 1262,1268 ----
>       ovblock.ovindexhead.prev = ovnull;
>       ovblock.ovindexhead.next = ovnull;
>       ovblock.ovindexhead.base = base;
> !     if (mmappwrite(ovbuff->fd, (POINTER)&ovblock, sizeof(ovblock), ovbuff->base + (ov.blocknum * OV_BLOCKSIZE)) != sizeof(ovblock)) {
>         syslog(L_ERROR, "%s: ovsetcurindexblock could not initialize ovbuff block index '%d', blocknum '%d': %m", LocalLogName, ov.index, ov.blocknum);
>         return FALSE;
>       }
> ***************
> *** 1343,1349 ****
>       abort();
>     }
>   #endif /* OV_DEBUG */
> !   if (pwrite(ovbuff->fd, data, len, ovbuff->base + ge->curdata.blocknum * OV_BLOCKSIZE + ge->curoffset) != len) {
>       syslog(L_ERROR, "%s: could not append overview record index '%d', blocknum '%d': %m", LocalLogName, ge->curdata.index, ge->curdata.blocknum);
>       return FALSE;
>     }
> --- 1374,1380 ----
>       abort();
>     }
>   #endif /* OV_DEBUG */
> !   if (mmappwrite(ovbuff->fd, data, len, ovbuff->base + ge->curdata.blocknum * OV_BLOCKSIZE + ge->curoffset) != len) {
>       syslog(L_ERROR, "%s: could not append overview record index '%d', blocknum '%d': %m", LocalLogName, ge->curdata.index, ge->curdata.blocknum);
>       return FALSE;
>     }
> ***************
> *** 1374,1380 ****
>       abort();
>     }
>   #endif /* OV_DEBUG */
> !   if (pwrite(ovbuff->fd, &ie, sizeof(ie), ovbuff->base + ge->curindex.blocknum * OV_BLOCKSIZE + sizeof(OVINDEXHEAD) + sizeof(ie) * (artnum - ge->baseinblock + baseoffset)) != sizeof(ie)) {
>       syslog(L_ERROR, "%s: could not write index record index '%d', blocknum '%d': %m", LocalLogName, ge->curindex.index, ge->curindex.blocknum);
>       return TRUE;
>     }
> --- 1405,1411 ----
>       abort();
>     }
>   #endif /* OV_DEBUG */
> !   if (mmappwrite(ovbuff->fd, &ie, sizeof(ie), ovbuff->base + ge->curindex.blocknum * OV_BLOCKSIZE + sizeof(OVINDEXHEAD) + sizeof(ie) * (artnum - ge->baseinblock + baseoffset)) != sizeof(ie)) {
>       syslog(L_ERROR, "%s: could not write index record index '%d', blocknum '%d': %m", LocalLogName, ge->curindex.index, ge->curindex.blocknum);
>       return TRUE;
>     }
> *** /dev/null	Tue Sep 14 16:01:01 1999
> --- ./lib/xsignal.c	Tue Sep 14 00:04:44 1999
> ***************
> *** 0 ****
> --- 1,36 ----
> + /*
> + **  Provides a 'reliable' implementation of signal() for SYSV-derived systems
> + */
> + #include <signal.h>
> + #include "configdata.h"
> + #include "clibrary.h"
> + 
> + #ifdef USE_SIGACTION
> + 
> + void (*xsignal(int signum, void (*sigfunc)(int )))(int )
> + {
> + 	struct sigaction act, oact;
> + 
> + 	act.sa_handler = sigfunc;
> + 	sigemptyset(&act.sa_mask);
> + 
> + #ifdef SA_RESTART
> + 	act.sa_flags = SA_RESTART;
> + #else
> + 	act.sa_flags = 0;
> + #endif
> + 
> + 	if (sigaction(signum, &act, &oact) < 0) {
> + 		return SIG_ERR;
> + 	}
> + 	return oact.sa_handler;
> + }
> + 
> + #else
> + 
> + void (*xsignal(int signum, void (*sigfunc)(int )))(int )
> + {
> + 	return signal(signum, sigfunc);
> + }
> + 
> + #endif
> 

Marc G. Fournier                   ICQ#7615664               IRC Nick: Scrappy
Systems Administrator @ hub.org 
primary: scrappy at hub.org           secondary: scrappy@{freebsd|postgresql}.org 



More information about the inn-workers mailing list