-
-/*
- * seq_read.c -- read the .mh_sequence file and
+/* seq_read.c -- read the .mh_sequence file and
* -- initialize sequence information
*
* This code is Copyright (c) 2002, by the authors of nmh. See the
#include <h/mh.h>
#include <h/utils.h>
+#include "lock_file.h"
/*
* static prototypes
*/
static int seq_init (struct msgs *, char *, char *);
-static void seq_public (struct msgs *);
+static int seq_public (struct msgs *, int, int *);
static void seq_private (struct msgs *);
* or context file (for private sequences).
*/
-void
-seq_read (struct msgs *mp)
+int
+seq_read (struct msgs *mp, int lockflag)
{
+ int failed_to_lock = 0;
+
/*
* Initialize the list of sequence names. Go ahead and
* add the "cur" sequence to the list of sequences.
*/
- mp->msgattrs[0] = getcpy (current);
- mp->msgattrs[1] = NULL;
+ svector_push_back (mp->msgattrs, getcpy (current));
make_all_public (mp); /* initially, make all public */
/* If folder is empty, don't scan for sequence information */
if (mp->nummsg == 0)
- return;
+ return OK;
/* Initialize the public sequences */
- seq_public (mp);
+ if (seq_public (mp, lockflag, &failed_to_lock) == NOTOK) {
+ if (failed_to_lock) return NOTOK;
+ }
/* Initialize the private sequences */
seq_private (mp);
+
+ return OK;
}
* read folder's sequences file for public sequences
*/
-static void
-seq_public (struct msgs *mp)
+static int
+seq_public (struct msgs *mp, int lockflag, int *failed_to_lock)
{
int state;
char *cp, seqfile[PATH_MAX];
- char name[NAMESZ], field[BUFSIZ];
+ char name[NAMESZ], field[NMH_BUFSIZ];
FILE *fp;
- m_getfld_state_t gstate = 0;
+ m_getfld_state_t gstate;
/*
- * If mh_seq == NULL (such as if nmh been compiled with
- * NOPUBLICSEQ), or if *mh_seq == '\0' (the user has defined
+ * If mh_seq == NULL or if *mh_seq == '\0' (the user has defined
* the "mh-sequences" profile entry, but left it empty),
* then just return, and do not initialize any public sequences.
*/
if (mh_seq == NULL || *mh_seq == '\0')
- return;
+ return OK;
/* get filename of sequence file */
snprintf (seqfile, sizeof(seqfile), "%s/%s", mp->foldpath, mh_seq);
- if ((fp = lkfopen (seqfile, "r")) == NULL)
- return;
+ if ((fp = lkfopendata (seqfile, lockflag ? "r+" : "r", failed_to_lock))
+ == NULL)
+ return NOTOK;
- /* Use m_getfld to scan sequence file */
+ /* Use m_getfld2 to scan sequence file */
+ gstate = m_getfld_state_init(fp);
for (;;) {
int fieldsz = sizeof field;
- switch (state = m_getfld (&gstate, name, field, &fieldsz, fp)) {
+ switch (state = m_getfld2(&gstate, name, field, &fieldsz)) {
case FLD:
case FLDPLUS:
if (state == FLDPLUS) {
- cp = getcpy (field);
+ cp = mh_xstrdup(field);
while (state == FLDPLUS) {
fieldsz = sizeof field;
- state = m_getfld (&gstate, name, field, &fieldsz, fp);
+ state = m_getfld2(&gstate, name, field, &fieldsz);
cp = add (field, cp);
}
- seq_init (mp, getcpy (name), trimcpy (cp));
+ seq_init (mp, mh_xstrdup(name), trimcpy (cp));
free (cp);
} else {
- seq_init (mp, getcpy (name), trimcpy (field));
+ seq_init (mp, mh_xstrdup(name), trimcpy (field));
}
continue;
- case BODY:
+ case BODY:
+ lkfclosedata (fp, seqfile);
adios (NULL, "no blank lines are permitted in %s", seqfile);
- /* fall */
+ break;
case FILEEOF:
break;
default:
+ lkfclosedata (fp, seqfile);
adios (NULL, "%s is poorly formatted", seqfile);
}
break; /* break from for loop */
}
m_getfld_state_destroy (&gstate);
- lkfclose (fp, seqfile);
+ if (lockflag) {
+ mp->seqhandle = fp;
+ mp->seqname = mh_xstrdup(seqfile);
+ } else {
+ lkfclosedata (fp, seqfile);
+ }
+
+ return OK;
}
char *cp;
struct node *np;
- alen = strlen ("atr-");
+ alen = LEN("atr-");
plen = strlen (mp->foldpath) + 1;
for (np = m_defs; np; np = np->n_next) {
&& (j = strlen (np->n_name) - plen) > alen
&& *(np->n_name + j) == '-'
&& strcmp (mp->foldpath, np->n_name + j + 1) == 0) {
- cp = getcpy (np->n_name + alen);
+ cp = mh_xstrdup(np->n_name + alen);
*(cp + j - alen) = '\0';
if ((i = seq_init (mp, cp, getcpy (np->n_field))) != -1)
make_seq_private (mp, i);
* Search for this sequence name to see if we've seen
* it already. If we've seen this sequence before,
* then clear the bit for this sequence from all the
- * mesages in this folder.
+ * messages in this folder.
*/
- for (i = 0; mp->msgattrs[i]; i++) {
- if (!strcmp (mp->msgattrs[i], name)) {
+ for (i = 0; i < svector_size (mp->msgattrs); i++) {
+ if (!strcmp (svector_at (mp->msgattrs, i), name)) {
for (j = mp->lowmsg; j <= mp->hghmsg; j++)
clear_sequence (mp, i, j);
break;
}
}
- /* Return error, if too many sequences */
- if (i >= NUMATTRS) {
- free (name);
- free (field);
- return -1;
- }
-
/*
* If we've already seen this sequence name, just free the
* name string. Else add it to the list of sequence names.
*/
- if (mp->msgattrs[i]) {
+ if (svector_at (mp->msgattrs, i)) {
free (name);
} else {
- mp->msgattrs[i] = name;
- mp->msgattrs[i + 1] = NULL;
+ svector_push_back (mp->msgattrs, name);
}
/*