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

📄 post.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
📖 第 1 页 / 共 5 页
字号:
			adios (NULLCP, "missing argument to %s", argp[-2]);#endif		    continue;	    }	if (msg)	    adios (NULLCP, "only one message at a time!");	else	    msg = cp;    }    (void) alias (AliasFile);#ifdef	WP    do_wp++;#endif/*  */    if (!msg)	adios (NULLCP, "usage: %s [switches] file", invo_name);    if (outputlinelen < 10)	adios (NULLCP, "impossible width %d", outputlinelen);#ifdef	MHMTS    if (access (msg, 04) == NOTOK)	adios (msg, "unable to read");#endif	MHMTS    if ((in = fopen (msg, "r")) == NULL)	adios (msg, "unable to open");#ifdef X400/* PJS: Munge the Message-ID header so that it is permissible to include * one in a notification request. * Also, switch off any request for message-id generation. */    if (note > 0) {    int i;	for (i=0; i < sizeof(NHeaders) / sizeof(NHeaders[0]); i++)	    if (uleq(NHeaders[i].value, "Message-ID"))		NHeaders[i].flags = HNIL;	msgid = 0;    }#endif X400    start_headers ();    if (debug) {	verbose++;	discard (out = stdout);	/* XXX: reference discard() to help loader */#ifdef	MHMTS	if (deliver) {	    (void) strcpy (tmpfil, msg);	    putfmt ("To", deliver, out);	    goto daemon;	}#endif	MHMTS    }    else#ifdef	MHMTS    if (deliver) {	if ((out = fopen ("/dev/null", "r")) == NULL)	    adios ("/dev/null", "unable to write");	(void) strcpy (tmpfil, msg);	putfmt ("To", deliver, out);	goto daemon;    }    else#endif	MHMTS	if (whomsw) {	    if ((out = fopen (fill_in ? fill_in : "/dev/null", "w")) == NULL)		adios ("/dev/null", "unable to open");	}	else {	    (void) strcpy (tmpfil, m_scratch ("", m_maildir (invo_name)));	    if ((out = fopen (tmpfil, "w")) == NULL) {		(void) strcpy (tmpfil, m_tmpfil (invo_name));		if ((out = fopen (tmpfil, "w")) == NULL)		    adios (tmpfil, "unable to create");	    }#ifdef	MHMTS	    (void) chown (tmpfil, myuid, mygid);#endif	MHMTS	    (void) chmod (tmpfil, 0600);	}/*  */    hdrtab = msgstate == NORMAL ? NHeaders : RHeaders;    for (compnum = 1, state = FLD;;) {	switch (state = m_getfld (state, name, buf, sizeof buf, in)) {	    case FLD: 	    case FLDEOF: 	    case FLDPLUS: 		compnum++;		cp = add (buf, NULLCP);		while (state == FLDPLUS) {		    state = m_getfld (state, name, buf, sizeof buf, in);		    cp = add (buf, cp);		}		putfmt (name, cp, out);		free (cp);		if (state != FLDEOF)		    continue;		finish_headers (out);		break;	    case BODY: 	    case BODYEOF: 		finish_headers (out);		if (whomsw && !fill_in)		    break;		fprintf (out, "\n%s", buf);		while (state == BODY) {		    state = m_getfld (state, name, buf, sizeof buf, in);		    fputs (buf, out);		}		break;	    case FILEEOF: 		finish_headers (out);		break;	    case LENERR: 	    case FMTERR: 		adios (NULLCP, "message format error in component #%d",			compnum);	    default: 		adios (NULLCP, "getfld() returned %d", state);	}	break;    }/*  */#ifdef	MHMTSdaemon: ;#endif	MHMTS    if (pfd != NOTOK)	anno ();    (void) fclose (in);    if (debug) {	pl ();	done (0);    }    else	(void) fclose (out);#ifdef	TMA    if (encryptsw)	tmastart (tmasnoop);#endif	TMA    if (whomsw) {	verify_all_addresses (1);	done (0);    }#ifdef	MMDFMTS    (void) strcat (submitopts, submitmode);    if (watch)	(void) strcat (submitopts, "nw");#endif	MMDFMTS#ifdef	MHMTS    verify_all_addresses (0);#endif	MHMTS    if (encryptsw)	verify_all_addresses (verbose);    if (msgflags & MINV) {	make_bcc_file ();	if (msgflags & MVIS) {#ifndef	MHMTS	    if (!encryptsw)		verify_all_addresses (verbose);#endif	not MHMTS	    post (tmpfil, 0, verbose);	}	post (bccfil, 1, verbose);	(void) unlink (bccfil);    }    else	post (tmpfil, 0, isatty (1));#ifdef	TMA    if (encryptsw)	tmastop ();#endif	TMA    p_refile (tmpfil);#ifdef	MHMTS    if (!deliver)#endif	MHMTS	(void) unlink (tmpfil);    if (verbose)	printf ("Message Processed\n");    done (0);}/*    DRAFT GENERATION */static putfmt (name, str, out)register char   *name,		*str;register FILE *out;{    int     count,            grp,            i,            keep;    register char  *cp,                   *pp,                   *qp;    char    namep[BUFSIZ];    register struct mailname   *mp,                               *np;    register struct headers *hdr;    while (*str == ' ' || *str == '\t')	str++;    if (msgstate == NORMAL && uprf (name, "resent")) {	advise (NULLCP, "illegal header line -- %s:", name);	badmsg++;	return;    }    if ((i = get_header (name, hdrtab)) == NOTOK) {	fprintf (out, "%s: %s", name, str);	return;    }    hdr = &hdrtab[i];    if (hdr -> flags & HIGN) {	if (fill_in)	    fprintf (out, "%s: %s", name, str);	return;    }    if (hdr -> flags & HBAD) {	if (fill_in)	    fprintf (out, "%s: %s", name, str);	else {	    advise (NULLCP, "illegal header line -- %s:", name);	    badmsg++;	}	return;    }    msgflags |= (hdr -> set & ~(MVIS | MINV));#ifdef X400    if (hdr -> flags & HXMTS) {       /* If X-Mts field set, make sure it's  */        mtsval = get_mts_val (str);   /* valid. Store the value in msgxmts   */        if (mtsval != NONEMTS && resent_mts == NONEMTS) {  /* if there isn't */            msgxmts = mtsval;                              /* Resent-XMts.   */            mts_arg = msgxmts;        }        return;    }    if (hdr -> flags & HRMTS) {      /* If Resent-XMts field set, make sure   */        mtsval = get_mts_val (str);  /* it's valid. Store value in resent_mts */        if (mtsval != NONEMTS) {     /* and mts_arg.                          */            resent_mts = mtsval;            mts_arg = resent_mts;        }        return;    }#endif X400    if (hdr -> flags & HSUB)	subject = subject ? add (str, add ("\t", subject)) : getcpy (str);    if (hdr -> flags & HFCC) {	if (fill_in) {	    fprintf (out, "%s: %s", name, str);	    return;	}	if (cp = rindex (str, '\n'))	    *cp = NULL;	for (cp = pp = str; cp = index (pp, ','); pp = cp) {	    *cp++ = NULL;	    insert_fcc (hdr, pp);	}	insert_fcc (hdr, pp);	return;    }/*  */    if (!(hdr -> flags & HADR)) {	fprintf (out, "%s: %s", name, str);	return;    }    tmpaddrs.m_next = NULL;    for (count = 0; cp = getname (str); count++)	if (mp = getm (cp, NULLCP, 0, AD_HOST, NULLCP)) {	    if (tmpaddrs.m_next)		np -> m_next = mp;	    else		tmpaddrs.m_next = mp;	    np = mp;	}	else	    if (hdr -> flags & HTRY)		badadr++;	    else		badmsg++;    if (count < 1) {	if (hdr -> flags & HNIL)	    fprintf (out, "%s: %s", name, str);	else {#ifdef	notdef	    advise (NULLCP, "%s: field requires at least one address", name);	    badmsg++;#endif	notdef	}	return;    }/*  */    nameoutput = linepos = 0;    (void) sprintf (namep, "%s%s",		    !fill_in && (hdr -> flags & HMNG) ? "Original-" : "",		    name);    for (grp = 0, mp = tmpaddrs.m_next; mp; mp = np)	if (mp -> m_nohost) {	/* also used to test (hdr -> flags & HTRY) */	    pp = akvalue (mp -> m_mbox);	    qp = akvisible () ? mp -> m_mbox : "";	    np = mp;/* PJS: * If this address did not expand into an alias, then we should still be * using the m_text part of the address, rather than the m_mbox. */	    if (strcmp(pp, mp -> m_mbox) == 0)		pp = mp->m_text;	    if (np -> m_gname)		putgrp (namep, np -> m_gname, out, hdr -> flags);	    while (cp = getname (pp)) {		if (!(mp = getm (cp, NULLCP, 0, AD_HOST, NULLCP))) {		    badadr++;		    continue;		}		if (hdr -> flags & HBCC)		    mp -> m_bcc++;		if (mp -> m_ingrp = np -> m_ingrp)		    grp++;#ifdef	MHMTS		mp -> m_aka = getcpy (np -> m_mbox);#endif	MHMTS		if (putadr (namep, qp, mp, out, hdr -> flags))		    msgflags |= (hdr -> set & (MVIS | MINV));		else		    mnfree (mp);	    }	    mp = np;	    np = np -> m_next;	    mnfree (mp);	}	else {	    if (hdr -> flags & HBCC)		mp -> m_bcc++;	    if (mp -> m_gname)		putgrp (namep, mp -> m_gname, out, hdr -> flags);	    if (mp -> m_ingrp)		grp++;	    keep = putadr (namep, "", mp, out, hdr -> flags);	    np = mp -> m_next;	    if (keep) {		mp -> m_next = NULL;		msgflags |= (hdr -> set & (MVIS | MINV));	    }	    else		mnfree (mp);	}    if (grp > 0 && (hdr -> flags & HNGR)) {	advise (NULLCP, "%s: field does not allow groups", name);	badmsg++;    }    if (linepos) {	if (fill_in && grp > 0)	    (void) putc (';', out);	(void) putc ('\n', out);    }}/*  */static  start_headers () {    register char  *cp;    char    myhost[BUFSIZ],            sigbuf[BUFSIZ];    register struct mailname   *mp;    myuid = getuid ();    mygid = getgid ();    (void) time (&clock);    (void) strcpy (from, adrsprintf (NULLCP, NULLCP));    (void) strcpy (myhost, LocalName ());    for (cp = myhost; *cp; cp++)	*cp = uptolow (*cp);#ifdef	MHMTS    if (deliver) {	if (geteuid () == 0 && myuid != 0 && myuid != 1 && mygid != 1)	    adios (NULLCP, "-deliver unknown");	(void) strcpy (signature, from);    }#endif	MHMTS    if ((cp = getfullname ()) && *cp) {	(void) strcpy (sigbuf, cp);	(void) sprintf (signature, "%s <%s>", sigbuf, adrsprintf (NULLCP, NULLCP));	if ((cp = getname (signature)) == NULL)	    adios (NULLCP, "getname () failed -- you lose extraordinarily big");	if ((mp = getm (cp, NULLCP, 0, AD_HOST, NULLCP)) == NULL)	    adios (NULLCP, "bad signature '%s'", sigbuf);	mnfree (mp);	while (getname (""))	    continue;    }    else	(void) strcpy (signature, adrsprintf (NULLCP, NULLCP));}/*  */static finish_headers (out)register FILE *out;{    switch (msgstate) {	case NORMAL: 	    if (whomsw)		break;	    fprintf (out, "Date: %s\n", dtime (&clock));	    if (msgid)		fprintf (out, "Message-ID: <%d.%ld@%s>\n",			getpid (), clock, LocalName ());	    if (msgflags & MFRM)		fprintf (out, "Sender: %s\n", from);	    else		fprintf (out, "From: %s\n", signature);	    if (!(msgflags & MVIS))		fprintf (out, "Bcc: Blind Distribution List: ;\n");#ifdef X400            mtsval = msgxmts;            if (mtsval == NONEMTS)                mtsval = argxmts;            if (mtsval == NONEMTS)                mtsval = DEFMTS;            mts_arg = mtsval;            fprintf (out, "X-Mts: %s\n", mts_vals[mtsval]);#endif X400	    break;	case RESENT: 	    if (!(msgflags & MDAT)) {		advise (NULLCP, "message has no Date: header");		badmsg++;	    }	    if (!(msgflags & MFRM)) {		advise (NULLCP, "message has no From: header");		badmsg++;	    }	    if (whomsw)		break;#ifdef	MMDFI			/* sigh */	    fprintf (out, "Sender: %s\n", from);#endif	MMDFI#ifdef X400            if (msgxmts != NONEMTS)                fprintf (out, "X-Mts: %s\n", mts_vals[msgxmts]);#endif X400	    fprintf (out, "Resent-Date: %s\n", dtime (&clock));	    if (msgid)		fprintf (out, "Resent-Message-ID: <%d.%ld@%s>\n",			getpid (), clock, LocalName ());	    if (msgflags & MRFM)		fprintf (out, "Resent-Sender: %s\n", from);	    else		fprintf (out, "Resent-From: %s\n", signature);	    if (!(msgflags & MVIS))		fprintf (out, "Resent-Bcc: Blind Re-Distribution List: ;\n");#ifdef X400            mtsval = resent_mts;            if (mtsval == NONEMTS)                mtsval = argxmts;            if (mtsval == NONEMTS)                mtsval = DEFMTS;            resent_mts = mtsval;            mts_arg = mtsval;            fprintf (out, "Resent-XMts: %s\n", mts_vals[mtsval]);#endif X400	    break;    }    if (badmsg)	adios (NULLCP, "re-format message and try again");    if (!recipients)	adios (NULLCP, "no addressees");}/*  */static int     get_header (header, table)register char   *header;register struct headers *table;{    register struct headers *h;    for (h = table; h -> value; h++)	if (uleq (header, h -> value))	    return (h - table);    return NOTOK;}/*  */static int     putadr (name, aka, mp, out, flags)register char   *name,		*aka;register struct mailname *mp;register FILE *out;unsigned int    flags;{    int     len;    register char   *cp;    char    buffer[BUFSIZ];    if (mp -> m_mbox == NULL || ((flags & HTRY) && !insert (mp)))	return 0;    if (!fill_in && ((flags & (HBCC|HDCC)) || mp -> m_ingrp))	return 1;    if (!nameoutput) {	fprintf (out, "%s: ", name);	linepos += (nameoutput = strlen (name) + 2);    }    if (*aka && mp -> m_type != UUCPHOST && !mp -> m_pers)	mp -> m_pers = getcpy (aka);    if (format) {	if (mp -> m_gname && !fill_in)	    (void) sprintf (cp = buffer, "%s;", mp -> m_gname);	else	    cp = adrformat (mp);    }    else	cp = mp -> m_text;    len = strlen (cp);    if (linepos != nameoutput)	if (len + linepos + 2 > outputlinelen)	    fprintf (out, ",\n%*s", linepos = nameoutput, "");	else {	    fputs (", ", out);	    linepos += 2;	}    fputs (cp, out);    linepos += len;    return (flags & HTRY);}/*  */static putgrp (name, group, out, flags)register char   *name,		*group;register FILE *out;unsigned int    flags;{

⌨️ 快捷键说明

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