]>
diplodocus.org Git - nmh/blob - sbr/ext_hook.c
106114f829b02ada5e341fb5a13aee91d2ea2a4b
1 /* Run a program that hooks into some other system. The first argument is
2 * name of the hook to use, the second is the full path name of a mail message.
3 * The third argument is also the full path name of a mail message, or a NULL
4 * pointer if it isn't needed. Look in the context for an error message if
5 * something goes wrong; there is a built-in message in case one isn't specified.
6 * Only produce the error message once.
10 #include "context_find.h"
11 #include "pidstatus.h"
16 ext_hook(char *hook_name
, char *message_file_name_1
, char *message_file_name_2
)
18 char *hook
; /* hook program from context */
19 pid_t pid
; /* ID of child process */
20 int status
; /* exit or other child process status */
21 char **vec
; /* argument vector for child process */
22 int vecp
; /* Vector index */
23 char *program
; /* Name of program to execute */
25 static bool did_message
; /* set if we've already output a message */
27 if ((hook
= context_find(hook_name
)) == NULL
)
30 switch (pid
= fork()) {
33 inform("external database may be out-of-date.");
37 vec
= argsplit(hook
, &program
, &vecp
);
38 vec
[vecp
++] = message_file_name_1
;
39 vec
[vecp
++] = message_file_name_2
;
42 advise(program
, "Unable to execute");
47 status
= pidwait(pid
, -1);
56 if ((msghook
= context_find("msg-hook")) != NULL
)
57 inform("%s", msghook
);
60 snprintf(errbuf
, sizeof(errbuf
), "external hook \"%s\"", hook
);
61 pidstatus(status
, stderr
, errbuf
);