Annotation of 40BSD/cmd/delivermail/conf.c, revision 1.1

1.1     ! root        1: # include <stdio.h>
        !             2: # include <pwd.h>
        !             3: # include "dlvrmail.h"
        !             4: 
        !             5: /*
        !             6: **  CONF.C -- Delivermail Configuration Tables.
        !             7: **
        !             8: **     Defines the configuration of this installation.
        !             9: **
        !            10: **     Compilation Flags:
        !            11: **             HASARPA -- set if this machine has a connection to
        !            12: **                     the Arpanet.
        !            13: **             HASUUCP -- set if this machine has a connection to
        !            14: **                     the UUCP network.
        !            15: **             NETV6MAIL -- set if you want to use "v6mail" that
        !            16: **                     comes with the Berkeley network.  Normally
        !            17: **                     /bin/mail will work fine, but around Berkeley
        !            18: **                     we use v6mail because it is a "fixed target".
        !            19: **             V6 -- running on a version 6 system.  This determines
        !            20: **                     whether to define certain routines between
        !            21: **                     the two systems.  If you are running a funny
        !            22: **                     system, e.g., V6 with long tty names, this
        !            23: **                     should be checked carefully.
        !            24: **             DUMBMAIL -- set if your /bin/mail doesn't have the
        !            25: **                     -d flag.
        !            26: **
        !            27: **     Configuration Variables:
        !            28: **             ArpaHost -- the arpanet name of the host through
        !            29: **                     which arpanet mail will be sent.
        !            30: **             MyLocName -- the name of the host on a local network.
        !            31: **                     This is used to disambiguate the contents of
        !            32: **                     ArpaHost among many hosts who may be sharing
        !            33: **                     a gateway.
        !            34: **             ArpaLocal -- a list of local names for this host on
        !            35: **                     the arpanet.  Only functional if HASARPA set.
        !            36: **             UucpLocal -- ditto for the Arpanet.
        !            37: **             BerkLocal -- ditto for the Berknet.
        !            38: **             Mailer -- a table of mailers known to the system.
        !            39: **                     The fields are:
        !            40: **                     - the pathname of the mailer.
        !            41: **                     - a list of flags describing the properties
        !            42: **                       of this mailer:
        !            43: **                        M_FOPT -- if set, the mailer has a picky "-f"
        !            44: **                             option.  In this mode, the mailer will
        !            45: **                             only accept the "-f" option if the
        !            46: **                             sender is actually "root", "network",
        !            47: **                             and possibly (but not necessarily) if
        !            48: **                             the -f argument matches the real sender.
        !            49: **                             The effect is that if the "-f" option
        !            50: **                             is given to delivermail then it will be
        !            51: **                             passed through (as arguments 1 & 2) to
        !            52: **                             the mailer.
        !            53: **                        M_ROPT -- identical to M_FOPT, except uses
        !            54: **                             -r instead.
        !            55: **                        M_QUIET -- if set, don't print a message if
        !            56: **                             the mailer returns bad status.
        !            57: **                        M_RESTR -- if set, this mailer is restricted
        !            58: **                             to use by "daemon"; otherwise, we do a
        !            59: **                             setuid(getuid()) before calling the
        !            60: **                             mailer.
        !            61: **                        M_HDR -- if set, the mailer wants us to
        !            62: **                             insert a UNIX "From" line before
        !            63: **                             outputing.
        !            64: **                        M_NOHOST -- if set, this mailer doesn't care
        !            65: **                             about the host part (e.g., the local
        !            66: **                             mailer).
        !            67: **                        M_STRIPQ -- if set, strip quote (`"')
        !            68: **                             characters out of parameters as you
        !            69: **                             transliterate them into the argument
        !            70: **                             vector.  For example, the local mailer
        !            71: **                             is called directly, so these should be
        !            72: **                             stripped, but the program-mailer (i.e.,
        !            73: **                             csh) should leave them in.
        !            74: **                     - an exit status to use as the code for the
        !            75: **                       error message print if the mailer returns
        !            76: **                       something we don't understand.
        !            77: **                     - A list of names that are to be considered
        !            78: **                       "local" (and hence are stripped off) for
        !            79: **                       this mailer.
        !            80: **                     - An argument vector to be passed to the
        !            81: **                       mailer with the following substitutions:
        !            82: **                        $f - the from person name.
        !            83: **                        $u - the target user name.
        !            84: **                        $h - the target user host.
        !            85: **                        $c - the hop count.
        !            86: **                     >>>>>>>>>> Entry zero must be for the local
        !            87: **                     >> NOTE >> mailer and entry one must be for
        !            88: **                     >>>>>>>>>> the shell.
        !            89: **             ParseTab -- a table driving the parsing process.  Each
        !            90: **                     entry contains:
        !            91: **                     - a character that will trigger this entry.
        !            92: **                     - an index into the Mailer table.
        !            93: **                     - a word of flags, described in dlvrmail.h.
        !            94: **                     - an argument.  If we have P_MAP, it is the
        !            95: **                       character to turn the trigger character into.
        !            96: **                       If we have P_MOVE, it is the site to send it
        !            97: **                       to, using the mailer specified above.
        !            98: **                     This table will almost certainly have to be
        !            99: **                     changed on your site if you have anything more
        !           100: **                     than the UUCP net.
        !           101: */
        !           102: 
        !           103: 
        !           104: 
        !           105: 
        !           106: static char SccsId[] = "@(#)conf.c     1.10    10/21/80";
        !           107: 
        !           108: /************ BEGIN CONFIGURATION SECTION ************/
        !           109: 
        !           110: bool   UseMsgId = FALSE;       /* don't put message id's in anywhere */
        !           111: 
        !           112: # include <whoami.h>           /* definitions of machine id's at berkeley */
        !           113: 
        !           114: char   *ArpaHost = "[unknown]";
        !           115: char   *MyLocName = sysname;
        !           116: # define HASUUCP               /* default to having UUCP net */
        !           117: char   *UucpLocal[] = { sysname, NULL };
        !           118: /* if you define HASARPA you must include a declaration for ArpaLocal */
        !           119: 
        !           120: /************ END CONFIGURATION SECTION ************/
        !           121: 
        !           122: # ifndef HASARPA
        !           123: # define ArpaLocal     NULL
        !           124: # endif HASARPA
        !           125: 
        !           126: # ifndef HASUUCP
        !           127: # define UucpLocal     NULL
        !           128: # endif HASUUCP
        !           129: 
        !           130: # ifndef HASBERK
        !           131: # define BerkLocal     NULL
        !           132: # endif HASBERK
        !           133: 
        !           134: 
        !           135: struct mailer Mailer[] =
        !           136: {
        !           137:        /* local mail -- must be #0 */
        !           138:        {
        !           139: # ifdef NETV6MAIL
        !           140:                "/usr/net/bin/v6mail",
        !           141: # else
        !           142:                "/bin/mail",
        !           143: # endif
        !           144:                M_ROPT|M_NOHOST|M_STRIPQ,       EX_NOUSER,      NULL,
        !           145:                { "...local%mail", "-d", "$u", NULL }
        !           146:        },
        !           147:        /* pipes through programs -- must be #1 */
        !           148:        {
        !           149:                "/bin/csh",
        !           150:                M_HDR|M_NOHOST,                 EX_UNAVAILABLE, NULL,
        !           151:                { "...prog%mail", "-fc", "$u", NULL }
        !           152:        },
        !           153:        /* local berkeley mail */
        !           154:        {
        !           155:                "/usr/net/bin/sendberkmail",
        !           156:                M_FOPT|M_HDR|M_STRIPQ,          EX_UNAVAILABLE, BerkLocal,
        !           157:                { "...berk%mail", "-m", "$h", "-t", "$u", "-h", "$c", NULL }
        !           158:        },
        !           159:        /* arpanet mail */
        !           160:        {
        !           161:                "/usr/lib/mailers/arpa",
        !           162:                M_STRIPQ,                       0,              ArpaLocal,
        !           163:                { "...arpa%mail", "$f", "$h", "$u", NULL }
        !           164:        },
        !           165:        /* uucp mail (cheat & use Bell's v7 mail) */
        !           166:        {
        !           167:                "/bin/mail",
        !           168:                M_ROPT|M_STRIPQ,                EX_NOUSER,      UucpLocal,
        !           169: # ifdef DUMBMAIL
        !           170:                { "...uucp%mail", "$h!$u", NULL }
        !           171: # else
        !           172:                { "...uucp%mail", "-d", "$h!$u", NULL }
        !           173: # endif DUMBMAIL
        !           174:        },
        !           175: };
        !           176: 
        !           177: # define M_LOCAL       0
        !           178: # define M_BERK                2
        !           179: # define M_ARPA                3
        !           180: # define M_UUCP                4
        !           181: 
        !           182: 
        !           183: 
        !           184: struct parsetab ParseTab[] =
        !           185: {
        !           186: # ifdef HASARPA
        !           187:        '@',    M_ARPA,         P_HLAST|P_USR_UPPER,            NULL,
        !           188: # endif HASARPA
        !           189: # ifdef HASUUCP
        !           190:        '^',    -1,             P_MAP,                          "!",
        !           191:        '!',    M_UUCP,         0,                              NULL,
        !           192: # endif HASUUCP
        !           193:        '\0',   M_LOCAL,        P_MOVE,                         "",
        !           194: };
        !           195: /*
        !           196: **  GETNAME -- Get the current users login name.
        !           197: **
        !           198: **     This is in config.c because it is somewhat machine dependent.
        !           199: **     Examine it carefully for your installation.
        !           200: **
        !           201: **     Algorithm:
        !           202: **             See if the person is logged in.  If so, return
        !           203: **                     the name s/he is logged in as.
        !           204: **             Look up the user id in /etc/passwd.  If found,
        !           205: **                     return that name.
        !           206: **             Return NULL.
        !           207: **
        !           208: **     Parameters:
        !           209: **             none
        !           210: **
        !           211: **     Returns:
        !           212: **             The login name of this user.
        !           213: **             NULL if this person is noone.
        !           214: **
        !           215: **     Side Effects:
        !           216: **             none
        !           217: **
        !           218: **     Called By:
        !           219: **             main
        !           220: */
        !           221: 
        !           222: char *
        !           223: getname()
        !           224: {
        !           225:        register char *p;
        !           226:        register struct passwd *w;
        !           227:        extern char *getlogin();
        !           228:        extern struct passwd *getpwuid();
        !           229:        static char namebuf[9];
        !           230: 
        !           231:        p = getlogin();
        !           232:        if (p != NULL && p[0] != '\0')
        !           233:                return (p);
        !           234: # ifdef V6
        !           235:        w = getpwuid(getuid() & 0377);
        !           236: # else
        !           237:        w = getpwuid(getuid());
        !           238: # endif V6
        !           239:        if (w != NULL)
        !           240:        {
        !           241:                strcpy(namebuf, w->pw_name);
        !           242:                return (namebuf);
        !           243:        }
        !           244:        return (NULL);
        !           245: }
        !           246: 
        !           247: # ifdef V6
        !           248: /*
        !           249: **  TTYPATH -- Get the path of the user's tty -- Version 6 version.
        !           250: **
        !           251: **     Returns the pathname of the user's tty.  Returns NULL if
        !           252: **     the user is not logged in or if s/he has write permission
        !           253: **     denied.
        !           254: **
        !           255: **     Parameters:
        !           256: **             none
        !           257: **
        !           258: **     Returns:
        !           259: **             pathname of the user's tty.
        !           260: **             NULL if not logged in or write permission denied.
        !           261: **
        !           262: **     Side Effects:
        !           263: **             none.
        !           264: **
        !           265: **     WARNING:
        !           266: **             Return value is in a local buffer.
        !           267: **
        !           268: **     Called By:
        !           269: **             savemail
        !           270: */
        !           271: 
        !           272: # include <sys/types.h>
        !           273: # include <sys/stat.h>
        !           274: 
        !           275: char *
        !           276: ttypath()
        !           277: {
        !           278:        struct stat stbuf;
        !           279:        register int i;
        !           280:        static char pathn[] = "/dev/ttyx";
        !           281:        extern int errno;
        !           282: 
        !           283:        /* compute the pathname of the controlling tty */
        !           284:        if ((i = ttyn(2)) == 'x' && (i = ttyn(1)) == 'x' && (i = ttyn(0)) == 'x')
        !           285:        {
        !           286:                errno = 0;
        !           287:                return (NULL);
        !           288:        }
        !           289:        pathn[8] = i;
        !           290: 
        !           291:        /* see if we have write permission */
        !           292:        if (stat(pathn, &stbuf) < 0 || !flagset(02, stbuf.st_mode))
        !           293:        {
        !           294:                errno = 0;
        !           295:                return (NULL);
        !           296:        }
        !           297: 
        !           298:        /* see if the user is logged in */
        !           299:        if (getlogin() == NULL)
        !           300:                return (NULL);
        !           301: 
        !           302:        /* looks good */
        !           303:        return (pathn);
        !           304: }
        !           305: /*
        !           306: **  FDOPEN -- Open a stdio file given an open file descriptor.
        !           307: **
        !           308: **     This is included here because it is standard in v7, but we
        !           309: **     need it in v6.
        !           310: **
        !           311: **     Algorithm:
        !           312: **             Open /dev/null to create a descriptor.
        !           313: **             Close that descriptor.
        !           314: **             Copy the existing fd into the descriptor.
        !           315: **
        !           316: **     Parameters:
        !           317: **             fd -- the open file descriptor.
        !           318: **             type -- "r", "w", or whatever.
        !           319: **
        !           320: **     Returns:
        !           321: **             The file descriptor it creates.
        !           322: **
        !           323: **     Side Effects:
        !           324: **             none
        !           325: **
        !           326: **     Called By:
        !           327: **             deliver
        !           328: **
        !           329: **     Notes:
        !           330: **             The mode of fd must match "type".
        !           331: */
        !           332: 
        !           333: FILE *
        !           334: fdopen(fd, type)
        !           335:        int fd;
        !           336:        char *type;
        !           337: {
        !           338:        register FILE *f;
        !           339: 
        !           340:        f = fopen("/dev/null", type);
        !           341:        close(fileno(f));
        !           342:        fileno(f) = fd;
        !           343:        return (f);
        !           344: }
        !           345: /*
        !           346: **  INDEX -- Return pointer to character in string
        !           347: **
        !           348: **     For V7 compatibility.
        !           349: **
        !           350: **     Parameters:
        !           351: **             s -- a string to scan.
        !           352: **             c -- a character to look for.
        !           353: **
        !           354: **     Returns:
        !           355: **             If c is in s, returns the address of the first
        !           356: **                     instance of c in s.
        !           357: **             NULL if c is not in s.
        !           358: **
        !           359: **     Side Effects:
        !           360: **             none.
        !           361: */
        !           362: 
        !           363: index(s, c)
        !           364:        register char *s;
        !           365:        register char c;
        !           366: {
        !           367:        while (*s != '\0')
        !           368:        {
        !           369:                if (*s++ == c)
        !           370:                        return (--s);
        !           371:        }
        !           372:        return (NULL);
        !           373: }
        !           374: # endif V6
        !           375: 
        !           376: # ifndef V6
        !           377: /*
        !           378: **  TTYPATH -- Get the path of the user's tty -- Version 7 version.
        !           379: **
        !           380: **     Returns the pathname of the user's tty.  Returns NULL if
        !           381: **     the user is not logged in or if s/he has write permission
        !           382: **     denied.
        !           383: **
        !           384: **     Parameters:
        !           385: **             none
        !           386: **
        !           387: **     Returns:
        !           388: **             pathname of the user's tty.
        !           389: **             NULL if not logged in or write permission denied.
        !           390: **
        !           391: **     Side Effects:
        !           392: **             none.
        !           393: **
        !           394: **     WARNING:
        !           395: **             Return value is in a local buffer.
        !           396: **
        !           397: **     Called By:
        !           398: **             savemail
        !           399: */
        !           400: 
        !           401: # include <sys/types.h>
        !           402: # include <sys/stat.h>
        !           403: 
        !           404: char *
        !           405: ttypath()
        !           406: {
        !           407:        struct stat stbuf;
        !           408:        register char *pathn;
        !           409:        extern int errno;
        !           410:        extern char *ttyname();
        !           411: 
        !           412:        /* compute the pathname of the controlling tty */
        !           413:        if ((pathn = ttyname(2)) == NULL && (pathn = ttyname(1)) == NULL && (pathn = ttyname(0)) == NULL)
        !           414:        {
        !           415:                errno = 0;
        !           416:                return (NULL);
        !           417:        }
        !           418: 
        !           419:        /* see if we have write permission */
        !           420:        if (stat(pathn, &stbuf) < 0 || !flagset(02, stbuf.st_mode))
        !           421:        {
        !           422:                errno = 0;
        !           423:                return (NULL);
        !           424:        }
        !           425: 
        !           426:        /* see if the user is logged in */
        !           427:        if (getlogin() == NULL)
        !           428:                return (NULL);
        !           429: 
        !           430:        /* looks good */
        !           431:        return (pathn);
        !           432: }
        !           433: # endif V6

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.