📄 spost.c
字号:
#ifndef lintstatic char sccsid[] = "@(#)spost.c 1.6 (Berkeley) 11/2/85";#endif#ifndef lintstatic char ident[] = "@(#)$Id: spost.c,v 1.2 90/11/25 19:05:57 sharpe Exp $";#endif lint/* spost.c - feed messages to sendmail *//* * (This is a simpler, faster, replacement for "post" for use when "sendmail" * is the transport system) */#include <ctype.h>#include <stdio.h>#include <signal.h>#include "../h/mh.h"#include "../h/addrsbr.h"#include "../h/aliasbr.h"#include "../h/dropsbr.h"#include "../zotnet/tws.h"extern char *getfullname (), *getusr ();extern char *sendmail;#define uptolow(c) (isupper (c) ? tolower (c) : c)#define MAX_SM_FIELD 1476 /* < largest hdr field sendmail will accept */#define FCCS 10 /* max number of fccs allowed *//* */struct swit switches[] = {#define FILTSW 0 "filter filterfile", 0,#define NFILTSW 1 "nofilter", 0,#define FRMTSW 2 "format", 0,#define NFRMTSW 3 "noformat", 0,#define REMVSW 4 "remove", 0,#define NREMVSW 5 "noremove", 0,#define VERBSW 6 "verbose", 0,#define NVERBSW 7 "noverbose", 0,#define WATCSW 8 "watch", 0,#define NWATCSW 9 "nowatch", 0,#define HELPSW 10 "help", 4,#define DEBUGSW 11 "debug", -5,#define DISTSW 12 "dist", -4, /* interface from dist */#define BACKSW 13 "backup", 0,#define NBACKSW 14 "nobackup", 0,#define CHKSW 15 "check", -5, /* interface from whom */#define NCHKSW 16 "nocheck", -7, /* interface from whom */#define WHOMSW 17 "whom", -4, /* interface from whom */#define PUSHSW 18 /* fork to sendmail then exit */ "push", -4,#define NPUSHSW 19 /* exec sendmail */ "nopush", -6,#define ALIASW 20 "alias aliasfile", 0,#define NALIASW 21 "noalias", 0,#define WIDTHSW 22 "width columns", 0,#define LIBSW 23 "library directory", -7,#define ANNOSW 24 "idanno number", -6, NULL, NULL};/* */struct headers { char *value; unsigned int flags;#define HNOP 0x0000 /* just used to keep .set around */#define HBAD 0x0001 /* bad header - don't let it through */#define HADR 0x0002 /* header has an address field */#define HSUB 0x0004 /* Subject: header */#define HTRY 0x0008 /* try to send to addrs on header */#define HBCC 0x0010 /* don't output this header */#define HMNG 0x0020 /* mung this header */#define HNGR 0x0040 /* no groups allowed in this header */#define HFCC 0x0080 /* FCC: type header */#define HNIL 0x0100 /* okay for this header not to have addrs */#define HIGN 0x0200 /* ignore this header */ unsigned int set;#define MFRM 0x0001 /* we've seen a From: */#define MDAT 0x0002 /* we've seen a Date: */#define MRFM 0x0004 /* we've seen a Resent-From: */#define MVIS 0x0008 /* we've seen sighted addrs */#define MINV 0x0010 /* we've seen blind addrs */#define MRDT 0x0020 /* we've seen a Resent-Date: */};/* */static struct headers NHeaders[] = { "Return-Path", HBAD, NULL, "Received", HBAD, NULL, "Reply-To", HADR | HNGR, NULL, "From", HADR | HNGR, MFRM, "Sender", HADR | HBAD, NULL, "Date", HNOP, MDAT, "Subject", HSUB, NULL, "To", HADR | HTRY, MVIS, "cc", HADR | HTRY, MVIS, "Bcc", HADR | HTRY | HBCC | HNIL, MINV, "Message-Id", HBAD, NULL, "Fcc", HFCC, NULL, NULL};static struct headers RHeaders[] = { "Resent-Reply-To", HADR | HNGR, NULL, "Resent-From", HADR | HNGR, MRFM, "Resent-Sender", HADR | HBAD, NULL, "Resent-Date", HNOP, MRDT, "Resent-Subject", HSUB, NULL, "Resent-To", HADR | HTRY, MVIS, "Resent-cc", HADR | HTRY, MVIS, "Resent-Bcc", HADR | HTRY | HBCC, MINV, "Resent-Message-Id", HBAD, NULL, "Resent-Fcc", HFCC, NULL, "Reply-To", HADR, NULL, "Fcc", HIGN, NULL, NULL};/* */static short fccind = 0; /* index into fccfold[] */static int badmsg = 0; /* message has bad semantics */static int verbose = 0; /* spell it out */static int debug = 0; /* debugging post */static int rmflg = 1; /* remove temporary file when done */static int watch = 0; /* watch the delivery process */static int backflg = 0; /* rename input file as *.bak when done */static int whomflg = 0; /* if just checking addresses */static int pushflg = 0; /* if going to fork to sendmail */static int aliasflg = -1; /* if going to process aliases */static int outputlinelen=72;static unsigned msgflags = 0; /* what we've seen */static enum { normal, resent} msgstate = normal;static char tmpfil[] = "/tmp/pstXXXXXX";static char from[BUFSIZ]; /* my network address */static char signature[BUFSIZ]; /* my signature */static char *filter = NULL; /* the filter for BCC'ing */static char *subject = NULL; /* the subject field for BCC'ing */static char *fccfold[FCCS]; /* foldernames for FCC'ing */static struct headers *hdrtab; /* table for the message we're doing */static FILE *out; /* output (temp) file */static putfmt(), start_headers(), finish_headers(), putadr(), insert_fcc();static file(), fcc();static int get_header(), putone();/* MAIN *//* ARGSUSED */main (argc, argv)int argc;char *argv[];{ int state, i, pid, compnum; char *cp, *msg = NULL, **argp = argv + 1, *sargv[16], buf[BUFSIZ], name[NAMESZ], *arguments[MAXARGS]; FILE * in; invo_name = r1bindex (argv[0], '/'); mts_init (invo_name); if ((cp = m_find (invo_name)) != NULL) { argp = copyip (brkstring (cp, " ", "\n"), arguments); (void) copyip (argv+1, argp); argp = arguments; }/* */ while (cp = *argp++) { if (*cp == '-') switch (smatch (++cp, switches)) { case AMBIGSW: ambigsw (cp, switches); done (1); case UNKWNSW: adios (NULLCP, "-%s unknown", cp); case HELPSW: (void)sprintf (buf, "%s [switches] file", invo_name); help (buf, switches); done (1); case DEBUGSW: debug++; continue; case DISTSW: msgstate = resent; continue; case WHOMSW: whomflg++; continue; case FILTSW: if (!(filter = *argp++) || *filter == '-') adios (NULLCP, "missing argument to %s", argp[-2]); continue; case NFILTSW: filter = NULL; continue; case REMVSW: rmflg++; continue; case NREMVSW: rmflg = 0; continue; case BACKSW: backflg++; continue; case NBACKSW: backflg = 0; continue; case VERBSW: verbose++; continue; case NVERBSW: verbose = 0; continue; case WATCSW: watch++; continue; case NWATCSW: watch = 0; continue; case PUSHSW: pushflg++; continue; case NPUSHSW: pushflg = 0; continue; case ALIASW: if (!(cp = *argp++) || *cp == '-') adios (NULLCP, "missing argument to %s", argp[-2]); if (aliasflg < 0) (void) alias (AliasFile);/* load default aka's */ aliasflg = 1; if ((state = alias(cp)) != AK_OK) adios (NULLCP, "aliasing error in file %s - %s", cp, akerror(state) ); continue; case NALIASW: aliasflg = 0; continue; case WIDTHSW: if (!(cp = *argp++) || *cp == '-') adios (NULLCP, "missing argument to %s", argp[-2]); outputlinelen = atoi (cp); if (outputlinelen <= 10) outputlinelen = 72; continue; case LIBSW: case ANNOSW: /* -library & -idanno switch ignored */ if (!(cp = *argp++) || *cp == '-') adios (NULLCP, "missing argument to %s", argp[-2]); continue; } if (msg) adios (NULLCP, "only one message at a time!"); else msg = cp; }/* */ if (aliasflg < 0) (void) alias (AliasFile); /* load default aka's */ if (!msg) adios (NULLCP, "usage: %s [switches] file", invo_name); if ((in = fopen (msg, "r")) == NULL) adios (msg, "unable to open"); start_headers (); if (debug) { verbose++; out = stdout; } else { (void)mktemp (tmpfil); if ((out = fopen (tmpfil, "w")) == NULL) adios (tmpfil, "unable to create"); (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: compnum++; putfmt (name, buf, out); continue; case FLDPLUS: compnum++; cp = add (buf, cp); while (state == FLDPLUS) { state = m_getfld (state, name, buf, sizeof buf, in); cp = add (buf, cp); } putfmt (name, cp, out); free (cp); continue; case BODY: finish_headers (out); fprintf (out, "\n%s", buf); if(whomflg == 0) 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; }/* */ (void)fclose (in); if (backflg && !whomflg) { (void) strcpy (buf, m_backup (msg)); if (rename (msg, buf) == NOTOK) advise (buf, "unable to rename %s to", msg); } if (debug) { done (0); } else (void)fclose (out); file (tmpfil); /* * re-open the temp file, unlink it and exec sendmail, giving it * the msg temp file as std in. */ if ( freopen( tmpfil, "r", stdin) == NULL) adios (tmpfil, "can't reopen for sendmail"); if (rmflg) (void)unlink (tmpfil); argp = sargv; *argp++ = "send-mail"; *argp++ = "-m"; /* send to me too */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -