]> diplodocus.org Git - nmh/blobdiff - uip/comp.c
lock_file.c: close(2) file descriptor on failure, avoiding leak.
[nmh] / uip / comp.c
index a7300c34300c647f5c6a4ea4fa081e15ec2c3f25..744ea19beb7c05c711cd719f640cad82a19da840 100644 (file)
@@ -1,6 +1,4 @@
-
-/*
- * comp.c -- compose a message
+/* comp.c -- compose a message
  *
  * This code is Copyright (c) 2002, by the authors of nmh.  See the
  * COPYRIGHT file in the root directory of the nmh distribution for
  *
  * This code is Copyright (c) 2002, by the authors of nmh.  See the
  * COPYRIGHT file in the root directory of the nmh distribution for
@@ -10,6 +8,7 @@
 #include <h/mh.h>
 #include <h/utils.h>
 #include <h/fmt_scan.h>
 #include <h/mh.h>
 #include <h/utils.h>
 #include <h/fmt_scan.h>
+#include "sbr/m_maildir.h"
 #include <fcntl.h>
 
 #define COMP_SWITCHES \
 #include <fcntl.h>
 
 #define COMP_SWITCHES \
@@ -31,7 +30,7 @@
     X("cc address", 0, CCSW) \
     X("from address", 0, FROMSW) \
     X("fcc mailbox", 0, FCCSW) \
     X("cc address", 0, CCSW) \
     X("from address", 0, FROMSW) \
     X("fcc mailbox", 0, FCCSW) \
-    X("width colums", 0, WIDTHSW) \
+    X("width columns", 0, WIDTHSW) \
     X("subject text", 0, SUBJECTSW) \
 
 #define X(sw, minchars, id) id,
     X("subject text", 0, SUBJECTSW) \
 
 #define X(sw, minchars, id) id,
@@ -83,11 +82,7 @@ main (int argc, char **argv)
     struct format *fmt;
     struct stat st;
 
     struct format *fmt;
     struct stat st;
 
-    setlocale(LC_ALL, "");
-    invo_name = r1bindex (argv[0], '/');
-
-    /* read user profile/context */
-    context_read();
+    if (nmh_init(argv[0], 1)) { return 1; }
 
     arguments = getarguments (invo_name, argc, argv, 1);
     argp = arguments;
 
     arguments = getarguments (invo_name, argc, argv, 1);
     argp = arguments;
@@ -127,7 +122,7 @@ main (int argc, char **argv)
 
                case BILDSW:
                    build++;
 
                case BILDSW:
                    build++;
-                   /* fall through */
+                   /* FALLTHRU */
                case NWHATSW: 
                    nwhat++;
                    continue;
                case NWHATSW: 
                    nwhat++;
                    continue;
@@ -196,8 +191,7 @@ main (int argc, char **argv)
                    if (*cp == '@')
                        cp = dp = path(cp + 1, TSUBCWF);
                    fcc = addlist(fcc, cp);
                    if (*cp == '@')
                        cp = dp = path(cp + 1, TSUBCWF);
                    fcc = addlist(fcc, cp);
-                   if (dp)
-                       free(dp);
+                    free(dp);
                    continue;
 
                case WIDTHSW:
                    continue;
 
                case WIDTHSW:
@@ -217,17 +211,15 @@ main (int argc, char **argv)
        if (*cp == '+' || *cp == '@') {
            if (folder)
                adios (NULL, "only one folder at a time!");
        if (*cp == '+' || *cp == '@') {
            if (folder)
                adios (NULL, "only one folder at a time!");
-           else
-               folder = pluspath (cp);
+            folder = pluspath (cp);
        } else {
            if (msg)
                adios (NULL, "only one message at a time!");
        } else {
            if (msg)
                adios (NULL, "only one message at a time!");
-           else
-               msg = cp;
+            msg = cp;
        }
     }
 
        }
     }
 
