Use realpath to find the mailspool
[mmh] / uip / spost.c
index 7a59d59..476227b 100644 (file)
@@ -16,6 +16,9 @@
 #include <h/dropsbr.h>
 #include <h/tws.h>
 #include <h/utils.h>
+#include <unistd.h>
+#include <locale.h>
+#include <sysexits.h>
 
 #define MAX_SM_FIELD 1476  /* < largest hdr field sendmail will accept */
 
@@ -149,19 +152,19 @@ main(int argc, char **argv)
                        switch (smatch(++cp, switches)) {
                        case AMBIGSW:
                                ambigsw(cp, switches);
-                               done(1);
+                               exit(EX_USAGE);
                        case UNKWNSW:
-                               adios(NULL, "-%s unknown", cp);
+                               adios(EX_USAGE, NULL, "-%s unknown", cp);
 
                        case HELPSW:
                                snprintf(buf, sizeof(buf),
                                                "%s [switches] file",
                                                invo_name);
                                print_help(buf, switches, 1);
-                               done(1);
+                               exit(argc == 2 ? EX_OK : EX_USAGE);
                        case VERSIONSW:
                                print_version(invo_name);
-                               done(1);
+                               exit(argc == 2 ? EX_OK : EX_USAGE);
 
                        case DEBUGSW:
                                debug++;
@@ -180,16 +183,16 @@ main(int argc, char **argv)
                        }
                }
                if (msg)
-                       adios(NULL, "only one message at a time!");
+                       adios(EX_USAGE, NULL, "only one message at a time!");
                else
                        msg = cp;
        }
 
        if (!msg)
-               adios(NULL, "usage: %s [switches] file", invo_name);
+               adios(EX_USAGE, NULL, "usage: %s [switches] file", invo_name);
 
        if ((in = fopen(msg, "r")) == NULL)
-               adios(msg, "unable to open");
+               adios(EX_IOERR, msg, "unable to open");
 
        if (debug) {
                verbose++;
@@ -206,7 +209,7 @@ main(int argc, char **argv)
                for (ap=brkstring(dp=getcpy(cp), " ", "\n"); ap && *ap;
                                ap++) {
                        if ((state = alias(etcpath(*ap))) != AK_OK) {
-                               adios(NULL, "aliasing error in file %s: %s",
+                               adios(EX_IOERR, NULL, "aliasing error in file %s: %s",
                                                *ap, akerror(state));
                        }
                }
@@ -250,11 +253,11 @@ main(int argc, char **argv)
 
                case LENERR:
                case FMTERR:
-                       adios(NULL, "message format error in component #%d",
+                       adios(EX_DATAERR, NULL, "message format error in component #%d",
                                        compnum);
 
                default:
-                       adios(NULL, "getfld() returned %d", state);
+                       adios(EX_SOFTWARE, NULL, "getfld() returned %d", state);
                }
                break;
        }
@@ -262,7 +265,7 @@ main(int argc, char **argv)
 
        if (debug) {
                /* stop here */
-               done(0);
+               exit(EX_OK);
        }
 
        fclose(out);
@@ -277,7 +280,7 @@ main(int argc, char **argv)
                if (!(msgflags & MVIS)) {
                        /* only Bcc rcpts: we're finished here */
                        unlink(tmpfil);
-                       exit(0);
+                       exit(EX_OK);
                }
        }
 
@@ -286,7 +289,7 @@ main(int argc, char **argv)
        ** the msg temp file as std in.
        */
        if (!freopen(tmpfil, "r", stdin)) {
-               adios(tmpfil, "can't reopen for sendmail");
+               adios(EX_IOERR, tmpfil, "can't reopen for sendmail");
        }
        unlink(tmpfil);
 
@@ -300,7 +303,7 @@ main(int argc, char **argv)
        }
        *argp = NULL;
        execv(sendmail, sargv);
-       adios(sendmail, "can't exec");
+       adios(EX_OSERR, sendmail, "can't exec");
        return -1;
 }
 
@@ -450,7 +453,7 @@ finish_headers(FILE *out)
        }
        if (badmsg) {
                unlink(tmpfil);
-               adios(NULL, "re-format message and try again");
+               adios(EX_DATAERR, NULL, "re-format message and try again");
        }
 }
 
@@ -563,7 +566,7 @@ process_fcc(char *str)
        int state = 0;
 
        if (strlen(str)+strlen(fccs) > sizeof fccs /2) {
-               adios(NULL, "Too much Fcc data");
+               adios(EX_DATAERR, NULL, "Too much Fcc data");
        }
        /* todo: better have three states: SEPARATOR, PLUS, WORD */
        for (cp=pp=str; *cp; cp++) {
@@ -606,7 +609,7 @@ fcc(char *file, char *folders)
                fflush(stdout);
        }
        if (100+strlen(file)+strlen(folders) > sizeof cmd) {
-               adios(NULL, "Too much Fcc data");
+               adios(EX_DATAERR, NULL, "Too much Fcc data");
        }
        /* hack: read from /dev/null and refile(1) won't question us */
        snprintf(cmd, sizeof cmd, "</dev/null refile -link -file '%s' %s",
@@ -628,7 +631,6 @@ static void
 process_bccs(char *origmsg)
 {
        char *bccdraft = NULL;
-       char buf[BUFSIZ];
        struct mailname *mp = NULL;
        FILE *out = NULL;
 
@@ -640,8 +642,7 @@ process_bccs(char *origmsg)
                fprintf(out, "------------\n");
                fclose(out);
 
-               snprintf(buf, sizeof buf, "send %s", bccdraft);
-               if (system(buf) != 0) {
+               if (execprogl("send", "send", bccdraft, (char *)NULL) != 0) {
                        admonish(invo_name, "Problems to send Bcc to %s",
                                        mp->m_text);
                        unlink(bccdraft);