-
-/*
- * seq_save.c -- 1) synchronize sequences
+/* 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.
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;
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;
}
context_del (attr); /* delete sequence from context */
if (!fp) {
+ int failed_to_lock = 0;
+
/*
* Attempt to open file for public sequences.
* If that fails (probably because folder is
* readonly), then make sequence private.
*/
- if ((fp = fopen (seqfile, "w")) == NULL
- && (unlink (seqfile) == -1 ||
- (fp = fopen (seqfile, "w")) == NULL)) {
- admonish (attr, "unable to write");
+
+ if (mp->seqhandle) {
+ fp = mp->seqhandle;
+ mp->seqhandle = NULL;
+ free(mp->seqname);
+ mp->seqname = NULL;
+ rewind(fp);
+ if (ftruncate(fileno(fp), 0) < 0) {
+ advise ("sequence file", "ftruncate");
+ }
+ } else if ((fp = lkfopendata (seqfile, "w", &failed_to_lock))
+ == NULL
+ && (m_unlink (seqfile) == -1 ||
+ (fp = lkfopendata (seqfile, "w", &failed_to_lock))
+ == NULL)) {
+ if (failed_to_lock) {
+ admonish (attr, "unable to lock");
+ } else {
+ admonish (attr, "unable to write");
+ }
goto 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
* public sequences, then remove that file.
*/
if (!is_readonly(mp))
- unlink (seqfile);
+ (void) m_unlink (seqfile);
}
/*