]> diplodocus.org Git - nmh/blobdiff - uip/mhcachesbr.c
lock_file.c: close(2) file descriptor on failure, avoiding leak.
[nmh] / uip / mhcachesbr.c
index e91cc56ee29ecdaacf1c9060d0695e8b193cb9de..b740e231e2e2ad58fc142136c95acbf4286281c1 100644 (file)
@@ -1,6 +1,4 @@
-
-/*
- * mhcachesbr.c -- routines to manipulate the MIME content cache
+/* mhcachesbr.c -- routines to manipulate the MIME content cache
  *
  * This code is Copyright (c) 2002, by the authors of nmh.  See the
  * COPYRIGHT file in the root directory of the nmh distribution for
 #include <h/mhparse.h>
 #include <h/mhcachesbr.h>
 #include <h/utils.h>
+#include "mhmisc.h"
+#include "sbr/lock_file.h"
+#include "sbr/m_mktemp.h"
 
 #ifdef HAVE_SYS_TIME_H
 # include <sys/time.h>
 #endif
 #include <time.h>
 
+#define X(sw, minchars, id) { sw, minchars, id },
+DEFINE_SWITCH_ARRAY(CACHE, caches);
+#undef X
+struct swit *cache_policy = caches;
+
 extern int debugsw;
 
 /* cache policies */
@@ -35,19 +41,6 @@ int wcachesw = CACHE_ASK;
 char *cache_public;
 char *cache_private;
 
-
-/* mhmisc.c */
-int part_ok (CT);
-int type_ok (CT, int);
-void content_error (char *, CT, char *, ...);
-void flush_errors (void);
-
-/*
- * prototypes
- */
-void cache_all_messages (CT *);
-int find_cache (CT, int, int *, char *, char *, int);
-
 /*
  * static prototypes
  */
@@ -94,19 +87,19 @@ cache_content (CT ct)
     CE ce = &ct->c_cefile;
 
     if (!ct->c_id) {
-       advise (NULL, "no %s: field in %s", ID_FIELD, ct->c_file);
+       inform("no %s: field in %s", ID_FIELD, ct->c_file);
        return;
     }
 
     if (!ce) {
-       advise (NULL, "unable to decode %s", ct->c_file);
+       inform("unable to decode %s", ct->c_file);
        return;
     }
 
     if (find_cache (NULL, wcachesw != CACHE_NEVER ? wcachesw : CACHE_ASK,
                    &cachetype, ct->c_id, cachefile, sizeof(cachefile))
            == NOTOK) {
-       advise (NULL, "unable to cache %s's contents", ct->c_file);
+       inform("unable to cache %s's contents", ct->c_file);
        return;
     }
     if (wcachesw != CACHE_NEVER && wcachesw != CACHE_ASK) {
@@ -188,7 +181,7 @@ find_cache (CT ct, int policy, int *writing, char *id,
        case CACHE_PUBLIC:
            if (cache_private
                    && !writing
-                   && find_cache_aux (writing ? 2 : 0, cache_private, id,
+                   && find_cache_aux (0, cache_private, id,
                                       buffer, buflen) == OK) {
                if (access (buffer, R_OK) != NOTOK) {
 got_private:
@@ -368,30 +361,31 @@ static int
 find_cache_aux2 (char *mapfile, char *id, char *mapname, int namelen)
 {
     int        state;
-    char buf[BUFSIZ], name[NAMESZ];
+    char buf[NMH_BUFSIZ], name[NAMESZ];
     FILE *fp;
-    m_getfld_state_t gstate = 0;
+    m_getfld_state_t gstate;
     int failed_to_lock = 0;
 
     if (!(fp = lkfopendata (mapfile, "r", &failed_to_lock)))
        return NOTOK;
 
+    gstate = m_getfld_state_init(fp);
     for (;;) {
        int result;
        char *cp, *dp;
        int bufsz = sizeof buf;
 
-       switch (state = m_getfld (&gstate, name, buf, &bufsz, fp)) {
+       switch (state = m_getfld2(&gstate, name, buf, &bufsz)) {
            case FLD:
            case FLDPLUS:
                strncpy (mapname, name, namelen);
                if (state != FLDPLUS)
                    cp = buf;
                else {
-                   cp = add (buf, NULL);
+                   cp = mh_xstrdup(buf);
                    while (state == FLDPLUS) {
                        bufsz = sizeof buf;
-                       state = m_getfld (&gstate, name, buf, &bufsz, fp);
+                       state = m_getfld2(&gstate, name, buf, &bufsz);
                        cp = add (buf, cp);
                    }
                }