]>
diplodocus.org Git - nmh/blob - sbr/seq_save.c
3 * seq_save.c -- 1) synchronize sequences
4 * -- 2) save public sequences
6 * This code is Copyright (c) 2002, by the authors of nmh. See the
7 * COPYRIGHT file in the root directory of the nmh distribution for
8 * complete copyright information.
12 #include <h/signals.h>
16 * 1. If sequence is public and folder is readonly,
17 * then change it to be private
18 * 2a. If sequence is public, then add it to the sequences file
19 * in folder (name specified by mh-sequences profile entry).
20 * 2b. If sequence is private, then add it to the
25 seq_save (struct msgs
*mp
)
28 char flags
, *cp
, attr
[BUFSIZ
], seqfile
[PATH_MAX
];
32 /* check if sequence information has changed */
33 if (!(mp
->msgflags
& SEQMOD
))
35 mp
->msgflags
&= ~SEQMOD
;
38 flags
= mp
->msgflags
; /* record folder flags */
41 * If no mh-sequences file is defined, or if a mh-sequences file
42 * is defined but empty (*mh_seq == '\0'), then pretend folder
43 * is readonly. This will force all sequences to be private.
45 if (mh_seq
== NULL
|| *mh_seq
== '\0')
48 snprintf (seqfile
, sizeof(seqfile
), "%s/%s", mp
->foldpath
, mh_seq
);
50 for (i
= 0; mp
->msgattrs
[i
]; i
++) {
51 snprintf (attr
, sizeof(attr
), "atr-%s-%s", mp
->msgattrs
[i
], mp
->foldpath
);
53 /* get space separated list of sequence ranges */
54 if (!(cp
= seq_list(mp
, mp
->msgattrs
[i
]))) {
55 context_del (attr
); /* delete sequence from context */
59 if (is_readonly(mp
) || is_seq_private(mp
, i
)) {
64 context_replace (attr
, cp
); /* update sequence in context */
69 context_del (attr
); /* delete sequence from context */
73 * Attempt to open file for public sequences.
74 * If that fails (probably because folder is
75 * readonly), then make sequence private.
77 if ((fp
= lkfopen (seqfile
, "w")) == NULL
78 && (unlink (seqfile
) == -1 ||
79 (fp
= lkfopen (seqfile
, "w")) == NULL
)) {
80 admonish (attr
, "unable to write");
84 /* block a few signals */
86 sigaddset(&set
, SIGHUP
);
87 sigaddset(&set
, SIGINT
);
88 sigaddset(&set
, SIGQUIT
);
89 sigaddset(&set
, SIGTERM
);
90 sigprocmask (SIG_BLOCK
, &set
, &oset
);
92 fprintf (fp
, "%s: %s\n", mp
->msgattrs
[i
], cp
);
97 lkfclose (fp
, seqfile
);
98 sigprocmask (SIG_SETMASK
, &oset
, &set
); /* reset signal mask */
101 * If folder is not readonly, and we didn't save any
102 * public sequences, then remove that file.
104 if (!is_readonly(mp
))
109 * Reset folder flag, since we may be
110 * pretending that folder is readonly.
112 mp
->msgflags
= flags
;