📄 post.c
字号:
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 + -