X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/0bfb53a23531bea3aaeadcd1a6f6c372eef96612..a2806483a53fcdb62ca8e2bec4f4e023355f4470:/uip/new.c diff --git a/uip/new.c b/uip/new.c index e391ba20..6f998252 100644 --- a/uip/new.c +++ b/uip/new.c @@ -13,10 +13,6 @@ #include -#include -#include -#include - #include #include #include @@ -93,20 +89,35 @@ seq_in_list(char *name, char *sequences[]) 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; 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")) == NULL) { + 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)) { @@ -167,7 +178,9 @@ get_msgnums(char *folder, char *sequences[]) } m_getfld_state_destroy (&gstate); - fclose(fp); + lkfclosedata (fp, seqfile); + + free(seqfile); return msgnums; } @@ -404,21 +417,12 @@ main(int argc, char **argv) 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; @@ -456,9 +460,9 @@ main(int argc, char **argv) } } /* 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; } } @@ -485,12 +489,12 @@ main(int argc, char **argv) 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; @@ -514,6 +518,7 @@ main(int argc, char **argv) context_save(); + svector_free (sequences); done (0); return 1; }