]> diplodocus.org Git - nmh/blobdiff - uip/msh.c
Plugged small memory leak in m_unknown().
[nmh] / uip / msh.c
index f6d1a362b4cc9f2c59125e57957418b549136e4e..7dc15d36fdd639e16ced955eb2507d2cd33129fe 100644 (file)
--- a/uip/msh.c
+++ b/uip/msh.c
@@ -25,7 +25,7 @@
 #include <termios.h>
 
 #include <pwd.h>
-#include <h/m_setjmp.h>
+#include <setjmp.h>
 #include <signal.h>
 #include <h/msh.h>
 #include <h/vmhsbr.h>
@@ -150,12 +150,13 @@ int interrupted;          /* SIGINT detected  */
 int broken_pipe;               /* SIGPIPE detected */
 int told_to_quit;              /* SIGQUIT detected */
 
+extern m_getfld_state_t gstate;
+
 /*
  * prototypes
  */
 void fsetup (char *);
 void setup (char *);
-FILE *msh_ready (int, int);
 void readids (int);
 int readid (int);
 void display_info (int);
@@ -174,7 +175,6 @@ static int read_map (char *, long);
 static int read_file (long, int);
 
 static void m_gMsgs (int);
-FILE *msh_ready (int, int);
 static int check_folder (int);
 static void scanrange (int, int);
 static void scanstring (char *);
@@ -237,10 +237,10 @@ main (int argc, char **argv)
                case HELPSW: 
                    snprintf (buf, sizeof(buf), "%s [switches] file", invo_name);
                    print_help (buf, switches, 1);
-                   done (1);
+                   done (0);
                case VERSIONSW:
                    print_version(invo_name);
-                   done (1);
+                   done (0);
 
                case IDSW: 
                    if (!(cp = *argp++) || *cp == '-')
@@ -344,6 +344,7 @@ main (int argc, char **argv)
 #endif /* SIGTSTP */
     }
 
+    m_getfld_state_init (&gstate);
     if (folder)
        fsetup (folder);
     else
@@ -352,6 +353,7 @@ main (int argc, char **argv)
     display_info (id > 0 ? scansw : 0);
 
     msh (id > 0 ? scansw : 0);
+    m_getfld_state_destroy (&gstate);
 
     m_reset ();
     
@@ -715,7 +717,7 @@ setup (char *file)
     mp->msgattrs[0] = getcpy ("unseen");
     mp->msgattrs[1] = NULL;
 
-    m_unknown (fp);            /* the MAGIC invocation */    
+    m_unknown (gstate, fp);            /* the MAGIC invocation */
     if (fmsh) {
        free (fmsh);
        fmsh = NULL;
@@ -803,10 +805,10 @@ m_gMsgs (int n)
 FILE *
 msh_ready (int msgnum, int full)
 {
-    NMH_UNUSED (full);
     register int msgp;
     int fd;
     char *cp;
+    NMH_UNUSED (full);
 
     if (yp) {
        fclose (yp);
@@ -838,7 +840,7 @@ msh_ready (int msgnum, int full)
        return yp;
     }
 
-    m_eomsbr ((int (*)()) 0);  /* XXX */
+    m_eomsbr (gstate, (int (*)()) 0);  /* XXX */
     fseek (fp, Msgs[msgnum].m_start, SEEK_SET);
     return fp;
 }
@@ -1007,15 +1009,16 @@ readid (int msgnum)
        return Msgs[msgnum].m_bboard_id;
 
     zp = msh_ready (msgnum, 0);
-    for (state = FLD;;)
-       switch (state = m_getfld (state, name, buf, sizeof(buf), zp)) {
+    for (;;) {
+       int bufsz = sizeof buf;
+       switch (state = m_getfld (gstate, name, buf, &bufsz, zp)) {
            case FLD: 
-           case FLDEOF: 
            case FLDPLUS: 
                if (!mh_strcasecmp (name, BBoard_ID)) {
                    bp = getcpy (buf);
                    while (state == FLDPLUS) {
-                       state = m_getfld (state, name, buf, sizeof(buf), zp);
+                       bufsz = sizeof buf;
+                       state = m_getfld (gstate, name, buf, &bufsz, zp);
                        bp = add (buf, bp);
                    }
                    i = atoi (bp);
@@ -1026,13 +1029,14 @@ readid (int msgnum)
                        continue;
                }
                while (state == FLDPLUS)
-                   state = m_getfld (state, name, buf, sizeof(buf), zp);
-               if (state != FLDEOF)
-                   continue;
+                   bufsz = sizeof buf;
+                   state = m_getfld (gstate, name, buf, &bufsz, zp);
+               continue;
 
            default: 
                return 0;
        }
+    }
 }
 
 
@@ -1917,7 +1921,7 @@ pFIN (void)
 {
     int status;
 
-    switch (m_setjmp (peerenv)) {
+    switch (setjmp (peerenv)) {
        case OK: 
            SIGNAL (SIGALRM, alrmser);
            alarm (ALARM);