Annotation of 40BSD/cmd/delivermail/conf.ucb.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: 
                    109: bool   UseMsgId = FALSE;       /* don't put message id's in anywhere */
                    110: 
                    111: # include <whoami.h>           /* definitions of machine id's at berkeley */
                    112: 
                    113: # ifdef BERKELEY
                    114: char   *ArpaHost = "Berkeley"; /* host name of gateway on Arpanet */
                    115: # else BERKELEY
                    116: char   *ArpaHost = "[unknown]";
                    117: char   *MyLocName = sysname;
                    118: # define HASUUCP               /* default to having UUCP net */
                    119: char   *UucpLocal[] = { sysname, NULL };
                    120: # endif BERKELEY
                    121: 
                    122: # ifdef ING70
                    123: static char    *BerkLocal[] = { "i", "ingres", "ing70", NULL };
                    124: # define ArpaLocal     NULL
                    125: char           *MyLocName = "Ing70";
                    126: # define HASARPA
                    127: # define V6
                    128: # endif ING70
                    129: 
                    130: # ifdef INGVAX
                    131: static char    *BerkLocal[] = { "j", "ingvax", NULL };
                    132: char           *MyLocName = "IngVax";
                    133: # endif INGVAX
                    134: 
                    135: # ifdef CSVAX
                    136: static char    *BerkLocal[] = { "v", "csvax", "vax", NULL };
                    137: static char    *UucpLocal[] = { "ucbvax", "ernie", NULL };
                    138: char           *MyLocName = "CSVAX";
                    139: # define HASUUCP
                    140: # define NETV6MAIL
                    141: # endif CSVAX
                    142: 
                    143: # ifdef CORY
                    144: /* untested */
                    145: static char    *BerkLocal[] = { "y", "cory", NULL };
                    146: char           *MyLocName = "Cory";
                    147: # endif CORY
                    148: 
                    149: # ifdef IMAGE
                    150: /* untested */
                    151: static char    *BerkLocal[] = { "m", "image", NULL };
                    152: char           *MyLocName = "Image";
                    153: # define V6
                    154: # endif IMAGE
                    155: 
                    156: # ifdef ESVAX
                    157: /* untested */
                    158: static char    *BerkLocal[] = { "o", "esvax", NULL };
                    159: char           *MyLocName = "ESVAX";
                    160: # endif ESVAX
                    161: 
                    162: # ifdef EECS40
                    163: /* untested */
                    164: static char    *BerkLocal[] = { "z", "eecs40", NULL };
                    165: char           *MyLocName = "EECS40";
                    166: # define V6
                    167: # endif EECS40
                    168: 
                    169: 
                    170: # ifndef HASARPA
                    171: # define ArpaLocal     NULL
                    172: # endif HASARPA
                    173: 
                    174: # ifndef HASUUCP
                    175: # define UucpLocal     NULL
                    176: # endif HASUUCP
                    177: 
                    178: 
                    179: struct mailer Mailer[] =
                    180: {
                    181:        /* local mail -- must be #0 */
                    182:        {
                    183: # ifdef NETV6MAIL
                    184:                "/usr/net/bin/v6mail",
                    185: # else
                    186:                "/bin/mail",
                    187: # endif
                    188:                M_ROPT|M_NOHOST|M_STRIPQ,       EX_NOUSER,      NULL,
                    189:                { "...local%mail", "-d", "$u", NULL }
                    190:        },
                    191:        /* pipes through programs -- must be #1 */
                    192:        {
                    193:                "/bin/csh",
                    194:                M_HDR|M_NOHOST,                 EX_UNAVAILABLE, NULL,
                    195:                { "...prog%mail", "-fc", "$u", NULL }
                    196:        },
                    197:        /* local berkeley mail */
                    198:        {
                    199:                "/usr/net/bin/sendberkmail",
                    200:                M_FOPT|M_HDR|M_STRIPQ,          EX_UNAVAILABLE, BerkLocal,
                    201:                { "...berk%mail", "-m", "$h", "-t", "$u", "-h", "$c", NULL }
                    202:        },
                    203:        /* arpanet mail */
                    204:        {
                    205:                "/usr/lib/mailers/arpa",
                    206:                M_STRIPQ,                       0,              ArpaLocal,
                    207:                { "...arpa%mail", "$f", "$h", "$u", NULL }
                    208:        },
                    209:        /* uucp mail (cheat & use Bell's v7 mail) */
                    210:        {
                    211:                "/bin/mail",
                    212:                M_ROPT|M_STRIPQ,                EX_NOUSER,      UucpLocal,
                    213: # ifdef DUMBMAIL
                    214:                { "...uucp%mail", "$h!$u", NULL }
                    215: # else
                    216:                { "...uucp%mail", "-d", "$h!$u", NULL }
                    217: # endif DUMBMAIL
                    218:        },
                    219: };
                    220: 
                    221: # define M_LOCAL       0
                    222: # define M_BERK                2
                    223: # define M_ARPA                3
                    224: # define M_UUCP                4
                    225: 
                    226: 
                    227: 
                    228: # ifdef BERKELEY
                    229: struct parsetab ParseTab[] =
                    230: {
                    231:        ':',    M_BERK,         P_ONE,                          NULL,
                    232: # ifdef HASARPA
                    233:        '@',    M_ARPA,         P_HLAST|P_USR_UPPER,            NULL,
                    234: # else
                    235:        '@',    M_BERK,         P_HLAST|P_USR_UPPER|P_MOVE,     "ing70",
                    236: # endif HASARPA
                    237:        '^',    -1,             P_MAP,                          "!",
                    238: # ifdef HASUUCP
                    239:        '!',    M_UUCP,         0,                              NULL,
                    240: # else
                    241:        '!',    M_BERK,         P_MOVE,                         "csvax",
                    242: # endif HASUUCP
                    243:        '.',    -1,             P_MAP|P_ONE,                    ":",
                    244:        '\0',   M_LOCAL,        P_MOVE,                         "",
                    245: };
                    246: # else BERKELEY
                    247: struct parsetab ParseTab[] =
                    248: {
                    249: # ifdef HASARPA
                    250:        '@',    M_ARPA,         P_HLAST|P_USR_UPPER,            NULL,
                    251: # endif HASARPA
                    252: # ifdef HASUUCP
                    253:        '^',    -1,             P_MAP,                          "!",
                    254:        '!',    M_UUCP,         0,                              NULL,
                    255: # endif HASUUCP
                    256:        '\0',   M_LOCAL,        P_MOVE,                         "",
                    257: };
                    258: # endif BERKELEY
                    259: /*
                    260: **  GETNAME -- Get the current users login name.
                    261: **
                    262: **     This is in config.c because it is somewhat machine dependent.
                    263: **     Examine it carefully for your installation.
                    264: **
                    265: **     Algorithm:
                    266: **             See if the person is logged in.  If so, return
                    267: **                     the name s/he is logged in as.
                    268: **             Look up the user id in /etc/passwd.  If found,
                    269: **                     return that name.
                    270: **             Return NULL.
                    271: **
                    272: **     Parameters:
                    273: **             none
                    274: **
                    275: **     Returns:
                    276: **             The login name of this user.
                    277: **             NULL if this person is noone.
                    278: **
                    279: **     Side Effects:
                    280: **             none
                    281: **
                    282: **     Called By:
                    283: **             main
                    284: */
                    285: 
                    286: char *
                    287: getname()
                    288: {
                    289:        register char *p;
                    290:        register struct passwd *w;
                    291:        extern char *getlogin();
                    292:        extern struct passwd *getpwuid();
                    293:        static char namebuf[9];
                    294: 
                    295:        p = getlogin();
                    296:        if (p != NULL && p[0] != '\0')
                    297:                return (p);
                    298: # ifdef V6
                    299:        w = getpwuid(getuid() & 0377);
                    300: # else
                    301:        w = getpwuid(getuid());
                    302: # endif V6
                    303:        if (w != NULL)
                    304:        {
                    305:                strcpy(namebuf, w->pw_name);
                    306:                return (namebuf);
                    307:        }
                    308:        return (NULL);
                    309: }
                    310: 
                    311: # ifdef V6
                    312: /*
                    313: **  TTYPATH -- Get the path of the user's tty -- Version 6 version.
                    314: **
                    315: **     Returns the pathname of the user's tty.  Returns NULL if
                    316: **     the user is not logged in or if s/he has write permission
                    317: **     denied.
                    318: **
                    319: **     Parameters:
                    320: **             none
                    321: **
                    322: **     Returns:
                    323: **             pathname of the user's tty.
                    324: **             NULL if not logged in or write permission denied.
                    325: **
                    326: **     Side Effects:
                    327: **             none.
                    328: **
                    329: **     WARNING:
                    330: **             Return value is in a local buffer.
                    331: **
                    332: **     Called By:
                    333: **             savemail
                    334: */
                    335: 
                    336: # include <sys/types.h>
                    337: # include <sys/stat.h>
                    338: 
                    339: char *
                    340: ttypath()
                    341: {
                    342:        struct stat stbuf;
                    343:        register int i;
                    344:        static char pathn[] = "/dev/ttyx";
                    345:        extern int errno;
                    346: 
                    347:        /* compute the pathname of the controlling tty */
                    348:        if ((i = ttyn(2)) == 'x' && (i = ttyn(1)) == 'x' && (i = ttyn(0)) == 'x')
                    349:        {
                    350:                errno = 0;
                    351:                return (NULL);
                    352:        }
                    353:        pathn[8] = i;
                    354: 
                    355:        /* see if we have write permission */
                    356:        if (stat(pathn, &stbuf) < 0 || !flagset(02, stbuf.st_mode))
                    357:        {
                    358:                errno = 0;
                    359:                return (NULL);
                    360:        }
                    361: 
                    362:        /* see if the user is logged in */
                    363:        if (getlogin() == NULL)
                    364:                return (NULL);
                    365: 
                    366:        /* looks good */
                    367:        return (pathn);
                    368: }
                    369: /*
                    370: **  FDOPEN -- Open a stdio file given an open file descriptor.
                    371: **
                    372: **     This is included here because it is standard in v7, but we
                    373: **     need it in v6.
                    374: **
                    375: **     Algorithm:
                    376: **             Open /dev/null to create a descriptor.
                    377: **             Close that descriptor.
                    378: **             Copy the existing fd into the descriptor.
                    379: **
                    380: **     Parameters:
                    381: **             fd -- the open file descriptor.
                    382: **             type -- "r", "w", or whatever.
                    383: **
                    384: **     Returns:
                    385: **             The file descriptor it creates.
                    386: **
                    387: **     Side Effects:
                    388: **             none
                    389: **
                    390: **     Called By:
                    391: **             deliver
                    392: **
                    393: **     Notes:
                    394: **             The mode of fd must match "type".
                    395: */
                    396: 
                    397: FILE *
                    398: fdopen(fd, type)
                    399:        int fd;
                    400:        char *type;
                    401: {
                    402:        register FILE *f;
                    403: 
                    404:        f = fopen("/dev/null", type);
                    405:        close(fileno(f));
                    406:        fileno(f) = fd;
                    407:        return (f);
                    408: }
                    409: /*
                    410: **  INDEX -- Return pointer to character in string
                    411: **
                    412: **     For V7 compatibility.
                    413: **
                    414: **     Parameters:
                    415: **             s -- a string to scan.
                    416: **             c -- a character to look for.
                    417: **
                    418: **     Returns:
                    419: **             If c is in s, returns the address of the first
                    420: **                     instance of c in s.
                    421: **             NULL if c is not in s.
                    422: **
                    423: **     Side Effects:
                    424: **             none.
                    425: */
                    426: 
                    427: index(s, c)
                    428:        register char *s;
                    429:        register char c;
                    430: {
                    431:        while (*s != '\0')
                    432:        {
                    433:                if (*s++ == c)
                    434:                        return (--s);
                    435:        }
                    436:        return (NULL);
                    437: }
                    438: # endif V6
                    439: 
                    440: # ifndef V6
                    441: /*
                    442: **  TTYPATH -- Get the path of the user's tty -- Version 7 version.
                    443: **
                    444: **     Returns the pathname of the user's tty.  Returns NULL if
                    445: **     the user is not logged in or if s/he has write permission
                    446: **     denied.
                    447: **
                    448: **     Parameters:
                    449: **             none
                    450: **
                    451: **     Returns:
                    452: **             pathname of the user's tty.
                    453: **             NULL if not logged in or write permission denied.
                    454: **
                    455: **     Side Effects:
                    456: **             none.
                    457: **
                    458: **     WARNING:
                    459: **             Return value is in a local buffer.
                    460: **
                    461: **     Called By:
                    462: **             savemail
                    463: */
                    464: 
                    465: # include <sys/types.h>
                    466: # include <sys/stat.h>
                    467: 
                    468: char *
                    469: ttypath()
                    470: {
                    471:        struct stat stbuf;
                    472:        register char *pathn;
                    473:        extern int errno;
                    474:        extern char *ttyname();
                    475: 
                    476:        /* compute the pathname of the controlling tty */
                    477:        if ((pathn = ttyname(2)) == NULL && (pathn = ttyname(1)) == NULL && (pathn = ttyname(0)) == NULL)
                    478:        {
                    479:                errno = 0;
                    480:                return (NULL);
                    481:        }
                    482: 
                    483:        /* see if we have write permission */
                    484:        if (stat(pathn, &stbuf) < 0 || !flagset(02, stbuf.st_mode))
                    485:        {
                    486:                errno = 0;
                    487:                return (NULL);
                    488:        }
                    489: 
                    490:        /* see if the user is logged in */
                    491:        if (getlogin() == NULL)
                    492:                return (NULL);
                    493: 
                    494:        /* looks good */
                    495:        return (pathn);
                    496: }
                    497: # endif V6

unix.superglobalmegacorp.com

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