Mercurial > hg > Applications > mh
view conf/config/mts.c @ 16:07f8972434be
fix for Yosemita Clang
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 12 Nov 2014 02:46:27 +0900 |
parents | 441a2190cfae |
children |
line wrap: on
line source
/* mts.c - definitions for the mail transport system */ #ifndef lint static char ident[] = "@(#)$Id: mts.c,v 1.2 2006/12/05 18:17:53 kono 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 <netdb.h> #include <pwd.h> #include <unistd.h> #define NOTOK (-1) #define OK 0 #define NULLCP ((char *) 0) #include <errno.h> 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 SYS5 struct 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 = "@(MHETCPATH)/mtstailor"; static char *localname = ""; static char *localdomain = ""; static char *systemname = ""; #ifdef MF static char *UUCPchan = ""; #endif /* MF */ char *mmdfldir = "@(MHDROPATH)"; char *mmdflfil = "@(MHDROPFIL)"; #ifdef MF char *uucpldir = "/usr/spool/mail"; #else /* MF */ char *uucpldir = ""; #endif /* MF */ 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 MF char *umincproc = "@(MHETCPATH)/uminc"; #else /* MF */ char *umincproc = NULL; #endif /* MF */ int lockstyle = LOK_UNIX; static char *lkstyle = "0"; char *lockldir = ""; /* */ /* MTS specific variables */ #ifdef MHMTS char *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 = "@(MHETCPATH)/Rmail.OkHosts"; char *Okdests = "@(MHETCPATH)/Rmail.OkDests"; #endif /* MHMTS */ #ifdef MMDFMTS #endif /* MMDFMTS */ #ifdef SENDMTS char *hostable = "@(MHETCPATH)/hosts"; char *sendmail = "@(MHSENDMAILPATH)"; #endif /* SENDMTS */ /* SMTP/POP stuff */ char *clientname = (char *)0; char *servers = "localhost \01localnet"; char *pophost = ""; #ifdef MH_PLUS char *rpop_default = ""; #endif /* MH_PLUS */ /* BBoards-specific variables */ char *bb_domain = ""; /* POP BBoards-specific variables */ #if defined(BPOP) || defined(NNTP) char *popbbhost = ""; #endif /* BPOP || NNTP */ #ifdef BPOP char *popbbuser = ""; char *popbblist = "@(MHETCPATH)/hosts.popbb"; #endif /* BPOP */ /* MailDelivery */ char *maildelivery = "@(MHETCPATH)/maildelivery"; /* Aliasing Facility (doesn't belong here) */ int Everyone = NOTOK; static char *everyone = "-1"; char *NoShell = ""; #ifdef MH_PLUS int LocalUser = 0; static char *localuser = "0"; #endif /* MH_PLUS */ /* */ /* customize the MTS settings for MH by reading @(MHETCPATH)/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, #ifdef MH_PLUS "rpop", &rpop_default, #endif /* MH_PLUS */ "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, #ifdef MH_PLUS "localuser", &localuser, #endif /* MH_PLUS */ NULL }; /* */ /* I'd like to use m_getfld() here, but not all programs loading mts.o may be MH-style programs... */ /* ARGSUSED */ void 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); #ifdef MH_PLUS LocalUser = atoi (localuser); #endif /* MH_PLUS */ } /* */ #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; } /* */ struct hostent *mh_gethostbyname(); 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 = mh_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 ALTOS gethostname (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 #ifdef __CYGWIN32__ if ((cp = getenv ("USERNAME")) != NULL && (pw = getpwnam (cp)) != NULL) strcpy (username, cp); else if ((pw = getpwuid (getuid ())) == NULL || pw -> pw_name == NULL || *pw -> pw_name == '\0') { #else /* __CYGWIN32__ */ if ((pw = getpwuid (getuid ())) == NULL || pw -> pw_name == NULL || *pw -> pw_name == '\0') { #endif /* __CYGWIN32__ */ #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) { if (strlen(cp) > BUFSIZ / 4) { fprintf(stderr, "SIGNATURE envariable too long\n"); exit(1); } (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 */ struct hostent * mh_gethostbyname(name) char *name; { struct hostent *xx; #if (defined(SOLARIS) && SOLARIS < 20400) || (defined(sony_news) && defined(__svr4)) # if SOLARIS == 20300 static struct hostent hp; static char buf[1000]; extern struct hostent *_switch_gethostbyname_r(); xx = _switch_gethostbyname_r(name, &hp, buf, sizeof(buf), &h_errno); # else extern struct hostent *__switch_gethostbyname(); xx = __switch_gethostbyname(name); # endif /* Solaris 2.3 */ #else /* SOLARIS */ xx = gethostbyname(name); #endif /* SOLARIS */ return xx; } #ifdef __CYGWIN32__ void sethostent(x) int x; { } #endif