> > A second and more defensive measure is to issue a non-blocking read on
> > the pipe to drain all qmail-queue bytes *prior* to the todo
This is the solution I eventually used. Works like a charm. I've
appended the patch so that it gets into the archives. Variations from
the original post include opening the trigger file just the once as
well as setting it non-blocking at the time it's opened. I've called
it the trigger-happy patch :>
Regards.
*** Makefile.orig Mon Jun 15 03:53:16 1998
--- Makefile Fri Jul 27 11:23:47 2001
***************
*** 2114,2120 ****
./compile token822.c
trigger.o: \
! compile trigger.c select.h open.h trigger.h hasnpbg1.h
./compile trigger.c
triggerpull.o: \
--- 2114,2120 ----
./compile token822.c
trigger.o: \
! compile trigger.c select.h open.h trigger.h hasnpbg1.h ndelay.h
./compile trigger.c
triggerpull.o: \
*** trigger.orig.c Mon Jun 15 03:53:16 1998
--- trigger.c Thu Jul 26 18:02:07 2001
***************
*** 1,4 ****
--- 1,5 ----
#include "select.h"
+ #include "ndelay.h"
#include "open.h"
#include "trigger.h"
#include "hasnpbg1.h"
***************
*** 10,24 ****
void trigger_set()
{
! if (fd != -1)
! close(fd);
! #ifdef HASNAMEDPIPEBUG1
! if (fdw != -1)
! close(fdw);
! #endif
! fd = open_read("lock/trigger");
#ifdef HASNAMEDPIPEBUG1
! fdw = open_write("lock/trigger");
#endif
}
--- 11,25 ----
void trigger_set()
{
! if (fd == -1)
! {
! fd = open_read("lock/trigger");
! if (fd != -1)
! ndelay_on(fd);
! }
#ifdef HASNAMEDPIPEBUG1
! if (fdw == -1)
! fdw = open_write("lock/trigger");
#endif
}
***************
*** 36,41 ****
int trigger_pulled(rfds)
fd_set *rfds;
{
! if (fd != -1) if (FD_ISSET(fd,rfds)) return 1;
return 0;
}
--- 37,48 ----
int trigger_pulled(rfds)
fd_set *rfds;
{
! char buf[64];
!
! if ((fd != -1) && FD_ISSET(fd,rfds))
! {
! while (read(fd,buf,sizeof(buf)) == sizeof(buf)) ;
! return 1;
! }
return 0;
}