X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/d38818cda73ca94e1e62bdf30a0a024781a54cb5..b52fcdb5415dd37207406bab2ee6cfff9d772449:/sbr/ext_hook.c?ds=inline diff --git a/sbr/ext_hook.c b/sbr/ext_hook.c index d2288487..7b94e57a 100644 --- a/sbr/ext_hook.c +++ b/sbr/ext_hook.c @@ -1,4 +1,4 @@ -/* $Id$ +/* * * Run a program that hooks into some other system. The first argument is * name of the hook to use, the second is the full path name of a mail message. @@ -16,25 +16,28 @@ ext_hook(char *hook_name, char *message_file_name_1, char *message_file_name_2) char *hook; /* hook program from context */ pid_t pid; /* ID of child process */ int status; /* exit or other child process status */ - char *vec[4]; /* argument vector for child process */ + char **vec; /* argument vector for child process */ + int vecp; /* Vector index */ + char *program; /* Name of program to execute */ static int did_message = 0; /* set if we've already output a message */ if ((hook = context_find(hook_name)) == (char *)0) return (OK); - switch (pid = vfork()) { + switch (pid = fork()) { case -1: status = NOTOK; advise(NULL, "external database may be out-of-date."); break; case 0: - vec[0] = r1bindex(hook, '/'); - vec[1] = message_file_name_1; - vec[2] = message_file_name_2; - vec[3] = (char *)0; - execvp(hook, vec); + vec = argsplit(hook, &program, &vecp); + vec[vecp++] = message_file_name_1; + vec[vecp++] = message_file_name_2; + vec[vecp++] = NULL; + execvp(program, vec); + advise(program, "Unable to execute"); _exit(-1); /* NOTREACHED */ @@ -45,11 +48,14 @@ ext_hook(char *hook_name, char *message_file_name_1, char *message_file_name_2) if (status != OK) { if (did_message == 0) { - if ((hook = context_find("msg-hook")) != (char *)0) - advise(NULL, hook); - else - advise(NULL, "external hook (%s) did not work properly.", hook); - + char *msghook; + if ((msghook = context_find("msg-hook")) != (char *)0) + advise(NULL, msghook); + else { + char errbuf[BUFSIZ]; + snprintf(errbuf, sizeof(errbuf), "external hook \"%s\"", hook); + pidstatus(status, stderr, errbuf); + } did_message = 1; }