/* ** Copyright 2002-2006 Double Precision, Inc. See COPYING for ** distribution information. */ #include "config.h" #include "liblock.h" #include "mail.h" #include #include #include #include #include #include #include #include #if HAVE_SYS_WAIT_H #include #endif #ifdef HAVE_FCNTL_H #include #endif #ifndef WEXITSTATUS #define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) #endif #ifndef WIFEXITED #define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif #if HAVE_SYSEXITS_H #include #endif #ifndef EX_TEMPFAIL #define EX_TEMPFAIL 75 #endif #define NTRIES_DEFAULT 60 #define DELAY 5 static int sig=0; static int catch(int signum) { sig=1; signal(SIGHUP, (RETSIGTYPE (*)(int))catch); signal(SIGTERM, (RETSIGTYPE (*)(int))catch); signal(SIGINT, (RETSIGTYPE (*)(int))catch); return 0; } static int caught() { signal(SIGHUP, SIG_DFL); signal(SIGTERM, SIG_DFL); signal(SIGINT, SIG_DFL); return sig; } int main(int argc, char **argv) { char **argvec; int n; int fd; pid_t pid, pid2; int waitstat; struct ll_mail *p; int ntries=NTRIES_DEFAULT; int readonly=0; int optchar; while ((optchar=getopt(argc, argv, "+rt:")) != -1) switch (optchar) { case 'r': readonly=1; break; case 't': ntries=atoi(optarg); if (ntries < 0) { fprintf(stderr, "%s: invalid argument to -t\n", argv[0]); exit(EX_TEMPFAIL); } ntries= (ntries / DELAY) + 1; break; default: exit(1); } if (argc - optind < 2) { fprintf(stderr, "Usage: %s [-r] [-t time] mailfile program [args]...\n", argv[0]); exit(1); } if ((argvec=malloc(sizeof(char *) * (argc - optind + 1))) == NULL) { perror("malloc"); exit (1); } for (n=optind+1; n= 0) close(n); signal(SIGUSR2, SIG_IGN); signal(SIGCHLD, SIG_DFL); p=NULL; for (n=0; n