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

📄 spost.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
#ifndef lintstatic char sccsid[] = "@(#)spost.c	1.6 (Berkeley) 11/2/85";#endif#ifndef	lintstatic char ident[] = "@(#)$Id: spost.c,v 1.8 1992/12/15 00:20:22 jromine 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"#ifdef LOCALE#include	<locale.h>#endifextern char *getfullname (), *getusr ();extern char *sendmail;#define	uptolow(c)	((isalpha(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, 0};/*  */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, 0,    "Received", HBAD, 0,    "Reply-To", HADR | HNGR, 0,    "From", HADR | HNGR, MFRM,    "Sender", HADR | HBAD, 0,    "Date", HNOP, MDAT,    "Subject", HSUB, 0,    "To", HADR | HTRY, MVIS,    "cc", HADR | HTRY, MVIS,    "Bcc", HADR | HTRY | HBCC | HNIL, MINV,    "Message-Id", HBAD, 0,    "Fcc", HFCC, 0,    NULL};static struct headers  RHeaders[] = {    "Resent-Reply-To", HADR | HNGR, 0,    "Resent-From", HADR | HNGR, MRFM,    "Resent-Sender", HADR | HBAD, 0,    "Resent-Date", HNOP, MRDT,    "Resent-Subject", HSUB, 0,    "Resent-To", HADR | HTRY, MVIS,    "Resent-cc", HADR | HTRY, MVIS,    "Resent-Bcc", HADR | HTRY | HBCC, MINV,    "Resent-Message-Id", HBAD, 0,    "Resent-Fcc", HFCC, 0,    "Reply-To", HADR, 0,    "Fcc", HIGN, 0,    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;#ifdef LOCALE	setlocale(LC_ALL, "");#endif    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);

⌨️ 快捷键说明

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