X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/1691e80890e5d8ba258c51c214a3e91880e1db2b..a3544ffdfac9536a2a115dd7afd805a399083e01:/sbr/seq_save.c diff --git a/sbr/seq_save.c b/sbr/seq_save.c index e0f42aec..83753afb 100644 --- a/sbr/seq_save.c +++ b/sbr/seq_save.c @@ -3,7 +3,9 @@ * seq_save.c -- 1) synchronize sequences * -- 2) save public sequences * - * $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. */ #include @@ -22,18 +24,21 @@ void seq_save (struct msgs *mp) { - int i; + size_t i; char flags, *cp, attr[BUFSIZ], seqfile[PATH_MAX]; FILE *fp; sigset_t set, oset; - /* sanity check - check that context has been read */ - if (defpath == NULL) - adios (NULL, "oops, context hasn't been read yet"); - /* check if sequence information has changed */ - if (!(mp->msgflags & SEQMOD)) + if (!(mp->msgflags & SEQMOD)) { + if (mp->seqhandle) { + lkfclosedata (mp->seqhandle, mp->seqname); + mp->seqhandle = NULL; + free(mp->seqname); + mp->seqname = NULL; + } return; + } mp->msgflags &= ~SEQMOD; fp = NULL; @@ -49,11 +54,12 @@ seq_save (struct msgs *mp) else snprintf (seqfile, sizeof(seqfile), "%s/%s", mp->foldpath, mh_seq); - for (i = 0; mp->msgattrs[i]; i++) { - snprintf (attr, sizeof(attr), "atr-%s-%s", mp->msgattrs[i], mp->foldpath); + for (i = 0; i < svector_size (mp->msgattrs); i++) { + snprintf (attr, sizeof(attr), "atr-%s-%s", + svector_at (mp->msgattrs, i), mp->foldpath); /* get space separated list of sequence ranges */ - if (!(cp = seq_list(mp, mp->msgattrs[i]))) { + if (!(cp = seq_list(mp, svector_at (mp->msgattrs, i)))) { context_del (attr); /* delete sequence from context */ continue; } @@ -76,9 +82,17 @@ priv: * If that fails (probably because folder is * readonly), then make sequence private. */ - if ((fp = fopen (seqfile, "w")) == NULL + + if (mp->seqhandle) { + fp = mp->seqhandle; + mp->seqhandle = NULL; + free(mp->seqname); + mp->seqname = NULL; + rewind(fp); + ftruncate(fileno(fp), 0); + } else if ((fp = lkfopendata (seqfile, "w")) == NULL && (unlink (seqfile) == -1 || - (fp = fopen (seqfile, "w")) == NULL)) { + (fp = lkfopendata (seqfile, "w")) == NULL)) { admonish (attr, "unable to write"); goto priv; } @@ -89,15 +103,15 @@ priv: sigaddset(&set, SIGINT); sigaddset(&set, SIGQUIT); sigaddset(&set, SIGTERM); - SIGPROCMASK (SIG_BLOCK, &set, &oset); + sigprocmask (SIG_BLOCK, &set, &oset); } - fprintf (fp, "%s: %s\n", mp->msgattrs[i], cp); + fprintf (fp, "%s: %s\n", svector_at (mp->msgattrs, i), cp); } } if (fp) { - fclose (fp); - SIGPROCMASK (SIG_SETMASK, &oset, &set); /* reset signal mask */ + lkfclosedata (fp, seqfile); + sigprocmask (SIG_SETMASK, &oset, &set); /* reset signal mask */ } else { /* * If folder is not readonly, and we didn't save any