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

📄 forw.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
📖 第 1 页 / 共 2 页
字号:
		case NOSW: 		    done (0);		case NEWSW: 		    dmsg = NULL;		    goto try_it_again;		case YESW: 		    break;		case LISTDSW: 		    (void) showfile (++argp, drft);		    break;		case REFILSW: 		    if (refile (++argp, drft) == 0)			i = YESW;		    break;		default: 		    advise (NULLCP, "say what?");		    break;	    }	}    }/*  */    if (file) {	anot = 0;	goto go_to_it;    }    if (!msgp)	msgs[msgp++] = "cur";    if (!folder)	folder = m_getfolder ();    maildir = m_maildir (folder);    if (chdir (maildir) == NOTOK)	adios (maildir, "unable to change directory to");    if (!(mp = m_gmsg (folder)))	adios (NULLCP, "unable to read folder %s", folder);    if (mp -> hghmsg == 0)	adios (NULLCP, "no messages in %s", folder);    for (msgnum = 0; msgnum < msgp; msgnum++)	if (!m_convert (mp, msgs[msgnum]))	    done (1);    m_setseq (mp);/*  */go_to_it: ;    if (filter && access (filter, 04) == NOTOK)	adios (filter, "unable to read");    if (digest) {	if (issue == 0) {	    (void) sprintf (buf, IFMT, digest);	    if (volume == 0		    && (cp = m_find (buf))		    && ((issue = atoi (cp)) < 0))		issue = 0;	    issue++;	}	if (volume == 0)	    (void) sprintf (buf, VFMT, digest);	    if ((cp = m_find (buf)) == NULL || (volume = atoi (cp)) <= 0)		volume = 1;	if (!form)	    form = digestcomps;	in = build_form (form, digest, volume, issue);    }    else	if (form) {	    if ((in = open (libpath (form), 0)) == NOTOK)		adios (form, "unable to open form file");	}	else {	    if ((in = open (libpath (forwcomps), 0)) == NOTOK)		adios (forwcomps, "unable to open default components file");	    form = forwcomps;	}    if ((out = creat (drft, m_gmprot ())) == NOTOK)	adios (drft, "unable to create");    cpydata (in, out, form, drft);    (void) close (in);/*  */    if (file) {	if ((in = open (file, 0)) == NOTOK)	    adios (file, "unable to open");	cpydata (in, out, file, drft);	(void) close (in);	(void) close (out);	goto edit_it;    }    if (filter)	mhl_draft (out, digest, volume, issue, drft, filter, dashflg);    else	copy_draft (out, digest, drft, volume, issue);    (void) close (out);    if (digest) {	(void) sprintf (buf, IFMT, digest);	(void) sprintf (value, "%d", issue);	m_replace (buf, getcpy (value));	(void) sprintf (buf, VFMT, digest);	(void) sprintf (value, "%d", volume);	m_replace (buf, getcpy (value));    }    m_replace (pfolder, folder);    if (mp -> lowsel != mp -> curmsg)	m_setcur (mp, mp -> lowsel);    m_sync (mp);    m_update ();edit_it: ;/* PJS: Invoking the template X400 ORname creation utility. */#ifdef X400    if (tmplt > 0) {    int	pid;    static char	*vecp[] = {	"template", "-editor","", "-draft","", (char *)NULL,    };/* If we have no template editor given on the command-line, try to find a * profile entry: if this fails, leave it to 'template' to decide. */	if (ted == (char *)NULL)	    ted = m_find("Template_Editor");/* PJS: Let 'template' default the editor...	if (ted == (char *)NULL)	    ted = getcpy("prompter"); */	if (ted != (char *)NULL)	    vecp[2] = ted;	if (drft != (char *)NULL)	    vecp[4] = drft;	pid = fork();	if (pid == 0) {	/* PJS: Child process: exec the template utility. */	    execv (vecp[0], vecp);	    execvp(vecp[0], vecp);	    fprintf(stderr,"Can't find template utility.\n");	    exit(1);	}	if (pid > 0)	/* PJS: Parent process: wait for template to finish. */	    wait((union wait *)0);    }#endif X400    if (nwhat)	done (0);    (void) m_whatnow (ed, nedit, NOUSE, drft, NULLCP, 0, mp,	anot ? "Forwarded" : NULLCP, inplace, cwd);    done (1);}/*  */static	mhl_draft  (out, digest, volume, issue, file, filter, dashflg)int     out,        volume,        issue,	dashflg;register char   *digest,		*file,		*filter;{    int     i,            child_id,	    msgnum,            pd[2];    char   *vec[MAXARGS];    char    buf1[BUFSIZ];    char    buf2[BUFSIZ];        if (pipe (pd) == NOTOK)	adios ("pipe", "unable to create");    vec[0] = r1bindex (mhlproc, '/');    for (i = 0; (child_id = fork ()) == NOTOK && i < 5; i++)	sleep (5);    switch (child_id) {	case NOTOK: 	    adios ("fork", "unable to");	case OK: 	    (void) close (pd[0]);	    (void) dup2 (pd[1], 1);	    (void) close (pd[1]);	    i = 1;	    vec[i++] = "-forwall";	    vec[i++] = "-form";	    vec[i++] = filter;	    if (digest) {		vec[i++] = "-digest";		vec[i++] = digest;		vec[i++] = "-issue";		sprintf(buf1, "%d", issue); vec[i++] = buf1;		vec[i++] = "-volume";		sprintf(buf2, "%d", volume); vec[i++] = buf2;	    }	    vec[i++] = dashflg ? "-dashmunging" : "-nodashmunging";	    if (mp -> numsel >= MAXARGS - i)		adios (NULLCP, "more than %d messages for %s exec",			vec[0], MAXARGS - i);	    for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)		if (mp -> msgstats[msgnum] & SELECTED)		    vec[i++] = getcpy (m_name (msgnum));	    vec[i] = NULL;	    execvp (mhlproc, vec);	    fprintf (stderr, "unable to exec ");	    perror (mhlproc);	    _exit (-1);	default: 	    (void) close (pd[1]);	    cpydata (pd[0], out, vec[0], file);	    (void) close (pd[0]);	    (void) pidXwait (child_id, mhlproc);	    break;    }}/*  */static	copy_draft (out, digest, file, volume, issue)int     out,        volume,        issue;register char   *digest,		*file;{    int     fd,i,            msgcnt,            msgnum;    register char  *bp,                   *msgnam;    char    buffer[BUFSIZ];    msgcnt = 1;    for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)	if (mp -> msgstats[msgnum] & SELECTED) {	    if (digest)		(void) strcpy (buffer,			msgnum == mp -> lowsel ? delim3 : delim4);	    else {		(void) strcpy (bp = buffer, "\n-------"), bp += strlen (bp);		if (msgnum == mp -> lowsel)		    (void) sprintf (bp, " Forwarded Message%s",			    mp -> numsel > 1 ? "s" : "");		else		    (void) sprintf (bp, " Message %d", msgcnt);		bp += strlen (bp);		(void) strcpy (bp, "\n\n");	    }	    (void) write (out, buffer, strlen (buffer));	    if ((fd = open (msgnam = m_name (msgnum), 0)) == NOTOK) {		admonish (msgnam, "unable to read message");		continue;	    }	    cpydgst (fd, out, msgnam, file);	    (void) close (fd);	    msgcnt++;	}    if (digest)	(void) strcpy (buffer, delim4);    else	(void) sprintf (buffer, "\n------- End of Forwarded Message%s\n\n",		mp -> numsel > 1 ? "s" : "");    (void) write (out, buffer, strlen (buffer));    if (digest) {	(void) sprintf (buffer, "End of %s Digest [Volume %d Issue %d]\n", digest, volume, issue);	i = strlen (buffer);	for (bp = buffer + i; i > 1; i--)	    *bp++ = '*';	*bp++ = '\n';	*bp = NULL;	(void) write (out, buffer, strlen (buffer));    }}/*  */static int  build_form (form, digest, volume, issue)register char  *form,               *digest;int     volume,        issue;{    int	    in;    int     fmtsize;    register char *nfs;    char   *line,            tmpfil[BUFSIZ];    register    FILE *tmp;    register struct comp *cptr;    struct format *fmt;    int     dat[4];    nfs = new_fs (form, NULLCP, NULLCP);    fmtsize = strlen (nfs) + 256;    (void) fmt_compile (nfs, &fmt);    FINDCOMP (cptr, "digest");    if (cptr)	cptr->c_text = digest;    FINDCOMP (cptr, "date");    if (cptr)	cptr->c_text = getcpy(dtimenow ());    dat[0] = issue;    dat[1] = volume;    dat[2] = 0;    dat[3] = fmtsize;    (void) strcpy (tmpfil, m_tmpfil (invo_name));    if ((tmp = fopen (tmpfil, "w+")) == NULL)	adios (tmpfil, "unable to create");    (void) unlink (tmpfil);    if ((in = dup (fileno (tmp))) == NOTOK)	adios ("dup", "unable to");    if ((line = malloc ((unsigned) fmtsize)) == NULLCP)	adios (NULLCP, "unable to allocate format line storage");    (void) fmtscan (fmt, line, fmtsize, dat);    (void) fputs (line, tmp);    (void) free (line);    if (fclose (tmp))	adios (tmpfil, "error writing");    (void) lseek (in, 0L, 0);    return in;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -