]> diplodocus.org Git - nmh/blobdiff - uip/annosbr.c
Newer versions of Automake want to include the test-driver script,
[nmh] / uip / annosbr.c
index 6677d2146f21290a697ee896a3635fee67281c19..63d2ee4487a106010b25bde0b25b0f43fa4730bd 100644 (file)
@@ -2,8 +2,6 @@
 /*
  * annosbr.c -- prepend annotation to messages
  *
- * $Id$
- *
  * This code is Copyright (c) 2002, by the authors of nmh.  See the
  * COPYRIGHT file in the root directory of the nmh distribution for
  * complete copyright information.
@@ -11,8 +9,8 @@
 
 #include <h/mh.h>
 #include <h/tws.h>
+#include <h/utils.h>
 #include <fcntl.h>
-#include <errno.h>
 #include <utime.h>
 
 
@@ -34,15 +32,20 @@ annotate (char *file, char *comp, char *text, int inplace, int datesw, int delet
     int                        i, fd;
     struct utimbuf     b;
     struct stat                s;
+    int                        failed_to_lock = 0;
 
     /* open and lock the file to be annotated */
-    if ((fd = lkopen (file, O_RDWR, 0)) == NOTOK) {
+    if ((fd = lkopendata (file, O_RDWR, 0, &failed_to_lock)) == NOTOK) {
        switch (errno) {
            case ENOENT:
                break;
 
            default:
-               admonish (file, "unable to lock and open");
+               if (failed_to_lock) {
+                   admonish (file, "unable to lock");
+               } else {
+                   admonish (file, "unable to open");
+               }
                break;
        }
        return 1;
@@ -61,7 +64,7 @@ annotate (char *file, char *comp, char *text, int inplace, int datesw, int delet
     if (preserve_actime_and_modtime && utime(file, &b) == -1)
        advise("can't set access and modification times for %s", file);
 
-    lkclose (fd, file);
+    lkclosedata (fd, file);
     return i;
 }
 
@@ -93,8 +96,7 @@ annolist(char *file, char *comp, char *text, int number)
      *  This buffer might need to be quite large, so we grow it as needed.
      */
 
-    if ((field = (char *)malloc(field_size = 256)) == (char *)0)
-       adios(NULL, "can't allocate field buffer.");
+    field = (char *)mh_xmalloc(field_size = 256);
 
     /*
      *  Get the length of the field name since we use it often.
@@ -115,13 +117,11 @@ annolist(char *file, char *comp, char *text, int number)
        for (n = 0, cp = field; (c = getc(fp)) != EOF; *cp++ = c) {
            if (c == '\n' && (c = getc(fp)) != ' ' && c != '\t') {
                (void)ungetc(c, fp);
-               c = '\n';
                break;
            }
 
            if (++n >= field_size - 1) {
-               if ((field = (char *)realloc((void *)field, field_size += 256)) == (char *)0)
-                   adios(NULL, "can't grow field buffer.");
+               field = (char *) mh_xrealloc((void *)field, field_size += 256);
                
                cp = field + n - 1;
            }
@@ -180,20 +180,18 @@ annosbr (int fd, char *file, char *comp, char *text, int inplace, int datesw, in
     FILE       *tmp;
     int                c;              /* current character */
     int                count;          /* header field (annotation) counter */
-    char       *field;         /* buffer for header field */
-    int                field_size;     /* size of field buffer */
-    FILE       *fp;            /* file pointer made from locked file descriptor */
+    char       *field = NULL;  /* buffer for header field */
+    int                field_size = 0; /* size of field buffer */
+    FILE       *fp = NULL;     /* file pointer made from locked file descriptor */
     int                length;         /* length of field name */
     int                n;              /* number of bytes written */
 
-    mode = fstat (fd, &st) != NOTOK ? (st.st_mode & 0777) : m_gmprot ();
-
-    strncpy (tmpfil, m_scratch (file, "annotate"), sizeof(tmpfil));
+    mode = fstat (fd, &st) != NOTOK ? (int) (st.st_mode & 0777) : m_gmprot ();
 
-    if ((tmp = fopen (tmpfil, "w")) == NULL) {
-       admonish (tmpfil, "unable to create");
-       return 1;
+    if ((cp = m_mktemp2(file, "annotate", NULL, &tmp)) == NULL) {
+       adios(NULL, "unable to create temporary file in %s", get_temp_dir());
     }
+    strncpy (tmpfil, cp, sizeof(tmpfil));
     chmod (tmpfil, mode);
 
     /*
@@ -208,8 +206,7 @@ annosbr (int fd, char *file, char *comp, char *text, int inplace, int datesw, in
        if ((fp = fdopen(fd, "r")) == (FILE *)0)
            adios(NULL, "unable to fdopen file.");
 
-       if ((field = (char *)malloc(field_size = 256)) == (char *)0)
-           adios(NULL, "can't allocate field buffer.");
+       field = (char *)mh_xmalloc(field_size = 256);
     }
 
     /*
@@ -263,8 +260,7 @@ annosbr (int fd, char *file, char *comp, char *text, int inplace, int datesw, in
                }
 
                if (++n >= field_size - 1) {
-                   if ((field = (char *)realloc((void *)field, field_size *= 2)) == (char *)0)
-                       adios(NULL, "can't grow field buffer.");
+                   field = (char *) mh_xrealloc((void *)field, field_size *= 2);
                
                    cp = field + n - 1;
                }
@@ -384,7 +380,7 @@ annosbr (int fd, char *file, char *comp, char *text, int inplace, int datesw, in
                while (*cp && *cp++ != '\n')
                    continue;
                if (cp - sp)
-                   fprintf (tmp, "%s: %*.*s", comp, cp - sp, cp - sp, sp);
+                   fprintf (tmp, "%s: %*.*s", comp, (int)(cp - sp), (int)(cp - sp), sp);
            } while (*cp);
            if (cp[-1] != '\n' && cp != text)
                putc ('\n', tmp);
@@ -423,13 +419,13 @@ annosbr (int fd, char *file, char *comp, char *text, int inplace, int datesw, in
 
        cpydata (tmpfd, fd, tmpfil, file);
        close (tmpfd);
-       unlink (tmpfil);
+       (void) m_unlink (tmpfil);
     } else {
        strncpy (buffer, m_backup (file), sizeof(buffer));
        if (rename (file, buffer) == NOTOK) {
            switch (errno) {
                case ENOENT:    /* unlinked early - no annotations */
-                   unlink (tmpfil);
+                   (void) m_unlink (tmpfil);
                    break;
 
                default: