Fix spelling and encoding errors in manpages and an error message
[mmh] / sbr / folder_read.c
index 222b490..722ee2f 100644 (file)
@@ -6,8 +6,11 @@
 ** complete copyright information.
 */
 
+#include <unistd.h>
 #include <h/mh.h>
 #include <h/utils.h>
+#include <dirent.h>
+#include <sys/stat.h>
 
 /* We allocate the `mi' array 1024 elements at a time */
 #define NUMMSGS  1024
 struct msgs *
 folder_read(char *name)
 {
-       int msgnum, prefix_len, len, *mi;
+       int msgnum, len, *mi;
        struct msgs *mp;
        struct stat st;
        struct dirent *dp;
        DIR *dd;
 
-       name = m_mailpath(name);
+       name = mh_xstrdup(toabsdir(name));
        if (!(dd = opendir(name))) {
-               free(name);
+               mh_free0(&name);
                return NULL;
        }
 
        if (stat(name, &st) == -1) {
-               free(name);
+               mh_free0(&name);
+               closedir(dd);
                return NULL;
        }
 
        /* Allocate the main structure for folder information */
-       mp = (struct msgs *) mh_xmalloc((size_t) sizeof(*mp));
+       mp = mh_xcalloc(1, sizeof(*mp));
 
        clear_folder_flags(mp);
        mp->foldpath = name;
@@ -56,14 +60,13 @@ folder_read(char *name)
 
        if (access(name, W_OK) == -1)
                set_readonly(mp);
-       prefix_len = strlen(backup_prefix);
 
        /*
        ** Allocate a temporary place to record the
        ** name of the messages in this folder.
        */
        len = NUMMSGS;
-       mi = (int *) mh_xmalloc((size_t) (len * sizeof(*mi)));
+       mi = mh_xcalloc(len, sizeof(*mi));
 
        while ((dp = readdir(dd))) {
                if ((msgnum = m_atoi(dp->d_name)) && msgnum > 0) {
@@ -73,7 +76,7 @@ folder_read(char *name)
                        */
                        if (mp->nummsg >= len) {
                                len += NUMMSGS;
-                               mi = (int *) mh_xrealloc(mi, (size_t) (len * sizeof(*mi)));
+                               mi = mh_xrealloc(mi, len * sizeof(*mi));
                        }
 
                        /* Check if this is the first message we've seen */
@@ -86,9 +89,9 @@ folder_read(char *name)
                                ** lowest we've seen?
                                */
                                if (msgnum < mp->lowmsg)
-                                  mp->lowmsg = msgnum;
+                                       mp->lowmsg = msgnum;
                                if (msgnum > mp->hghmsg)
-                                  mp->hghmsg = msgnum;
+                                       mp->hghmsg = msgnum;
                        }
 
                        /*
@@ -99,31 +102,17 @@ folder_read(char *name)
 
                } else {
                        switch (dp->d_name[0]) {
-                               case '.':
-                               case ',':
-#ifdef MHE
-                               case '+':
-#endif /* MHE */
-                                       continue;
-
-                               default:
-                                       /*
-                                       ** skip any files beginning with
-                                       ** backup prefix
-                                       */
-                                       if (!strncmp(dp->d_name, backup_prefix, prefix_len))
-                                               continue;
-
-                                       /* skip the altmsg link file */
-                                       if (!strcmp(dp->d_name, altmsglink))
-                                               continue;
-
-                                       /*
-                                       ** indicate that there are other
-                                       ** files in folder
-                                       */
-                                       set_other_files(mp);
-                                       continue;
+                       case '.':
+                       case ',':
+                               continue;
+
+                       default:
+                               /*
+                               ** indicate that there are other
+                               ** files in folder
+                               */
+                               set_other_files(mp);
+                               continue;
                        }
                }
        }
@@ -137,14 +126,14 @@ folder_read(char *name)
        /* for testing, allocate minimal necessary space */
        /* mp->hghoff = max(mp->hghmsg, 1); */
 
-       /*
-       ** Allocate space for status of each message.
-       */
-       mp->msgstats = mh_xmalloc(MSGSTATSIZE(mp, mp->lowoff, mp->hghoff));
+       /* Allocate space for status of each message. */
+
+       mp->msgstats = mh_xcalloc(MSGSTATSIZE(mp, mp->lowoff, mp->hghoff), 1);
 
        /*
        ** Clear all the flag bits for all the message
        ** status entries we just allocated.
+       ** TODO: use memset() ?
        */
        for (msgnum = mp->lowoff; msgnum <= mp->hghoff; msgnum++)
                clear_msg_flags(mp, msgnum);
@@ -157,7 +146,7 @@ folder_read(char *name)
        for (msgnum = 0; msgnum < mp->nummsg; msgnum++)
                set_exists(mp, mi[msgnum]);
 
-       free(mi);  /* We don't need this anymore */
+       mh_free0(&mi);  /* We don't need this anymore */
 
        /*
        ** Read and initialize the sequence information.