]> diplodocus.org Git - nmh/blobdiff - sbr/folder_read.c
mh-format.man: Fix `Return' column heading alignment.
[nmh] / sbr / folder_read.c
index 4a9f7fbaf68af5a87d29bd5d1bdc59f5e92e6ea3..b0638402a2537cd9467d28077f6e0392295d6893 100644 (file)
@@ -1,6 +1,4 @@
-
-/*
- * folder_read.c -- initialize folder structure and read folder
+/* folder_read.c -- initialize folder structure and read folder
  *
  * This code is Copyright (c) 2002, by the authors of nmh.  See the
  * COPYRIGHT file in the root directory of the nmh distribution for
  *
  * This code is Copyright (c) 2002, by the authors of nmh.  See the
  * COPYRIGHT file in the root directory of the nmh distribution for
@@ -25,7 +23,7 @@
 struct msgs *
 folder_read (char *name, int lockflag)
 {
 struct msgs *
 folder_read (char *name, int lockflag)
 {
-    int msgnum, prefix_len, len, *mi;
+    int msgnum, len, *mi;
     struct msgs *mp;
     struct dirent *dp;
     DIR *dd;
     struct msgs *mp;
     struct dirent *dp;
     DIR *dd;
@@ -39,8 +37,7 @@ folder_read (char *name, int lockflag)
     }
 
     /* Allocate the main structure for folder information */
     }
 
     /* Allocate the main structure for folder information */
-    mp = (struct msgs *) mh_xmalloc ((size_t) sizeof(*mp));
-
+    NEW(mp);
     clear_folder_flags (mp);
     mp->foldpath = name;
     mp->lowmsg = 0;
     clear_folder_flags (mp);
     mp->foldpath = name;
     mp->lowmsg = 0;
@@ -55,7 +52,6 @@ folder_read (char *name, int lockflag)
 
     if (access (name, W_OK) == -1)
        set_readonly (mp);
 
     if (access (name, W_OK) == -1)
        set_readonly (mp);
-    prefix_len = strlen(BACKUP_PREFIX);
 
     /*
      * Allocate a temporary place to record the
 
     /*
      * Allocate a temporary place to record the
@@ -101,7 +97,7 @@ folder_read (char *name, int lockflag)
 
                default: 
                    /* skip any files beginning with backup prefix */
 
                default: 
                    /* skip any files beginning with backup prefix */
-                   if (!strncmp (dp->d_name, BACKUP_PREFIX, prefix_len))
+                   if (has_prefix(dp->d_name, BACKUP_PREFIX))
                        continue;
 
                    /* skip the LINK file */
                        continue;
 
                    /* skip the LINK file */
@@ -124,6 +120,16 @@ folder_read (char *name, int lockflag)
     /* for testing, allocate minimal necessary space */
     /* mp->hghoff = max (mp->hghmsg, 1); */
 
     /* for testing, allocate minimal necessary space */
     /* mp->hghoff = max (mp->hghmsg, 1); */
 
+    /*
+     * If for some reason hghoff < lowoff (like we got an integer overflow)
+     * the complain about this now.
+     */
+
+    if (mp->hghoff < mp->lowoff) {
+       adios(NULL, "Internal failure: high message limit < low message "
+             "limit; possible overflow?");
+    }
+
     /*
      * Allocate space for status of each message.
      */
     /*
      * Allocate space for status of each message.
      */
@@ -155,7 +161,15 @@ folder_read (char *name, int lockflag)
     /*
      * Read and initialize the sequence information.
      */
     /*
      * Read and initialize the sequence information.
      */
-    seq_read (mp, lockflag);
+    if (seq_read (mp, lockflag) == NOTOK) {
+        char seqfile[PATH_MAX];
+
+        /* Failed to lock sequence file. */
+        snprintf (seqfile, sizeof(seqfile), "%s/%s", mp->foldpath, mh_seq);
+        advise (seqfile, "failed to lock");
+
+        return NULL;
+    }
 
     return mp;
 }
 
     return mp;
 }