X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=sbr%2Fseq_save.c;h=0c14f47db41928cc953cebce885b421b7013b67f;hb=a485ed478abbd599d8c9aab48934e7a26733ecb1;hp=e0f42aec68aa72646a69a70bb4bf6470133b18f2;hpb=1691e80890e5d8ba258c51c214a3e91880e1db2b;p=mmh diff --git a/sbr/seq_save.c b/sbr/seq_save.c index e0f42ae..0c14f47 100644 --- a/sbr/seq_save.c +++ b/sbr/seq_save.c @@ -1,9 +1,10 @@ - /* * 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,94 +23,90 @@ void seq_save (struct msgs *mp) { - int 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"); + int 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)) - return; - mp->msgflags &= ~SEQMOD; + /* check if sequence information has changed */ + if (!(mp->msgflags & SEQMOD)) + return; + mp->msgflags &= ~SEQMOD; - fp = NULL; - flags = mp->msgflags; /* record folder flags */ + fp = NULL; + flags = mp->msgflags; /* record folder flags */ - /* - * If no mh-sequences file is defined, or if a mh-sequences file - * is defined but empty (*mh_seq == '\0'), then pretend folder - * is readonly. This will force all sequences to be private. - */ - if (mh_seq == NULL || *mh_seq == '\0') - set_readonly (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); + /* + * If no mh-sequences file is defined, or if a mh-sequences file + * is defined but empty (*mh_seq == '\0'), then pretend folder + * is readonly. This will force all sequences to be private. + */ + if (mh_seq == NULL || *mh_seq == '\0') + set_readonly (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); + + /* get space separated list of sequence ranges */ + if (!(cp = seq_list(mp, mp->msgattrs[i]))) { + context_del (attr); /* delete sequence from context */ + continue; + } - /* get space separated list of sequence ranges */ - if (!(cp = seq_list(mp, mp->msgattrs[i]))) { - context_del (attr); /* delete sequence from context */ - continue; + if (is_readonly(mp) || is_seq_private(mp, i)) { +priv: + /* + * sequence is private + */ + context_replace (attr, cp); /* update sequence in context */ + } else { + /* + * sequence is public + */ + context_del (attr); /* delete sequence from context */ + + if (!fp) { + /* + * Attempt to open file for public sequences. + * If that fails (probably because folder is + * readonly), then make sequence private. + */ + if ((fp = lkfopen (seqfile, "w")) == NULL + && (unlink (seqfile) == -1 || + (fp = lkfopen (seqfile, "w")) == NULL)) { + admonish (attr, "unable to write"); + goto priv; + } + + /* block a few signals */ + sigemptyset (&set); + sigaddset(&set, SIGHUP); + sigaddset(&set, SIGINT); + sigaddset(&set, SIGQUIT); + sigaddset(&set, SIGTERM); + SIGPROCMASK (SIG_BLOCK, &set, &oset); + } + fprintf (fp, "%s: %s\n", mp->msgattrs[i], cp); + } } - if (is_readonly(mp) || is_seq_private(mp, i)) { -priv: - /* - * sequence is private - */ - context_replace (attr, cp); /* update sequence in context */ + if (fp) { + lkfclose (fp, seqfile); + SIGPROCMASK (SIG_SETMASK, &oset, &set); /* reset signal mask */ } else { - /* - * sequence is public - */ - context_del (attr); /* delete sequence from context */ - - if (!fp) { /* - * Attempt to open file for public sequences. - * If that fails (probably because folder is - * readonly), then make sequence private. + * If folder is not readonly, and we didn't save any + * public sequences, then remove that file. */ - if ((fp = fopen (seqfile, "w")) == NULL - && (unlink (seqfile) == -1 || - (fp = fopen (seqfile, "w")) == NULL)) { - admonish (attr, "unable to write"); - goto priv; - } - - /* block a few signals */ - sigemptyset (&set); - sigaddset(&set, SIGHUP); - sigaddset(&set, SIGINT); - sigaddset(&set, SIGQUIT); - sigaddset(&set, SIGTERM); - SIGPROCMASK (SIG_BLOCK, &set, &oset); - } - fprintf (fp, "%s: %s\n", mp->msgattrs[i], cp); + if (!is_readonly(mp)) + unlink (seqfile); } - } - if (fp) { - fclose (fp); - 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. + * Reset folder flag, since we may be + * pretending that folder is readonly. */ - if (!is_readonly(mp)) - unlink (seqfile); - } - - /* - * Reset folder flag, since we may be - * pretending that folder is readonly. - */ - mp->msgflags = flags; + mp->msgflags = flags; }