]> diplodocus.org Git - nmh/blobdiff - sbr/seq_save.c
Changed several globals to be static, to avoid collision,
[nmh] / sbr / seq_save.c
index 4055f9d5f1cc9c429442d3c3957bce91946b97e3..83753afb5a1be551f068a06d9768b268b823ee4d 100644 (file)
 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;
 
     /* 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;
@@ -47,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;
        }
@@ -74,9 +82,17 @@ priv:
                 * If that fails (probably because folder is
                 * readonly), then make sequence private.
                 */
-               if ((fp = lkfopen (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 = lkfopen (seqfile, "w")) == NULL)) {
+                           (fp = lkfopendata (seqfile, "w")) == NULL)) {
                    admonish (attr, "unable to write");
                    goto priv;
                }
@@ -89,12 +105,12 @@ priv:
                sigaddset(&set, SIGTERM);
                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) {
-       lkfclose (fp, seqfile);
+       lkfclosedata (fp, seqfile);
        sigprocmask (SIG_SETMASK, &oset, &set);  /* reset signal mask */
     } else {
        /*