mhmail: If spost fails, preseverve draft by hand, not with mv(1).
authormarkus schnalke <meillo@marmaro.de>
Fri, 23 Mar 2012 09:27:18 +0000 (10:27 +0100)
committermarkus schnalke <meillo@marmaro.de>
Fri, 23 Mar 2012 09:27:18 +0000 (10:27 +0100)
uip/mhmail.c

index 033c634..ef1a050 100644 (file)
@@ -10,6 +10,8 @@
 #include <h/signals.h>
 #include <h/utils.h>
 #include <signal.h>
+#include <fcntl.h>
+
 
 static struct swit switches[] = {
 #define BODYSW  0
@@ -175,24 +177,34 @@ main(int argc, char **argv)
        if ((child_id = fork()) == NOTOK) {
                /* report failure and then send it */
                adios(NULL, "unable to fork");
-       } else if (child_id) {
+
+       } else if (child_id == 0) {
+               /* child process */
+               execvp(*vec, vec);
+               fprintf(stderr, "unable to exec ");
+               perror(*vec);
+               _exit(-1);
+
+       } else {
                /* parent process */
                if ((status = pidXwait(child_id, *vec))) {
+                       /* spost failed, save draft as dead.letter */
+                       int in, out;
+
+                       in = open(tmpfil, O_RDONLY);
+                       out = creat("dead.letter", 0600);
+                       if (in == -1 || out == -1) {
+                               fprintf(stderr, "Letter left at %s.\n",
+                                               tmpfil);
+                               done(status ? 1 : 0);
+                       }
+                       cpydata(in, out, tmpfil, "dead.letter");
+                       close(in);
+                       close(out);
                        fprintf(stderr, "Letter saved in dead.letter\n");
-                       execl("/bin/mv", "mv", tmpfil, "dead.letter", NULL);
-                       execl("/usr/bin/mv", "mv", tmpfil, "dead.letter",
-                                       NULL);
-                       perror("mv");
-                       _exit(-1);
                }
                unlink(tmpfil);
                done(status ? 1 : 0);
-       } else {
-               /* child process */
-               execvp(*vec, vec);
-               fprintf(stderr, "unable to exec ");
-               perror(*vec);
-               _exit(-1);
        }
 
        return 0;  /* dead code to satisfy the compiler */