Annotation of 40BSD/cmd/delivermail/conf.c, revision 1.1.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.