X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/81a21a9a97d8633f6d6231e31fdb6e328d0d3ff2..baecaa2380db6164c1992fdffccca8ea9a61d5ba:/uip/annosbr.c?ds=sidebyside diff --git a/uip/annosbr.c b/uip/annosbr.c index 337a01bc..63d2ee44 100644 --- a/uip/annosbr.c +++ b/uip/annosbr.c @@ -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. @@ -13,7 +11,6 @@ #include #include #include -#include #include @@ -35,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; @@ -62,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; } @@ -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); /* @@ -262,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; } @@ -383,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); @@ -422,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: