]> diplodocus.org Git - nmh/blobdiff - uip/new.c
lock_file.c: close(2) file descriptor on failure, avoiding leak.
[nmh] / uip / new.c
index 2304c1efebfab0691c3328950ff791c6ba37ca8a..c1c7999a2b3b285f4339aed231d9827be87fdb3d 100644 (file)
--- a/uip/new.c
+++ b/uip/new.c
@@ -1,6 +1,4 @@
-
-/*
- * new.c -- as new,    list all folders with unseen messages
+/* new.c -- as new,    list all folders with unseen messages
  *       -- as fnext,  move to next folder with unseen messages
  *       -- as fprev,  move to previous folder with unseen messages
  *       -- as unseen, scan all unseen messages
@@ -16,6 +14,8 @@
 #include <h/mh.h>
 #include <h/crawl_folders.h>
 #include <h/utils.h>
+#include "sbr/lock_file.h"
+#include "sbr/m_maildir.h"
 
 #define NEW_SWITCHES \
     X("mode", 1, MODESW) \
@@ -75,19 +75,19 @@ count_messages(char *field)
     return total;
 }
 
-/* Return TRUE if the sequence 'name' is in 'sequences'. */
-static boolean
+/* Return true if the sequence 'name' is in 'sequences'. */
+static bool
 seq_in_list(char *name, char *sequences[])
 {
     int i;
 
     for (i = 0; sequences[i] != NULL; i++) {
        if (strcmp(name, sequences[i]) == 0) {
-           return TRUE;
+           return true;
        }
     }
 
-    return FALSE;
+    return false;
 }
 
 /* Return the string list of message numbers from the sequences file, or NULL
@@ -98,11 +98,11 @@ get_msgnums(char *folder, char *sequences[])
     char *seqfile = NULL;
     FILE *fp;
     int state;
-    char name[NAMESZ], field[BUFSIZ];
+    char name[NAMESZ], field[NMH_BUFSIZ];
     char *cp;
     char *msgnums = NULL, *this_msgnums, *old_msgnums;
     int failed_to_lock = 0;
-    m_getfld_state_t gstate = 0;
+    m_getfld_state_t gstate;
 
     /* copied from seq_read.c:seq_public */
     /*
@@ -120,26 +120,24 @@ get_msgnums(char *folder, char *sequences[])
        return NULL;
 
     if ((fp = lkfopendata (seqfile, "r", & failed_to_lock)) == NULL) {
-
-       if (failed_to_lock) {
+       if (failed_to_lock)
            adios (seqfile, "failed to lock");
-       } else {
-           free(seqfile);
-           return NULL;
-       }
+        free(seqfile);
+        return NULL;
     }
 
-    /* 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);
                     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);
                     }
 
@@ -178,7 +176,7 @@ get_msgnums(char *folder, char *sequences[])
 
             case BODY:
                 adios (NULL, "no blank lines are permitted in %s", seqfile);
-                /* fall */
+                break;
 
             case FILEEOF:
                 break;
@@ -227,11 +225,11 @@ check_folder(char *folder, size_t len, struct list_state *b)
     }
 }
 
-static boolean
+static bool
 crawl_callback(char *folder, void *baton)
 {
     check_folder(folder, strlen(folder), baton);
-    return TRUE;
+    return true;
 }
 
 /* Scan folders, returning:
@@ -280,7 +278,7 @@ check_folders(struct node **first, struct node **last,
        while (vfgets(fp, &line) == OK) {
            len = strlen(line) - 1;
            line[len] = '\0';
-           check_folder(getcpy(line), len, &b);
+           check_folder(mh_xstrdup(line), len, &b);
        }
        fclose(fp);
     }
@@ -342,14 +340,15 @@ doit(char *cur, char *folders, char *sequences[])
        if (first == NULL) {
            /* No folders at all... */
            return NULL;
-       } else if (first->n_next == NULL) {
+       }
+        if (first->n_next == NULL) {
            /* We have only one node; any desired messages in it? */
            if (first->n_field == NULL) {
                return NULL;
-           } else {
-               return first;
            }
-       } else if (cur_node == NULL) {
+            return first;
+       }
+        if (cur_node == NULL) {
            /* Current folder is not listed in .folders, return first. */
            return first;
        }
@@ -390,7 +389,7 @@ doit(char *cur, char *folders, char *sequences[])
             if (strcmp(node->n_name, cur) == 0) {
                 puts(" (*: current folder)");
             } else {
-                puts("");
+                putchar('\n');
             }
             fflush(stdout);