]> diplodocus.org Git - nmh/blobdiff - uip/annosbr.c
Bump up size of two static char[] so gcc knows they won't overflow.
[nmh] / uip / annosbr.c
index 87e9580b423f896d42264a431816174c4b7161e0..2c1ce75ada046361b4193535b50e061d0b221c5d 100644 (file)
@@ -1,6 +1,4 @@
-
-/*
- * annosbr.c -- prepend annotation to messages
+/* annosbr.c -- prepend annotation to messages
  *
  * 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,8 +8,9 @@
 #include <h/mh.h>
 #include <h/tws.h>
 #include <h/utils.h>
+#include "../sbr/lock_file.h"
+#include "../sbr/m_mktemp.h"
 #include <fcntl.h>
-#include <errno.h>
 #include <utime.h>
 
 
@@ -33,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;
@@ -60,13 +64,13 @@ 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;
 }
 
 /*
  *  Produce a listing of all header fields (annotations) whose field name matches
- *  comp.  Number the listing if number is set.  Treate the field bodies as path
+ *  comp.  Number the listing if number is set.  Treat the field bodies as path
  *  names and just output the last component unless text is non-NULL.  We don't
  *  care what text is set to.
  */
@@ -84,7 +88,7 @@ annolist(char *file, char *comp, char *text, int number)
     int                n;              /* number of bytes written */
     char       *sp;            /* another miscellaneous character pointer */
 
-    if ((fp = fopen(file, "r")) == (FILE *)0)
+    if ((fp = fopen(file, "r")) == NULL)
        adios(file, "unable to open");
 
     /*
@@ -113,7 +117,6 @@ 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;
            }
 
@@ -137,10 +140,10 @@ annolist(char *file, char *comp, char *text, int number)
            if (number)
                (void)printf("%d\t", ++count);
 
-           if (text == (char *)0 && (sp = strrchr(cp, '/')) != (char *)0)
+           if (text == NULL && (sp = strrchr(cp, '/')) != (char *)0)
                cp = sp + 1;
 
-           (void)printf("%s\n", cp);
+            puts(cp);
        }
 
     } while (*field != '\0' && *field != '-');
@@ -152,8 +155,6 @@ annolist(char *file, char *comp, char *text, int number)
     free(field);
 
     (void)fclose(fp);
-
-    return;
 }
 
 /*
@@ -164,7 +165,6 @@ void
 annopreserve(int preserve)
 {
        preserve_actime_and_modtime = preserve;
-       return;
 }
 
 static int
@@ -183,9 +183,12 @@ annosbr (int fd, char *file, char *comp, char *text, int inplace, int datesw, in
     int                length;         /* length of field name */
     int                n;              /* number of bytes written */
 
-    mode = fstat (fd, &st) != NOTOK ? (st.st_mode & 0777) : m_gmprot ();
+    mode = fstat (fd, &st) != NOTOK ? (int) (st.st_mode & 0777) : m_gmprot ();
 
-    strncpy (tmpfil, m_mktemp2(file, "annotate", NULL, &tmp), sizeof(tmpfil));
+    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);
 
     /*
@@ -197,7 +200,7 @@ annosbr (int fd, char *file, char *comp, char *text, int inplace, int datesw, in
      */
 
     if (delete >= -1 || append != 0) {
-       if ((fp = fdopen(fd, "r")) == (FILE *)0)
+       if ((fp = fdopen(fd, "r")) == NULL)
            adios(NULL, "unable to fdopen file.");
 
        field = (char *)mh_xmalloc(field_size = 256);
@@ -290,7 +293,7 @@ annosbr (int fd, char *file, char *comp, char *text, int inplace, int datesw, in
 
            if (strncasecmp(field, comp, length) == 0 && field[length] == ':') {
                if (delete == 0) {
-                   if (text == (char *)0)
+                   if (text == NULL)
                        break;
 
                    for (cp = field + length + 1; *cp == ' ' || *cp == '\t'; cp++)
@@ -301,7 +304,7 @@ annosbr (int fd, char *file, char *comp, char *text, int inplace, int datesw, in
                                break;
                    }
                    else {
-                       if ((sp = strrchr(cp, '/')) != (char *)0)
+                       if ((sp = strrchr(cp, '/')) != NULL)
                            cp = sp + 1;
 
                        if (strcmp(cp, text) == 0)
@@ -389,10 +392,8 @@ annosbr (int fd, char *file, char *comp, char *text, int inplace, int datesw, in
      * copying routine uses the descriptor, not the pointer.
      */
 
-    if (append || delete >= -1) {
-       if (lseek(fd, (off_t)ftell(fp), SEEK_SET) == (off_t)-1)
-           adios(NULL, "can't seek.");
-    }
+    if (fp && lseek(fd, (off_t)ftell(fp), SEEK_SET) == (off_t)-1)
+        adios(NULL, "can't seek.");
 
     cpydata (fd, fileno (tmp), file, tmpfil);
     fclose (tmp);
@@ -401,7 +402,7 @@ annosbr (int fd, char *file, char *comp, char *text, int inplace, int datesw, in
        if ((tmpfd = open (tmpfil, O_RDONLY)) == NOTOK)
            adios (tmpfil, "unable to open for re-reading");
 
-       lseek (fd, (off_t) 0, SEEK_SET);
+       lseek(fd, 0, SEEK_SET);
 
        /*
         *  We're making the file shorter if we're deleting a header field
@@ -413,13 +414,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:
@@ -440,7 +441,7 @@ annosbr (int fd, char *file, char *comp, char *text, int inplace, int datesw, in
      * lkclose() fail, but that failure is ignored so it's not a problem.
      */
 
-    if (delete >= -1)
+    if (fp)
        (void)fclose(fp);
 
     return 0;