📄 mhn.c
字号:
} (void) sprintf (bp, ")"); bp += strlen (bp); if (userrs) { *bp++ = '\n'; *bp = '\0'; errs = add (buffer, errs); } else advise (NULLCP, "%s", buffer);}static void flush_errors (){ if (errs) { (void) fflush (stdout); fprintf (stderr, "%s", errs); free (errs); errs = NULL; }}/* */static jmp_buf intrenv;/* ARGSUSED */static TYPESIG intrser (i)int i;{#ifdef BSD42 (void) signal (SIGINT, intrser);#endif (void) putchar ('\n'); longjmp (intrenv, DONE);}/* */static int show_content_aux (), show_content_aux2 ();static int show_content (ct, serial, alternate)register CT ct;int serial, alternate;{ register char *cp; char buffer[BUFSIZ]; register CI ci = &ct -> c_ctinfo; (void) sprintf (buffer, "%s-show-%s/%s", invo_name, ci -> ci_type, ci -> ci_subtype); if ((cp = m_find (buffer)) == NULL || *cp == 0) { (void) sprintf (buffer, "%s-show-%s", invo_name, ci -> ci_type); if (((cp = m_find (buffer)) == NULL || *cp == 0) && (cp = ct -> c_showproc) == NULL) { if (!alternate) content_error (NULLCP, ct, "don't know how to display content"); return NOTOK; } } return show_content_aux (ct, serial, alternate, cp, NULLCP);}static int show_content_aux (ct, serial, alternate, cp, cracked)register CT ct;int serial, alternate;register char *cp;char *cracked;{ int fd, xlist, xpause, xstdin, xtty; register char *bp; char *file, buffer[BUFSIZ]; register CI ci = &ct -> c_ctinfo; if (!ct -> c_ceopenfnx) { if (!alternate) content_error (NULLCP, ct, "don't know how to decode content"); return NOTOK; } file = NULL; if ((fd = (*ct -> c_ceopenfnx) (ct, &file)) == NOTOK) return NOTOK; if (ct -> c_showproc && strcmp (ct -> c_showproc, "true") == 0) return (alternate ? DONE : OK); xlist = xpause = xstdin = xtty = 0; if (cracked) { (void) strcpy (buffer, cp); goto got_command; } buffer[0] = '\0'; for (bp = buffer; *cp; cp++) if (*cp == '%') { switch (*++cp) { case 'a': /* additional arguments */ { register char **ap, **ep; char *s = ""; for (ap = ci -> ci_attrs, ep = ci -> ci_values; *ap; ap++, ep++) { (void) sprintf (bp, "%s%s=\"%s\"", s, *ap, *ep); bp += strlen (bp); s = " "; } } break; case 'd': /* content description */ if (ct -> c_descr) { char *s; (void) strcpy (bp, s = trimcpy (ct -> c_descr)); free (s); } break; case 'e': /* exclusive execution */ xtty = 1; break; case 'F': /* %e, %f, and stdin is terminal not content */ xstdin = xtty = 1; /* and fall... */ case 'f': /* filename */ (void) sprintf (bp, "%s", file); break; case 'p': /* pause prior to displaying content */ xpause = pausesw; /* and fall... */ case 'l': /* display listing prior to displaying content */ xlist = !nolist; break; case 's': /* subtype */ (void) strcpy (bp, ci -> ci_subtype); break; case '%': goto raw; default: *bp++ = *--cp; *bp = '\0'; continue; } bp += strlen (bp); } else {raw: ; *bp++ = *cp; *bp = '\0'; } if (ct -> c_termproc) { char term[BUFSIZ]; (void) strcpy (term, buffer); (void) sprintf (buffer, ct -> c_termproc, term); }got_command: ; return show_content_aux2 (ct, serial, alternate, cracked, buffer, fd, xlist, xpause, xstdin, xtty);}static int show_content_aux2 (ct, serial, alternate, cracked, buffer, fd, xlist, xpause, xstdin, xtty)register CT ct;int serial, alternate;char *cracked, *buffer;int fd, xlist, xpause, xstdin, xtty;{ int child_id, i; char *vec[4], exec[BUFSIZ + sizeof "exec "]; register CI ci = &ct -> c_ctinfo; if (debugsw || cracked) { (void) fflush (stdout); fprintf (stderr, "%s msg %s", cracked ? "storing" : "show", ct -> c_file); if (ct -> c_partno) fprintf (stderr, " part %s", ct -> c_partno); if (cracked) fprintf (stderr, " using command (cd %s; %s)\n", cracked, buffer); else fprintf (stderr, " using command %s\n", buffer); } if (xpid < 0 || (xtty && xpid)) { if (xpid < 0) xpid = -xpid; (void) pidcheck (pidwait (xpid, NOTOK)); xpid = 0; } if (xlist) { char prompt[BUFSIZ]; if (ct -> c_ctlistfnx) { if (ct -> c_type == CT_MULTIPART) (void) list_content (ct, -1); else (*ct -> c_ctlistfnx) (ct, -1); if (xpause && SOprintf ("Press <return> to show content...")) printf ("Press <return> to show content..."); } else { register char *pp; pp = prompt; if (ct -> c_descr) { (void) sprintf (pp, "%s (", ct -> c_descr); pp += strlen (pp); } (void) sprintf (pp, "content %s/%s", ci -> ci_type, ci -> ci_subtype); pp += strlen (pp); if (ct -> c_file) { (void) sprintf (pp, " in message %s", ct -> c_file); pp += strlen (pp); if (ct -> c_partno) { (void) sprintf (pp, ", part %s", ct -> c_partno); pp += strlen (pp); } } if (ct -> c_descr) { (void) sprintf (pp, ")"); pp += strlen (pp); } if (!xpause) printf ("%s\n", prompt); else if (SOprintf ("Press <return> to show %s...", prompt)) printf ("Press <return> to show %s...", prompt); } if (xpause) { int intr; TYPESIG (*istat) (); istat = signal (SIGINT, intrser); if ((intr = setjmp (intrenv)) == OK) { (void) fflush (stdout); prompt[0] = 0; (void) read (fileno (stdout), prompt, sizeof prompt); } (void) signal (SIGINT, istat); if (intr != OK) { (void) (*ct -> c_ceclosefnx) (ct); return (alternate ? DONE : NOTOK); } } } (void) sprintf (exec, "exec %s", buffer); vec[0] = "/bin/sh"; vec[1] = "-c"; vec[2] = exec; vec[3] = NULL; (void) fflush (stdout); for (i = 0; (child_id = vfork ()) == NOTOK && i < 5; i++) sleep (5); switch (child_id) { case NOTOK: advise ("fork", "unable to"); (void) (*ct -> c_ceclosefnx) (ct); return NOTOK; case OK: if (cracked) (void) chdir (cracked); if (!xstdin) (void) dup2 (fd, 0); (void) close (fd); (void) execvp ("/bin/sh", vec); fprintf (stderr, "unable to exec "); perror ("/bin/sh"); _exit (-1); /* NOTREACHED */ default: if (!serial) { ct -> c_pid = child_id; if (xtty) xpid = child_id; } else (void) pidcheck (pidXwait (child_id, NULLCP)); if (fd != NOTOK) (void) (*ct -> c_ceclosefnx) (ct); return (alternate ? DONE : OK); }}/* */static int store_content (ct, append)register CT ct;char *append;{ int appending = append && *append; long last, pos; register char *bp, *cp; char *file, buffer[BUFSIZ]; register CI ci = &ct -> c_ctinfo; FILE *fp; if (appending) { (void) strcpy (buffer, append); goto got_filename; } if ((cp = ct -> c_storeproc) == NULL || *cp == 0) { (void) sprintf (buffer, "%s-store-%s/%s", invo_name, ci -> ci_type, ci -> ci_subtype); if ((cp = m_find (buffer)) == NULL || *cp == 0) { (void) sprintf (buffer, "%s-store-%s", invo_name, ci -> ci_type); if ((cp = m_find (buffer)) == NULL || *cp == 0) cp = ct -> c_type == CT_MESSAGE ? "+" : "%m%P.%s"; } } switch (*cp) { case '+': case '@': { char *folder = cp[1] ? path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF) : m_getfolder (); struct msgs *mp = NULL; struct stat st; if (stat (bp = m_mailpath (folder), &st) == NOTOK) { int answer; char *ep; if (errno != ENOENT) { advise (bp, "error on folder"); goto losing_folder; } ep = concat ("Create folder \"", bp, "\"? ", NULLCP); answer = getanswer (ep); free (ep); if (!answer) goto losing_folder; if (!makedir (bp)) { advise (NULLCP, "unable to create folder %s", bp); goto losing_folder; } } if (mp = m_gmsg (folder)) (void) sprintf (buffer, "%s/%d", mp -> foldpath, mp -> hghmsg + 1); else advise (NULLCP, "unable to read folder %s", folder);losing_folder: ; if (cp[1]) free (folder); if (mp) m_fmsg (mp); else return NOTOK; } goto got_filename; case '/': case '|': case '!': bp = buffer; buffer[0] = '\0'; break; default: bp = autosw ? cwd : dir; (void) sprintf (buffer, "%s/", bp[1] ? bp : ""); bp = buffer + strlen (buffer); break; } for (; *cp; cp++) if (*cp == '%') { switch (*++cp) { case 'a': /* additional arguments */ if (buffer[0] != '|' && buffer[0] != '!') { *bp++ = *--cp; *bp = '\0'; continue; } else { register char **ap, **ep; char *s = ""; for (ap = ci -> ci_attrs, ep = ci -> ci_values; *ap; ap++, ep++) { (void) sprintf (bp, "%s%s=\"%s\"", s, *ap, *ep); bp += strlen (bp); s = " "; } } break; case 'm': /* message */ (void) sprintf (bp, "%s", r1bindex (ct -> c_file, '/')); break; case 'P': /* .part */ if (ct -> c_partno) (void) sprintf (bp, ".%s", ct -> c_partno); break; case 'p': /* part */ if (ct -> c_partno) (void) strcpy (bp, ct -> c_partno); break; case 't': /* type */ (void) strcpy (bp, ci -> ci_type); break; case 's': /* subtype */ (void) strcpy (bp, ci -> ci_subtype); break; case '%': goto raw; default: *bp++ = *--cp; *bp = '\0'; continue; } bp += strlen (bp); } else {raw: ; *bp++ = *cp; *bp = '\0'; } if (buffer[0] == '|' || buffer[0] == '!') return show_content_aux (ct, 1, 0, buffer + 1, autosw ? cwd : dir);got_filename: ; ct -> c_storage = add (buffer, NULLCP); (void) fflush (stdout); fprintf (stderr, "storing message %s", ct -> c_file); if (ct -> c_partno) fprintf (stderr, " part %s", ct -> c_partno); fprintf (stderr, " as file %s\n", strncmp (ct -> c_storage, cwd, cwdlen) || ct -> c_storage[cwdlen] != '/' ? ct -> c_storage : ct -> c_storage + cwdlen + 1); if (index (ct -> c_storage, '/') && make_intermediates (ct -> c_storage) == NOTOK) return NOTOK; if (ct -> c_encoding != CE_7BIT) { int cc, fd; if (!ct -> c_ceopenfnx) { advise (NULLCP, "don't know how to decode part %s of message %s", ct -> c_partno, ct -> c_file); return NOTOK; } file = appending || !strcmp (ct -> c_storage, "-") ? NULLCP : ct -> c_storage; if ((fd = (*ct -> c_ceopenfnx) (ct, &file)) == NOTOK) return NOTOK; if (strcmp (file, ct -> c_storage) == 0) { (void) (*ct -> c_ceclosefnx) (ct); return OK; } if (!strcmp (ct -> c_storage, "-")) { int gd; if ((gd = dup (fileno (stdout))) == NOTOK) { advise ("stdout", "unable to dup");losing: ; (void) (*ct -> c_ceclosefnx) (ct); return NOTOK; } if ((fp = fdopen (gd, appending ? "a" : "w")) == NULL) { advise ("stdout", "unable to fdopen (%d, \"%s\") from", gd, appending ? "a" : "w"); (void) close (gd); goto losing; } } else if ((fp = fopen (ct -> c_storage, appending ? "a" : "w")) == NULL) { advise (ct -> c_storage, "unable to fopen for %s", appending ? "appending" : "writing"); goto losing; } if (append && !*append) (void) copy_some_headers (fp, ct); for (;;) { switch (cc = read (fd, buffer, sizeof buffer)) { case NOTOK: advise (file, "error reading content from"); break; case OK: break; default: (void) fwrite (buffer, sizeof *buffer, cc, fp); continue; } break; } (void) (*ct -> c_ceclosefnx) (ct); if (cc != NOTOK && fflush (fp)) advise (ct -> c_storage, "error writing to"); (void) fclose (fp); return (cc != NOTOK ? OK : NOTOK); } if (!ct -> c_fp && (ct -> c_fp = fopen (ct -> c_file, "r")) == NULL) { advise (ct -> c_file, "unable to open for reading"); return NOTOK; } (void) fseek (ct -> c_fp, pos = ct -> c_begin, 0); last = ct -> c_end; if (!strcmp (ct -> c_storage, "-")) { int gd; if ((gd = dup (fileno (stdout))) == NOTOK) { advise ("stdout", "unable to dup"); return NOTOK; } if ((fp = fdopen (gd, appending ? "a" : "w")) == NULL) { advise ("stdout", "unable to fdopen (%d, \"%s\") from", gd, appending ? "a" : "w"); (void) close (gd); return NOTOK; } } else if ((fp = fopen (ct -> c_storage, appending ? "a" : "w")) == NULL) { advise (ct -> c_storage, "unable to fopen for %s", appending ? "appending" : "writing"); return NOTOK; } if (append && !*append) { (void) copy_some_headers (fp, ct); appending = 1; } else appending = 0; while (fgets (buffer, sizeof buffer - 1, ct -> c_fp)) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -