X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/5dd6771b28c257af405d7248639ed0e3bcdce38b..a3724ed39:/uip/annosbr.c?ds=inline diff --git a/uip/annosbr.c b/uip/annosbr.c index 87e9580b..2c1ce75a 100644 --- a/uip/annosbr.c +++ b/uip/annosbr.c @@ -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 #include #include +#include "../sbr/lock_file.h" +#include "../sbr/m_mktemp.h" #include -#include #include @@ -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;