]> diplodocus.org Git - nmh/blobdiff - sbr/folder_read.c
uip/folder.c: Rewrite plural test to common form.
[nmh] / sbr / folder_read.c
index 0d0129320158fcf21c808c466bb7c79a0fa8bc74..eab1e1f4bb5a89a9a563c97ad2a1a88b504017ef 100644 (file)
@@ -1,11 +1,12 @@
-
-/*
- * folder_read.c -- initialize folder structure and read folder
+/* folder_read.c -- initialize folder structure and read folder
  *
  *
- * $Id$
+ * This code is Copyright (c) 2002, by the authors of nmh.  See the
+ * COPYRIGHT file in the root directory of the nmh distribution for
+ * complete copyright information.
  */
 
 #include <h/mh.h>
  */
 
 #include <h/mh.h>
+#include <h/utils.h>
 
 /* We allocate the `mi' array 1024 elements at a time */
 #define        NUMMSGS  1024
 
 /* We allocate the `mi' array 1024 elements at a time */
 #define        NUMMSGS  1024
  */
 
 struct msgs *
  */
 
 struct msgs *
-folder_read (char *name)
+folder_read (char *name, int lockflag)
 {
 {
-    int msgnum, prefix_len, len, *mi;
+    int msgnum, len, *mi;
     struct msgs *mp;
     struct msgs *mp;
-    struct stat st;
     struct dirent *dp;
     DIR *dd;
     struct dirent *dp;
     DIR *dd;
+    struct bvector *v;
+    size_t i;
 
     name = m_mailpath (name);
     if (!(dd = opendir (name))) {
 
     name = m_mailpath (name);
     if (!(dd = opendir (name))) {
@@ -34,15 +36,8 @@ folder_read (char *name)
        return NULL;
     }
 
        return NULL;
     }
 
-    if (stat (name, &st) == -1) {
-       free (name);
-       return NULL;
-    }
-
     /* Allocate the main structure for folder information */
     /* Allocate the main structure for folder information */
-    if (!(mp = (struct msgs *) malloc ((size_t) sizeof(*mp))))
-       adios (NULL, "unable to allocate folder storage");
-
+    NEW(mp);
     clear_folder_flags (mp);
     mp->foldpath = name;
     mp->lowmsg = 0;
     clear_folder_flags (mp);
     mp->foldpath = name;
     mp->lowmsg = 0;
@@ -52,31 +47,28 @@ folder_read (char *name)
     mp->hghsel = 0;
     mp->numsel = 0;
     mp->nummsg = 0;
     mp->hghsel = 0;
     mp->numsel = 0;
     mp->nummsg = 0;
+    mp->seqhandle = NULL;
+    mp->seqname = NULL;
 
 
-    if (access (name, W_OK) == -1 || st.st_uid != getuid())
+    if (access (name, W_OK) == -1)
        set_readonly (mp);
        set_readonly (mp);
-    prefix_len = strlen(BACKUP_PREFIX);
 
     /*
      * Allocate a temporary place to record the
      * name of the messages in this folder.
      */
     len = NUMMSGS;
 
     /*
      * Allocate a temporary place to record the
      * name of the messages in this folder.
      */
     len = NUMMSGS;
-    if (!(mi = (int *) malloc ((size_t) (len * sizeof(*mi)))))
-       adios (NULL, "unable to allocate storage");
+    mi = (int *) mh_xmalloc ((size_t) (len * sizeof(*mi)));
 
     while ((dp = readdir (dd))) {
 
     while ((dp = readdir (dd))) {
-       if ((msgnum = m_atoi (dp->d_name))) {
+       if ((msgnum = m_atoi (dp->d_name)) && msgnum > 0) {
            /*
             * Check if we need to allocate more
             * temporary elements for message names.
             */
            if (mp->nummsg >= len) {
                len += NUMMSGS;
            /*
             * Check if we need to allocate more
             * temporary elements for message names.
             */
            if (mp->nummsg >= len) {
                len += NUMMSGS;
-               if (!(mi = (int *) realloc (mi,
-                       (size_t) (len * sizeof(*mi))))) {
-                   adios (NULL, "unable to allocate storage");
-               }
+               mi = (int *) mh_xrealloc (mi, (size_t) (len * sizeof(*mi)));
            }
 
            /* Check if this is the first message we've seen */
            }
 
            /* Check if this is the first message we've seen */
@@ -101,14 +93,11 @@ folder_read (char *name)
            switch (dp->d_name[0]) {
                case '.': 
                case ',': 
            switch (dp->d_name[0]) {
                case '.': 
                case ',': 
-#ifdef MHE
-               case '+': 
-#endif /* MHE */
                    continue;
 
                default: 
                    /* skip any files beginning with backup prefix */
                    continue;
 
                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 */
@@ -132,17 +121,25 @@ folder_read (char *name)
     /* mp->hghoff = max (mp->hghmsg, 1); */
 
     /*
     /* mp->hghoff = max (mp->hghmsg, 1); */
 
     /*
-     * Allocate space for status of each message.
+     * If for some reason hghoff < lowoff (like we got an integer overflow)
+     * the complain about this now.
      */
      */
-    if (!(mp->msgstats = malloc (MSGSTATSIZE(mp, mp->lowoff, mp->hghoff))))
-       adios (NULL, "unable to allocate storage for msgstats");
+
+    if (mp->hghoff < mp->lowoff) {
+       adios(NULL, "Internal failure: high message limit < low message "
+             "limit; possible overflow?");
+    }
 
     /*
 
     /*
-     * Clear all the flag bits for all the message
-     * status entries we just allocated.
+     * Allocate space for status of each message.
      */
      */
-    for (msgnum = mp->lowoff; msgnum <= mp->hghoff; msgnum++)
-       clear_msg_flags (mp, msgnum);
+    mp->num_msgstats = MSGSTATNUM (mp->lowoff, mp->hghoff);
+    mp->msgstats = mh_xmalloc (MSGSTATSIZE(mp));
+    for (i = 0, v = mp->msgstats; i < mp->num_msgstats; ++i, ++v) {
+        bvector_init(v);
+    }
+
+    mp->msgattrs = svector_create (0);
 
     /*
      * Scan through the array of messages we've seen and
 
     /*
      * Scan through the array of messages we've seen and
@@ -157,7 +154,15 @@ folder_read (char *name)
     /*
      * Read and initialize the sequence information.
      */
     /*
      * Read and initialize the sequence information.
      */
-    seq_read (mp);
+    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;
 }