#include <sys/types.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
#include <h/mh.h>
#include <h/crawl_folders.h>
#include <h/utils.h>
static char *
get_msgnums(char *folder, char *sequences[])
{
- char *seqfile = concat(m_maildir(folder), "/", mh_seq, (void *)NULL);
- FILE *fp = fopen(seqfile, "r");
+ char *seqfile = NULL;
+ FILE *fp;
int state;
char name[NAMESZ], field[BUFSIZ];
char *cp;
char *msgnums = NULL, *this_msgnums, *old_msgnums;
+ int failed_to_lock = 0;
m_getfld_state_t gstate = 0;
- /* no sequences file -> no messages */
- if (fp == NULL) {
- return NULL;
+ /* copied from seq_read.c:seq_public */
+ /*
+ * 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 NULL;
+
+ /* get filename of sequence file */
+ seqfile = concat(m_maildir(folder), "/", mh_seq, (void *)NULL);
+
+ if (seqfile == NULL)
+ return NULL;
+
+ if ((fp = lkfopendata (seqfile, "r", & failed_to_lock)) == NULL) {
+
+ if (failed_to_lock) {
+ adios (seqfile, "failed to lock");
+ } else {
+ free(seqfile);
+ return NULL;
+ }
}
- /* copied from seq_read.c:seq_public */
+ /* Use m_getfld to scan sequence file */
for (;;) {
int fieldsz = sizeof field;
switch (state = m_getfld (&gstate, name, field, &fieldsz, fp)) {
}
m_getfld_state_destroy (&gstate);
- fclose(fp);
+ lkfclosedata (fp, seqfile);
+
+ free(seqfile);
return msgnums;
}
/* If we're fnext, we haven't checked the last node yet. If it's the
* current folder, return the first node. */
- if (run_mode == FNEXT && strcmp(last->n_name, cur) == 0) {
- return first;
+ if (run_mode == FNEXT) {
+ assert(last != NULL);
+ if (strcmp(last->n_name, cur) == 0) {
+ return first;
+ }
}
if (run_mode == NEW) {
char **ap, *cp, **argp, **arguments;
char help[BUFSIZ];
char *folders = NULL;
- char *sequences[NUMATTRS + 1];
+ svector_t sequences = svector_create (0);
int i = 0;
char *unseen;
struct node *folder;
- sequences[0] = NULL;
- sequences[1] = NULL;
-
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex(argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
}
}
/* have a sequence argument */
- if (!seq_in_list(cp, sequences)) {
- sequences[i++] = cp;
- sequences[i] = NULL;
+ if (!seq_in_list(cp, svector_strs (sequences))) {
+ svector_push_back (sequences, cp);
+ ++i;
}
}
adios(NULL, "must specify sequences or set %s", usequence);
}
for (ap = brkstring(unseen, " ", "\n"); *ap; ap++) {
- sequences[i++] = *ap;
+ svector_push_back (sequences, *ap);
+ ++i;
}
}
- sequences[i] = NULL;
- folder = doit(context_find(pfolder), folders, sequences);
+ folder = doit(context_find(pfolder), folders, svector_strs (sequences));
if (folder == NULL) {
done(0);
return 1;
context_save();
+ svector_free (sequences);
done (0);
return 1;
}