-    cwd = getcpy (pwd ());
+    cwd = mh_xstrdup(pwd ());
 
     if (!context_find ("path"))
        free (path ("./", TFOLDER));
 
     if (!context_find ("path"))
        free (path ("./", TFOLDER));
@@ -275,7 +267,7 @@ main (int argc, char **argv)
        if (mp->numsel > 1)
            adios (NULL, "only one message at a time!");
 
        if (mp->numsel > 1)
            adios (NULL, "only one message at a time!");
 
-       if ((in = open (form = getcpy (m_name (mp->lowsel)), O_RDONLY)) == NOTOK)
+       if ((in = open (form = mh_xstrdup(m_name (mp->lowsel)), O_RDONLY)) == NOTOK)
            adios (form, "unable to open message");
     } else {
        struct comp *cptr;
            adios (form, "unable to open message");
     } else {
        struct comp *cptr;
@@ -341,7 +333,8 @@ try_it_again:
            adios (drft, "unable to stat");
        printf ("Draft \"%s\" exists (%ld bytes).", drft, (long) st.st_size);
        for (i = LISTDSW; i != YESW;) {
            adios (drft, "unable to stat");
        printf ("Draft \"%s\" exists (%ld bytes).", drft, (long) st.st_size);
        for (i = LISTDSW; i != YESW;) {
-           if (!(argp = getans ("\nDisposition? ", isdf ? aqrunl : aqrul)))
+           if (!(argp = read_switch_multiword ("\nDisposition? ",
+                                               isdf ? aqrunl : aqrul)))
                done (1);
            switch (i = smatch (*argp, isdf ? aqrunl : aqrul)) {
                case NOSW: 
                done (1);
            switch (i = smatch (*argp, isdf ? aqrunl : aqrul)) {
                case NOSW: 
@@ -363,7 +356,7 @@ try_it_again:
                        i = YESW;
                    break;
                default: 
                        i = YESW;
                    break;
                default: 
-                   advise (NULL, "say what?");
+                   inform("say what?");
                    break;
            }
        }
                    break;
            }
        }
@@ -375,18 +368,21 @@ try_it_again:
     if ((out = creat (drft, m_gmprot ())) == NOTOK)
        adios (drft, "unable to create");
     if (cp) {
     if ((out = creat (drft, m_gmprot ())) == NOTOK)
        adios (drft, "unable to create");
     if (cp) {
-       char *scanl;
+       charstring_t scanl;
 
        i = format_len + 1024;
 
        i = format_len + 1024;
-       scanl = mh_xmalloc((size_t) i + 2);
+       scanl = charstring_create (i + 2);
        dat[0] = 0;
        dat[1] = 0;
        dat[2] = 0;
        dat[3] = outputlinelen;
        dat[4] = 0;
        dat[0] = 0;
        dat[1] = 0;
        dat[2] = 0;
        dat[3] = outputlinelen;
        dat[4] = 0;
-       fmt_scan(fmt, scanl, i + 1, i, dat, NULL);
-       write(out, scanl, strlen(scanl));
-       free(scanl);
+       fmt_scan(fmt, scanl, i, dat, NULL);
+       if (write(out, charstring_buffer (scanl),
+                 charstring_bytes (scanl)) < 0) {
+           advise (drft, "write");
+       }
+       charstring_free(scanl);
     } else {
        cpydata (in, out, form, drft);
        close (in);
     } else {
        cpydata (in, out, form, drft);
        close (in);
@@ -398,7 +394,7 @@ edit_it:
 
     if (nwhat)
        done (0);
 
     if (nwhat)
        done (0);
-    what_now (ed, nedit, use, drft, NULL, 0, NULLMP, NULL, 0, cwd, 0);
+    what_now (ed, nedit, use, drft, NULL, 0, NULL, NULL, 0, cwd, 0);
     done (1);
     return 1;
 }
     done (1);
     return 1;
 }