2 ** Copyright 2002-2006 Double Precision, Inc. See COPYING for
3 ** distribution information.
15 #include <sys/types.h>
24 #define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8)
27 #define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
35 #define EX_TEMPFAIL 75
38 static const char rcsid
[]="$Id: lockmail.c,v 1.6 2006/09/20 01:41:27 mrsam Exp $";
40 #define NTRIES_DEFAULT 60
45 static int catch(int signum
)
48 signal(SIGHUP
, (RETSIGTYPE (*)(int))catch);
49 signal(SIGTERM
, (RETSIGTYPE (*)(int))catch);
50 signal(SIGINT
, (RETSIGTYPE (*)(int))catch);
56 signal(SIGHUP
, SIG_DFL
);
57 signal(SIGTERM
, SIG_DFL
);
58 signal(SIGINT
, SIG_DFL
);
62 int main(int argc
, char **argv
)
70 int ntries
=NTRIES_DEFAULT
;
74 while ((optchar
=getopt(argc
, argv
, "+rt:")) != -1)
83 fprintf(stderr
, "%s: invalid argument to -t\n",
87 ntries
= (ntries
/ DELAY
) + 1;
93 if (argc
- optind
< 2)
95 fprintf(stderr
, "Usage: %s [-r] [-t time] mailfile program [args]...\n",
100 if ((argvec
=malloc(sizeof(char *) * (argc
- optind
+ 1))) == NULL
)
106 for (n
=optind
+1; n
<argc
; n
++)
107 argvec
[n
-optind
- 1]=argv
[n
];
109 argvec
[n
-optind
-1]=NULL
;
111 /* Create the mail file, if it doesn't exist */
113 if ((n
=open(argv
[optind
], O_RDWR
|O_CREAT
, 0600)) >= 0)
116 signal(SIGUSR2
, SIG_IGN
);
117 signal(SIGCHLD
, SIG_DFL
);
121 for (n
=0; n
<ntries
; sleep(DELAY
), n
++)
126 if ((p
=ll_mail_alloc(argv
[optind
])) == NULL
)
132 signal(SIGHUP
, (RETSIGTYPE (*)(int))catch);
133 signal(SIGTERM
, (RETSIGTYPE (*)(int))catch);
134 signal(SIGINT
, (RETSIGTYPE (*)(int))catch);
136 if (ll_mail_lock(p
) < 0)
139 break; /* Mail file gone? */
145 if ((fd
=ll_mail_open(p
)) < 0)
147 if (!readonly
|| (fd
=ll_mail_open_ro(p
)) < 0)
155 if ((pid
=fork()) < 0)
167 execvp(argvec
[0], argvec
);
173 while ((pid2
=wait(&waitstat
)) != pid
)
178 if (WIFEXITED(waitstat
))
179 exit(WEXITSTATUS(waitstat
));