X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=uip%2Fmsh.c;h=b3aa3a107aec077ce57472d8c129851b197ccdca;hb=a8a488a128a8124503d01da632c7290f6abc0752;hp=41cf5102a9d8f15dabc72c83804dc0f6e3b32cda;hpb=794dab6aa5027ffaf024506140c258f6a0a9322d;p=mmh diff --git a/uip/msh.c b/uip/msh.c index 41cf510..b3aa3a1 100644 --- a/uip/msh.c +++ b/uip/msh.c @@ -2,7 +2,9 @@ /* * msh.c -- The nmh shell * - * $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. */ /* @@ -16,18 +18,11 @@ #include #include #include -#include -#include +#include +#include +#include -#ifdef HAVE_TERMIOS_H -# include -#else -# ifdef HAVE_TERMIO_H -# include -# else -# include -# endif -#endif +#include #include #include @@ -67,7 +62,7 @@ static struct swit switches[] = { #define VERSIONSW 13 { "version", 0 }, #define HELPSW 14 - { "help", 4 }, + { "help", 0 }, { NULL, 0 } }; @@ -115,11 +110,6 @@ static int windows[NWIN + 1]; static jmp_buf peerenv; -#ifdef BPOP -int pmsh = 0; /* BPOP enabled */ -extern char response[]; -#endif /* BPOP */ - /* * PARENT */ @@ -160,19 +150,11 @@ int interrupted; /* SIGINT detected */ int broken_pipe; /* SIGPIPE detected */ int told_to_quit; /* SIGQUIT detected */ -#ifdef BSD42 -int should_intr; /* signal handler should interrupt call */ -jmp_buf sigenv; /* the environment pointer */ -#endif - /* * prototypes */ -int SOprintf (char *, ...); /* from termsbr.c */ -int sc_width (void); /* from termsbr.c */ void fsetup (char *); void setup (char *); -FILE *msh_ready (int, int); void readids (int); int readid (int); void display_info (int); @@ -190,16 +172,7 @@ static void msh (int); static int read_map (char *, long); static int read_file (long, int); -#ifdef BPOP -# ifdef NNTP -static int pop_statmsg (char *); -# endif /* NNTP */ -static int read_pop (void); -static int pop_action (char *); -#endif /* BPOP */ - static void m_gMsgs (int); -FILE *msh_ready (int, int); static int check_folder (int); static void scanrange (int, int); static void scanstring (char *); @@ -213,10 +186,10 @@ static int initaux_io (struct Cmd *); static void fin_io (struct Cmd *, int); static void finaux_io (struct Cmd *); static void m_init (void); -static RETSIGTYPE intrser (int); -static RETSIGTYPE pipeser (int); -static RETSIGTYPE quitser (int); -static RETSIGTYPE alrmser (int); +static void intrser (int); +static void pipeser (int); +static void quitser (int); +static void alrmser (int); static int pINI (void); static int pQRY (char *, int); static int pQRY1 (int); @@ -237,9 +210,6 @@ main (int argc, char **argv) int id = 0, scansw = 0, vmh1 = 0, vmh2 = 0; char *cp, *file = NULL, *folder = NULL; char **argp, **arguments, buf[BUFSIZ]; -#ifdef BPOP - int pmsh1 = 0, pmsh2 = 0; -#endif #ifdef LOCALE setlocale(LC_ALL, ""); @@ -265,10 +235,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 == '-') @@ -321,18 +291,10 @@ main (int argc, char **argv) case PREADSW: if (!(cp = *argp++) || *cp == '-') adios (NULL, "missing argument to %s", argp[-2]); -#ifdef BPOP - if ((pmsh1 = atoi (cp)) < 1) - adios (NULL, "bad argument %s %s", argp[-2], cp); -#endif /* BPOP */ continue; case PWRITSW: if (!(cp = *argp++) || *cp == '-') adios (NULL, "missing argument to %s", argp[-2]); -#ifdef BPOP - if ((pmsh2 = atoi (cp)) < 1) - adios (NULL, "bad argument %s %s", argp[-2], cp); -#endif /* BPOP */ continue; case TCURSW: @@ -346,7 +308,7 @@ main (int argc, char **argv) if (folder) adios (NULL, "only one folder at a time!"); else - folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF); + folder = pluspath (cp); } else if (file) @@ -365,9 +327,6 @@ main (int argc, char **argv) ioctl (pfd, FIOCLEX, NULL); #endif /* FIOCLEX */ -#ifdef BSD42 - should_intr = 0; -#endif /* BSD42 */ istat = SIGNAL2 (SIGINT, intrser); qstat = SIGNAL2 (SIGQUIT, quitser); @@ -383,20 +342,6 @@ main (int argc, char **argv) #endif /* SIGTSTP */ } -#ifdef BPOP - if (pmsh = pmsh1 && pmsh2) { - cp = getenv ("MHPOPDEBUG"); -#ifdef NNTP - if (pop_set (pmsh1, pmsh2, cp && *cp, myname) == NOTOK) -#else /* NNTP */ - if (pop_set (pmsh1, pmsh2, cp && *cp) == NOTOK) -#endif /* NNTP */ - padios (NULL, "%s", response); - if (folder) - file = folder, folder = NULL; - } -#endif /* BPOP */ - if (folder) fsetup (folder); else @@ -408,7 +353,8 @@ main (int argc, char **argv) m_reset (); - return done (0); + done (0); + return 1; } @@ -721,19 +667,6 @@ setup (char *file) { int i, msgp; struct stat st; -#ifdef BPOP - char tmpfil[BUFSIZ]; -#endif - -#ifdef BPOP - if (pmsh) { - strncpy (tmpfil, m_tmpfil (invo_name), sizeof(tmpfil)); - if ((fp = fopen (tmpfil, "w+")) == NULL) - padios (tmpfil, "unable to create"); - unlink (tmpfil); - } - else -#endif /* BPOP */ if ((fp = fopen (file, "r")) == NULL) padios (file, "unable to read"); #ifdef FIOCLEX @@ -754,7 +687,7 @@ setup (char *file) if (!(mp = (struct msgs *) calloc ((size_t) 1, sizeof(*mp)))) padios (NULL, "unable to allocate folder storage"); - if (!(mp->msgstats = calloc ((size_t) 1, msgp + 3))) + if (!(mp->msgstats = calloc ((size_t) msgp + 3, sizeof(*(mp->msgstats))))) padios (NULL, "unable to allocate message status storage"); mp->hghmsg = msgp; @@ -764,41 +697,13 @@ setup (char *file) mp->foldpath = getcpy (myname ? myname : file); clear_folder_flags (mp); -#ifdef BPOP - if (pmsh) - set_readonly (mp); - else { -#endif /* BPOP */ stat (file, &st); if (st.st_uid != getuid () || access (file, W_OK) == NOTOK) set_readonly (mp); -#ifdef BPOP - } -#endif /* BPOP */ mp->lowoff = 1; mp->hghoff = mp->hghmsg + 1; -#ifdef BPOP - if (pmsh) { -#ifndef NNTP - for (i = mp->lowmsg; i <= mp->hghmsg; i++) { - Msgs[i].m_top = i; - clear_msg_flags (mp, i); - set_exists (mp, i); - set_virtual (mp, i); - } -#else /* NNTP */ - for (i = mp->lowmsg; i <= mp->hghmsg; i++) { - if (Msgs[i].m_top) /* set in read_pop() */ - clear_msg_flags (mp, i); - set_exists (mp, i); - set_virtual (mp, i); - } -#endif /* NNTP */ - } - else -#endif /* BPOP */ for (i = mp->lowmsg; i <= mp->hghmsg; i++) { clear_msg_flags (mp, i); set_exists (mp, i); @@ -823,11 +728,6 @@ read_map (char *file, long size) register struct drop *dp, *mp; struct drop *rp; -#ifdef BPOP - if (pmsh) - return read_pop (); -#endif /* BPOP */ - if ((i = map_read (file, size, &rp, 1)) == 0) return 0; @@ -855,11 +755,6 @@ read_file (long pos, int msgp) register struct drop *dp, *mp; struct drop *rp; -#ifdef BPOP - if (pmsh) - return (msgp - 1); -#endif /* BPOP */ - if ((i = mbx_read (fp, pos, &rp, 1)) <= 0) return (msgp - 1); @@ -879,47 +774,6 @@ read_file (long pos, int msgp) } -#ifdef BPOP -#ifdef NNTP -static int pop_base = 0; - -static int -pop_statmsg (char *s) -{ - register int i, n; - - n = (i = atoi (s)) - pop_base; /* s="nnn header-line..." */ - Msgs[n].m_top = Msgs[n].m_bboard_id = i; -} - -#endif /* NNTP */ - -static int -read_pop (void) -{ - int nmsgs, nbytes; - - if (pop_stat (&nmsgs, &nbytes) == NOTOK) - padios (NULL, "%s", response); - - m_gMsgs (nmsgs); - -#ifdef NNTP /* this makes read_pop() do some real work... */ - pop_base = nbytes - 1; /* nmsgs=last-first+1, nbytes=first */ - pop_exists (pop_statmsg); -#endif /* NNTP */ - return nmsgs; -} - - -static int -pop_action (char *s) -{ - fprintf (yp, "%s\n", s); -} -#endif /* BPOP */ - - static void m_gMsgs (int n) { @@ -937,9 +791,7 @@ m_gMsgs (int n) return; nmsgs = nMsgs + n + MAXFOLDER / 2; - Msgs = (struct Msg *) realloc ((char *) Msgs, (size_t) (nmsgs + 2) * sizeof *Msgs); - if (Msgs == NULL) - padios (NULL, "unable to reallocate Msgs structure"); + Msgs = (struct Msg *) mh_xrealloc ((char *) Msgs, (size_t) (nmsgs + 2) * sizeof *Msgs); memset((char *) (Msgs + nMsgs + 2), 0, (size_t) ((nmsgs - nMsgs) * sizeof *Msgs)); nMsgs = nmsgs; @@ -952,10 +804,7 @@ msh_ready (int msgnum, int full) register int msgp; int fd; char *cp; -#ifdef BPOP - char tmpfil[BUFSIZ]; - long pos1, pos2; -#endif + NMH_UNUSED (full); if (yp) { fclose (yp); @@ -987,50 +836,6 @@ msh_ready (int msgnum, int full) return yp; } -#ifdef BPOP - if (pmsh && is_virtual (mp, msgnum)) { - if (Msgs[msgnum].m_top == 0) - padios (NULL, "msh_ready (%d, %d) botch", msgnum, full); - if (!full) { - strncpy (tmpfil, m_tmpfil (invo_name), sizeof(tmpfil)); - if ((yp = fopen (tmpfil, "w+")) == NULL) - padios (tmpfil, "unable to create"); - unlink (tmpfil); - - if (pop_top (Msgs[msgnum].m_top, 4, pop_action) == NOTOK) - padios (NULL, "%s", response); - - m_eomsbr ((int (*)()) 0); /* XXX */ - msg_style = MS_DEFAULT; /* .. */ - fseek (yp, 0L, SEEK_SET); - return yp; - } - - fseek (fp, 0L, SEEK_END); - fwrite (mmdlm1, 1, strlen (mmdlm1), fp); - if (fflush (fp)) - padios ("temporary file", "write error on"); - fseek (fp, 0L, SEEK_END); - pos1 = ftell (fp); - - yp = fp; - if (pop_retr (Msgs[msgnum].m_top, pop_action) == NOTOK) - padios (NULL, "%s", response); - yp = NULL; - - fseek (fp, 0L, SEEK_END); - pos2 = ftell (fp); - fwrite (mmdlm2, 1, strlen (mmdlm2), fp); - if (fflush (fp)) - padios ("temporary file", "write error on"); - - Msgs[msgnum].m_start = pos1; - Msgs[msgnum].m_stop = pos2; - - unset_virtual (mp, msgnum); - } -#endif /* BPOP */ - m_eomsbr ((int (*)()) 0); /* XXX */ fseek (fp, Msgs[msgnum].m_start, SEEK_SET); return fp; @@ -1043,11 +848,6 @@ check_folder (int scansw) int seqnum, i, low, hgh, msgp; struct stat st; -#ifdef BPOP - if (pmsh) - return 0; -#endif /* BPOP */ - if (fmsh) { if (stat (mp->foldpath, &st) == NOTOK) padios (mp->foldpath, "unable to stat"); @@ -1159,7 +959,7 @@ scanstring (char *arg) void readids (int id) { - register int cur, seqnum, i, msgnum; + register int cur, seqnum, i=0, msgnum; if (mp->curmsg == 0) seq_setcur (mp, mp->lowmsg); @@ -1200,21 +1000,9 @@ readid (int msgnum) int i, state; char *bp, buf[BUFSIZ], name[NAMESZ]; register FILE *zp; -#ifdef BPOP - int arg1, arg2, arg3; -#endif if (Msgs[msgnum].m_bboard_id) return Msgs[msgnum].m_bboard_id; -#ifdef BPOP - if (pmsh) { - if (Msgs[msgnum].m_top == 0) - padios (NULL, "readid (%d) botch", msgnum); - if (pop_list (Msgs[msgnum].m_top, (int *) 0, &arg1, &arg2, &arg3) == OK - && arg3 > 0) - return (Msgs[msgnum].m_bboard_id = arg3); - } -#endif /* BPOP */ zp = msh_ready (msgnum, 0); for (state = FLD;;) @@ -1222,7 +1010,7 @@ readid (int msgnum) case FLD: case FLDEOF: case FLDPLUS: - if (!strcasecmp (name, BBoard_ID)) { + if (!mh_strcasecmp (name, BBoard_ID)) { bp = getcpy (buf); while (state == FLDPLUS) { state = m_getfld (state, name, buf, sizeof(buf), zp); @@ -1255,11 +1043,9 @@ display_info (int scansw) if (sp == NULL) { if ((sd = dup (fileno (stdout))) == NOTOK) padios ("standard output", "unable to dup"); -#ifndef BSD42 /* XXX */ #ifdef FIOCLEX ioctl (sd, FIOCLEX, NULL); #endif /* FIOCLEX */ -#endif /* not BSD42 */ if ((sp = fdopen (sd, "w")) == NULL) padios ("standard output", "unable to fdopen"); } @@ -1417,33 +1203,11 @@ getargs (char *prompt, struct swit *sw, struct Cmd *cmdp) told_to_quit = 0; for (;;) { interrupted = 0; -#ifdef BSD42 - switch (setjmp (sigenv)) { - case OK: - should_intr = 1; - break; - - default: - should_intr = 0; - if (interrupted && !told_to_quit) { - putchar ('\n'); - continue; - } - if (ppid > 0) -#ifdef SIGEMT - kill (ppid, SIGEMT); -#else - kill (ppid, SIGTERM); -#endif - return EOF; - } -#endif /* BSD42 */ if (interactive) { printf ("%s", prompt); fflush (stdout); } for (cp = buffer; (i = getchar ()) != '\n';) { -#ifndef BSD42 if (interrupted && !told_to_quit) { buffer[0] = '\0'; putchar ('\n'); @@ -1458,10 +1222,6 @@ getargs (char *prompt, struct swit *sw, struct Cmd *cmdp) #endif return EOF; } -#else /* BSD42 */ - if (i == EOF) - longjmp (sigenv, DONE); -#endif /* BSD42 */ if (cp < &buffer[sizeof buffer - 2]) *cp++ = i; } @@ -1471,7 +1231,7 @@ getargs (char *prompt, struct swit *sw, struct Cmd *cmdp) continue; if (buffer[0] == '?') { printf ("commands:\n"); - print_sw (ALL, sw, ""); + print_sw (ALL, sw, "", stdout); printf ("type CTRL-D or use ``quit'' to leave %s\n", invo_name); continue; @@ -1489,9 +1249,6 @@ getargs (char *prompt, struct swit *sw, struct Cmd *cmdp) cmdp->args[0]); continue; default: -#ifdef BSD42 - should_intr = 0; -#endif /* BSD42 */ return i; } } @@ -1541,7 +1298,8 @@ static int parse (char *buffer, struct Cmd *cmdp) { int argp = 0; - char c, *cp, *pp; + unsigned char c, *cp; + char *pp; cmdp->line[0] = 0; pp = cmdp->args[argp++] = cmdp->line; @@ -1795,12 +1553,6 @@ m_reset (void) write_ids (); folder_free (mp); /* free folder/message structure */ myname = NULL; -#ifdef BPOP - if (pmsh) { - pop_done (); - pmsh = 0; - } -#endif /* BPOP */ } @@ -1824,62 +1576,39 @@ seq_setcur (struct msgs *mp, int msgnum) -static RETSIGTYPE +static void intrser (int i) { -#ifndef RELIABLE_SIGNALS - SIGNAL (SIGINT, intrser); -#endif - + NMH_UNUSED (i); discard (stdout); interrupted++; - -#ifdef BSD42 - if (should_intr) - longjmp (sigenv, NOTOK); -#endif } -static RETSIGTYPE +static void pipeser (int i) { -#ifndef RELIABLE_SIGNALS - SIGNAL (SIGPIPE, pipeser); -#endif - + NMH_UNUSED (i); if (broken_pipe++ == 0) fprintf (stderr, "broken pipe\n"); told_to_quit++; interrupted++; - -#ifdef BSD42 - if (should_intr) - longjmp (sigenv, NOTOK); -#endif } -static RETSIGTYPE +static void quitser (int i) { -#ifndef RELIABLE_SIGNALS - SIGNAL (SIGQUIT, quitser); -#endif - + NMH_UNUSED (i); told_to_quit++; interrupted++; - -#ifdef BSD42 - if (should_intr) - longjmp (sigenv, NOTOK); -#endif } -static RETSIGTYPE +static void alrmser (int i) { + NMH_UNUSED (i); longjmp (peerenv, DONE); } @@ -1888,7 +1617,7 @@ static int pINI (void) { int i, vrsn; - char *bp; + unsigned char *bp; struct record rcs, *rc; rc = &rcs; @@ -1944,6 +1673,7 @@ pINI (void) static int pQRY (char *str, int scansw) { + NMH_UNUSED (str); if (pQRY1 (scansw) == NOTOK || pQRY2 () == NOTOK) return NOTOK; @@ -2137,7 +1867,7 @@ pCMD (char *str, struct swit *sw, struct Cmd *cmdp) case OK: printf ("commands:\n"); - print_sw (ALL, sw, ""); + print_sw (ALL, sw, "", stdout); printf ("type ``quit'' to leave %s\n", invo_name); fflush (stdout); fflush (stderr);