⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mhn.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 5 页
字号:
    }    (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 + -