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

📄 mts.c

📁 早期freebsd实现
💻 C
字号:
/* mts.c - definitions for the mail transport system */#ifndef	lintstatic char ident[] = "@(#)$Id: mts.c,v 2.20 1994/03/23 23:35:23 jromine Exp $";#endif /* lint *//* LINTLIBRARY */#undef	NETWORK#if	defined(BSD41A) || defined(BSD42) || defined(SOCKETS)#define	NETWORK#endif#include "../h/strings.h"#include <ctype.h>#include <stdio.h>#include "mts.h"#ifdef	NETWORK#if	defined(BSD42) || defined(SOCKETS)#include <netdb.h>#endif#else	/* NETWORK */#ifndef SYS5#include <whoami.h>#else#include <sys/utsname.h>#endif /* SYS5 */#endif /* NETWORK */#include <pwd.h>#define	NOTOK	(-1)#define	OK	0#define	NULLCP	((char *) 0)extern int  errno;static char   *tailor_value ();#if defined(SYS5) && !defined(_AIX)#define	index	strchr#define	rindex	strrchr#endif /* SYS5 */#if !defined(__STDC__) && !defined(_AIX) && !defined(_POSIX_SOURCE)char   *index (), *malloc (), *mktemp (), *rindex (), *strcpy ();#ifdef	SYS5struct passwd  *getpwuid ();#endif#endif /* !__STDC__ *//*  *//*   *mmdfldir and *uucpldir are the maildrop directories.  If maildrops   are kept in the user's home directory, then these should be empty   strings.  In this case, the appropriate ...lfil array should contain   the name of the file in the user's home directory.  Usually, this is   something like ".mail". */static char *mtstailor = "/usr/contrib/mh-6.8/lib/mtstailor";static char    *localname = "";static char    *localdomain = "";static char    *systemname = "";#ifdef	MFstatic char    *UUCPchan = "";#endif /* MF */char    *mmdfldir = "/var/mail";char    *mmdflfil = "";char    *uucpldir = "/usr/spool/mail";char    *uucplfil = "";char    *mmdlm1 = "\001\001\001\001\n";char    *mmdlm2 = "\001\001\001\001\n";static int  MMailids = 0;static char *mmailid = "0";#ifdef	MFchar   *umincproc = "/usr/contrib/mh-6.8/lib/uminc";#else /* MF */char   *umincproc = NULL;#endif /* MF */int	lockstyle = LOK_UNIX;static char *lkstyle = "0";char   *lockldir = "";/*  *//* MTS specific variables */#ifdef	MHMTSchar   *Mailqdir = "/usr/spool/netmail";char   *TMailqdir = "/usr/tmp";int     Syscpy = 1;static char *syscpy = "1";char   *Overseer = "root";char   *Mailer = "root";char   *Fromtmp = "/tmp/rml.f.XXXXXX";char   *Msgtmp = "/tmp/rml.m.XXXXXX";char   *Errtmp = "/tmp/rml.e.XXXXXX";int     Tmpmode = 0600;static char *tmpmode = "0600";char   *Okhosts = "/usr/contrib/mh-6.8/lib/Rmail.OkHosts";char   *Okdests = "/usr/contrib/mh-6.8/lib/Rmail.OkDests";#endif /* MHMTS */#ifdef	MMDFMTS#endif /* MMDFMTS */#ifdef	SENDMTSchar   *hostable = "/usr/contrib/mh-6.8/lib/hosts";char   *sendmail = "/usr/lib/sendmail";#endif /* SENDMTS *//* SMTP/POP stuff */char   *clientname = (char *)0;char   *servers = "localhost \01localnet";char   *pophost = "";/* BBoards-specific variables */char   *bb_domain = "";/* POP BBoards-specific variables */#ifdef	BPOPchar    *popbbhost = "";char    *popbbuser = "";char    *popbblist = "/usr/contrib/mh-6.8/lib/hosts.popbb";#endif /* BPOP *//* MailDelivery */char   *maildelivery = "/usr/contrib/mh-6.8/lib/maildelivery";/* Aliasing Facility (doesn't belong here) */int	Everyone = NOTOK;static char *everyone = "-1";char   *NoShell = "";/*  *//* customize the MTS settings for MH by reading /usr/contrib/mh-6.8/lib/mtstailor */static  struct bind {    char   *keyword;    char  **value;}       binds[] = {    "localname", &localname,    "localdomain", &localdomain,    "systemname", &systemname,#ifdef	MF    "uucpchan", &UUCPchan,#endif /* MF */    "mmdfldir", &mmdfldir,    "mmdflfil", &mmdflfil,    "uucpldir", &uucpldir,    "uucplfil", &uucplfil,    "mmdelim1", &mmdlm1,    "mmdelim2", &mmdlm2,    "mmailid", &mmailid,    "umincproc", &umincproc,    "lockstyle", &lkstyle,    "lockldir", &lockldir,#ifdef	MHMTS    "mailqdir", &Mailqdir,    "tmailqdir", &TMailqdir,    "syscpy", &syscpy,    "overseer", &Overseer,    "mailer", &Mailer,    "fromtmp", &Fromtmp,    "msgtmp", &Msgtmp,    "errtmp", &Errtmp,    "tmpmode", &tmpmode,    "okhosts", &Okhosts,    "okdests", &Okdests,#endif /* MHMTS */#ifdef	MMDFMTS#endif /* MMDFMTS */#ifdef	SENDMTS    "hostable", &hostable,    "sendmail", &sendmail,#endif /* SENDMTS */    "clientname",  &clientname,    "servers", &servers,    "pophost", &pophost,    "bbdomain", &bb_domain,#ifdef	BPOP    "popbbhost", &popbbhost,    "popbbuser", &popbbuser,    "popbblist", &popbblist,#endif /* BPOP */#ifdef	NNTP    "nntphost", &popbbhost,#endif /* NNTP */    "maildelivery", &maildelivery,    "everyone", &everyone,    "noshell", &NoShell,    NULL};/*  *//* I'd like to use m_getfld() here, but not all programs loading mts.o may be   MH-style programs... *//* ARGSUSED */mts_init (name)char    *name;{    register char  *bp,                   *cp;    char    buffer[BUFSIZ];    register struct bind   *b;    register    FILE *fp;    static int  inited = 0;    if (inited++ || (fp = fopen (mtstailor, "r")) == NULL)	return;    while (fgets (buffer, sizeof buffer, fp)) {	if ((cp = index (buffer, '\n')) == NULL)	    break;	*cp = 0;	if (*buffer == '#' || *buffer == '\0')	    continue;	if ((bp = index (buffer, ':')) == NULL)	    break;	*bp++ = 0;	while (isspace (*bp))	    *bp++ = 0;	for (b = binds; b -> keyword; b++)	    if (strcmp (buffer, b -> keyword) == 0)		break;	if (b -> keyword && (cp = tailor_value (bp)))	    *b -> value = cp;    }    (void) fclose (fp);    MMailids = atoi (mmailid);    if ((lockstyle = atoi (lkstyle)) < LOK_UNIX || lockstyle > LOK_MMDF)	lockstyle = LOK_UNIX;#ifdef	MHMTS    Syscpy = atoi (syscpy);    (void) sscanf (tmpmode, "0%o", &Tmpmode);#endif /* MHMTS */    Everyone = atoi (everyone);}/*  */#define	QUOTE	'\\'static char *tailor_value (s)register char   *s;{    register int    i,                    r;    register char  *bp;    char    buffer[BUFSIZ];    for (bp = buffer; *s; bp++, s++)	if (*s != QUOTE)	    *bp = *s;	else	    switch (*++s) {#define	grot(y,z) case y: *bp = z; break;		grot ('b', '\b');		grot ('f', '\f');		grot ('n', '\n');		grot ('t', '\t');#undef	grot		case 0: s--;		case QUOTE: 		    *bp = QUOTE;		    break;		default: 		    if (!isdigit (*s)) {			*bp++ = QUOTE;			*bp = *s;		    }		    r = *s != '0' ? 10 : 8;		    for (i = 0; isdigit (*s); s++)			i = i * r + *s - '0';		    s--;		    *bp = toascii (i);		    break;	    }    *bp = 0;    bp = malloc ((unsigned) (strlen (buffer) + 1));    if (bp != NULL)	(void) strcpy (bp, buffer);    return bp;}/*  */char   *LocalName () {#ifdef	BSD41A    char  *myname;#endif /* BSD41A */#if	defined(BSD42) || defined(SOCKETS)    register struct hostent *hp;#endif /* BSD42 or SOCKETS */#if	defined(SYS5) && !defined(NETWORK)    struct utsname name;#endif /* SYS5 and not NETWORK */    static char buffer[BUFSIZ] = "";    if (buffer[0])	return buffer;    mts_init ("mts");    if (*localname)	strcpy (buffer, localname);    else {#ifdef	locname    (void) strcpy (buffer, locname);#else /* not locname */#ifdef	NETWORK#ifdef	BSD41A    myname = "myname";    if (rhost (&myname) == -1)	(void) gethostname (buffer, sizeof buffer);    else {	(void) strcpy (buffer, myname);	free (myname);    }#endif /* BSD41A */#if	defined(BSD42) || defined(SOCKETS)    (void) gethostname (buffer, sizeof buffer);#ifndef	BIND    sethostent (1);#endif    if (hp = gethostbyname (buffer))	(void) strcpy (buffer, hp -> h_name);#endif /* BSD42 or SOCKETS */#else /* not NETWORK */#ifndef	SYS5    (void) strcpy (buffer, SystemName ());#else /* SYS5 */    (void) uname (&name);    (void) strcpy (buffer, name.nodename);#endif /* SYS5 */#endif /* not NETWORK */#endif /* not locname */    }    if (*localdomain) {	strcat (buffer, ".");	strcat (buffer, localdomain);    }    return buffer;}/*  */char *SystemName () {#if	defined(SYS5) && !defined(NETWORK)    struct utsname name;#endif /* SYS5 and not NETWORK */    static char buffer[BUFSIZ] = "";    if (buffer[0])	return buffer;    mts_init ("mts");    if (*systemname)	return strcpy (buffer, systemname);#ifdef	sysname    (void) strcpy (buffer, sysname);#else /* sysname */#if	!defined(SYS5) || defined(NETWORK)    (void) gethostname (buffer, sizeof buffer);#else /* SYS5 and not NETWORK */#ifdef	SYS5    (void) uname (&name);    (void) strcpy (buffer, name.nodename);#endif /* SYS5 */#endif /* SYS5 and not NETWORK */#endif /* sysname */    return buffer;}/*  */char   *UucpChan () {#ifdef	MF    static char buffer[BUFSIZ] = "";#endif /* MF */#ifndef	MF    return NULL;#else /* MF */    if (buffer[0])	return buffer;    mts_init ("mts");    if (*UUCPchan)	return strcpy (buffer, UUCPchan);#ifdef	uucpchan    (void) strcpy (buffer, uucpchan);#else /* uucpchan */    (void) strcpy (buffer, "uucp");#endif /* uucpchan */    return buffer;#endif /* MF */}/*  */#ifdef	ALTOSgethostname (name, len)register char   *name;register int     len;{    register char  *cp;    register FILE  *fp;    if (fp = fopen ("/etc/systemid", "r")) {	if (fgets (name, len, fp)) {	    if (cp = index (name, '\n'))		*cp = 0;	    (void) fclose (fp);	    return OK;	}	(void) fclose (fp);    }    (void) strncpy (name, "altos", len);    return OK;}#endif /* ALTOS *//*  */static char username[BUFSIZ];static char fullname[BUFSIZ];char   *getusr () {    register char  *cp,                   *np;#ifdef KPOP    int uid;#endif /* KPOP */    register struct passwd *pw;    if (username[0])	return username;#ifndef KPOP    if ((pw = getpwuid (getuid ())) == NULL	    || pw -> pw_name == NULL	    || *pw -> pw_name == NULL) {#else /* KPOP */    uid = getuid ();    if (uid == geteuid () && (cp = getenv ("USER")) != NULL	&& (pw = getpwnam (cp)) != NULL)      strcpy (username, cp);    else if ((pw = getpwuid (uid)) == NULL	     || pw -> pw_name == NULL	     || *pw -> pw_name == '\0') {#endif /* KPOP */	(void) strcpy (username, "unknown");	(void) sprintf (fullname, "The Unknown User-ID (%d)", getuid ());	return username;    }    np = pw -> pw_gecos;#ifndef	GCOS_HACK    for (cp = fullname; *np && *np != (MMailids ? '<' : ','); *cp++ = *np++)	continue;#else    for (cp = fullname; *np && *np != (MMailids ? '<' : ','); )	if (*np == '&')	{	/* blech! */	    (void) strcpy(cp, pw -> pw_name);	    *cp = toupper(*cp);	    while (*cp)		cp++;	    np++;	}	else	    *cp++ = *np++;#endif    *cp = '\0';    if (MMailids) {	if (*np)	    np++;	for (cp = username; *np && *np != '>'; *cp++ = *np++)	    continue;	*cp = '\0';    }    if (MMailids == 0 || *np == '\0')	(void) strcpy (username, pw -> pw_name);    if ((cp = getenv ("SIGNATURE")) && *cp)	(void) strcpy (fullname, cp);    if (index(fullname, '.')) {		/*  quote any .'s */	  char tmp[BUFSIZ];      sprintf (tmp, "\"%s\"", fullname);/* should quote "'s too */      strcpy (fullname, tmp);    }    return username;}char   *getfullname () {    if (username[0] == '\0')	(void) getusr ();    return fullname;}/*  */#ifdef	SYS5#ifndef	notdef			/* Supposedly this works, I prefer the				   recursive solution... */#include <fcntl.h>int     dup2 (d1, d2)register int    d1,                d2;{    int     d;    if (d1 == d2)	return OK;    (void) close (d2);    if ((d = fcntl (d1, F_DUPFD, d2)) == NOTOK)	return NOTOK;    if (d == d2)	return OK;    errno = 0;    return NOTOK;}#else /* notdef */int     dup2 (d1, d2)register int    d1,                d2;{    if (d1 == d2)	return OK;    (void) close (d2);    return dup2aux (d1, d2);}static int  dup2aux (d1, d2)register int    d1,                d2;{    int     d,            i,            eindex;    if ((d = dup (d1)) == NOTOK)	return NOTOK;    if (d == d2)	return OK;    i = dup2aux (d1, d2);    eindex = errno;    (void) close (d);    errno = eindex;    return i;}#endif /* notdef */#endif /* SYS5 */

⌨️ 快捷键说明

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