]> diplodocus.org Git - nmh/blobdiff - uip/mhfree.c
lock_file.c: close(2) file descriptor on failure, avoiding leak.
[nmh] / uip / mhfree.c
index 8f4f150fce578b7526bbe97108cea014fd9f4a71..6a827e080beb568f913c88ca92c98ccaf7965f6f 100644 (file)
@@ -1,6 +1,4 @@
-
-/*
- * mhfree.c -- routines to free the data structures used to
+/* mhfree.c -- routines to free the data structures used to
  *          -- represent MIME messages
  *
  * This code is Copyright (c) 2002, by the authors of nmh.  See the
 #include <h/utils.h>
 #include <h/mime.h>
 #include <h/mhparse.h>
+#include "sbr/m_mktemp.h"
+#include "mhfree.h"
 
 /* The list of top-level contents to display */
 CT *cts = NULL;
 
-/*
- * prototypes
- */
-void free_header (CT);
-void free_ctinfo (CT);
-void free_encoding (CT, int);
-void freects_done (int);
-
 /*
  * static prototypes
  */
+static void free_header (CT);
 static void free_text (CT);
 static void free_multi (CT);
 static void free_partial (CT);
@@ -49,9 +42,9 @@ free_content (CT ct)
      */
     free_header (ct);
 
-    mh_xfree(ct->c_partno);
-    mh_xfree(ct->c_vrsn);
-    mh_xfree(ct->c_ctline);
+    free(ct->c_partno);
+    free(ct->c_vrsn);
+    free(ct->c_ctline);
     ct->c_partno = ct->c_vrsn = ct->c_ctline = NULL;
 
     free_ctinfo (ct);
@@ -77,26 +70,28 @@ free_content (CT ct)
            }
            break;
 
-       case CT_TEXT:
+       default:
+           /* Assume that the ct is for text.  mhfixmsg(1) uses it for
+              decoding application content. */
            free_text (ct);
            break;
     }
 
-    mh_xfree(ct->c_showproc);
-    mh_xfree(ct->c_termproc);
-    mh_xfree(ct->c_storeproc);
+    free(ct->c_showproc);
+    free(ct->c_termproc);
+    free(ct->c_storeproc);
     ct->c_showproc = ct->c_termproc = ct->c_storeproc = NULL;
 
-    mh_xfree(ct->c_celine);
+    free(ct->c_celine);
     ct->c_celine = NULL;
 
     /* free structures for content encodings */
     free_encoding (ct, 1);
 
-    mh_xfree(ct->c_id);
-    mh_xfree(ct->c_descr);
-    mh_xfree(ct->c_dispo);
-    mh_xfree(ct->c_dispo_type);
+    free(ct->c_id);
+    free(ct->c_descr);
+    free(ct->c_dispo);
+    free(ct->c_dispo_type);
     ct->c_id = ct->c_descr = ct->c_dispo = ct->c_dispo_type = NULL;
     free_pmlist (&ct->c_dispo_first);
 
@@ -111,14 +106,9 @@ free_content (CT ct)
        ct->c_fp = NULL;
     }
 
-    if (ct->c_storage) {
-       free (ct->c_storage);
-       ct->c_storage = NULL;
-    }
-    if (ct->c_folder) {
-       free (ct->c_folder);
-       ct->c_folder = NULL;
-    }
+    free(ct->c_storage);
+    free(ct->c_folder);
+    ct->c_storage = ct->c_folder = NULL;
 
     free (ct);
 }
@@ -129,7 +119,7 @@ free_content (CT ct)
  * for this content.
  */
 
-void
+static void
 free_header (CT ct)
 {
     HF hp1, hp2;
@@ -156,23 +146,13 @@ free_ctinfo (CT ct)
     CI ci;
 
     ci = &ct->c_ctinfo;
-    if (ci->ci_type) {
-       free (ci->ci_type);
-       ci->ci_type = NULL;
-    }
-    if (ci->ci_subtype) {
-       free (ci->ci_subtype);
-       ci->ci_subtype = NULL;
-    }
+    free(ci->ci_type);
+    free(ci->ci_subtype);
+    ci->ci_type = ci->ci_subtype = NULL;
     free_pmlist(&ci->ci_first_pm);
-    if (ci->ci_comment) {
-       free (ci->ci_comment);
-       ci->ci_comment = NULL;
-    }
-    if (ci->ci_magic) {
-       free (ci->ci_magic);
-       ci->ci_magic = NULL;
-    }
+    free(ci->ci_comment);
+    free(ci->ci_magic);
+    ci->ci_comment = ci->ci_magic = NULL;
 }
 
 
@@ -184,7 +164,7 @@ free_text (CT ct)
     if (!(t = (struct text *) ct->c_ctparams))
        return;
 
-    free ((char *) t);
+    free(t);
     ct->c_ctparams = NULL;
 }
 
@@ -198,21 +178,19 @@ free_multi (CT ct)
     if (!(m = (struct multipart *) ct->c_ctparams))
        return;
 
-    if (m->mp_start)
-       free (m->mp_start);
-    if (m->mp_stop)
-       free (m->mp_stop);
+    free(m->mp_start);
+    free(m->mp_stop);
     free (m->mp_content_before);
     free (m->mp_content_after);
        
     for (part = m->mp_parts; part; part = next) {
        next = part->mp_next;
        free_content (part->mp_part);
-       free ((char *) part);
+       free(part);
     }
     m->mp_parts = NULL;
 
-    free ((char *) m);
+    free(m);
     ct->c_ctparams = NULL;
 }
 
@@ -225,10 +203,9 @@ free_partial (CT ct)
     if (!(p = (struct partial *) ct->c_ctparams))
        return;
 
-    if (p->pm_partid)
-       free (p->pm_partid);
+    free(p->pm_partid);
 
-    free ((char *) p);
+    free(p);
     ct->c_ctparams = NULL;
 }
 
@@ -242,12 +219,9 @@ free_external (CT ct)
        return;
 
     free_content (e->eb_content);
-    if (e->eb_body)
-       free (e->eb_body);
-    if (e->eb_url)
-       free (e->eb_url);
-
-    free ((char *) e);
+    free(e->eb_body);
+    free(e->eb_url);
+    free(e);
     ct->c_ctparams = NULL;
 }
 
@@ -258,14 +232,10 @@ free_pmlist (PM *p)
     PM pm = *p, pm2;
 
     while (pm != NULL) {
-       if (pm->pm_name)
-           free (pm->pm_name);
-       if (pm->pm_value)
-           free (pm->pm_value);
-       if (pm->pm_charset)
-           free (pm->pm_charset);
-       if (pm->pm_lang)
-           free (pm->pm_lang);
+        free(pm->pm_name);
+        free(pm->pm_value);
+        free(pm->pm_charset);
+        free(pm->pm_lang);
        pm2 = pm->pm_next;
        free(pm);
        pm = pm2;
@@ -304,7 +274,7 @@ free_encoding (CT ct, int toplevel)
 }
 
 
-void
+void NORETURN
 freects_done (int status)
 {
     CT *ctp;