Annotation of researchv10no/cmd/uucp/permission.c, revision 1.1.1.1

1.1       root        1: /*     /sccs/src/cmd/uucp/s.permission.c
                      2:        permission.c    1.3     8/30/84 17:37:34
                      3: */
                      4: #ifndef UUCHECK
                      5: #include "uucp.h"
                      6: VERSION(@(#)permission.c       1.3);
                      7: #endif
                      8: 
                      9: 
                     10: /*  field array indexes for PERMISSIONS parameters */
                     11: #define U_LOGNAME      0
                     12: #define U_MACHINE      1
                     13: #define U_CALLBACK     2
                     14: #define U_REQUEST      3
                     15: #define U_SENDFILES    4
                     16: #define U_READPATH     5
                     17: #define U_WRITEPATH    6
                     18: #define U_NOREADPATH   7
                     19: #define U_NOWRITEPATH  8
                     20: #define U_MYNAME       9
                     21: #define U_COMMANDS     10
                     22: #define U_VALIDATE     11
                     23: #define U_PUBDIR       12
                     24: /*  NUMFLDS should be one more than the highest U_ value */
                     25: #define NUMFLDS                13
                     26: 
                     27: /* fields found in PERMISSIONS for requested system/login */
                     28: static char *_Flds[NUMFLDS];
                     29: 
                     30: /* keyword/value structure */
                     31: struct keywords {
                     32:        char* kword;
                     33:        int kvalue;
                     34: };
                     35: static struct keywords _Kwords[] = {
                     36:        {"LOGNAME", U_LOGNAME},
                     37:        {"MACHINE", U_MACHINE},
                     38:        {"CALLBACK", U_CALLBACK},
                     39:        {"REQUEST", U_REQUEST},
                     40:        {"SENDFILES", U_SENDFILES},
                     41:        {"READ", U_READPATH},
                     42:        {"WRITE", U_WRITEPATH},
                     43:        {"NOREAD", U_NOREADPATH},
                     44:        {"NOWRITE", U_NOWRITEPATH},
                     45:        {"MYNAME", U_MYNAME},
                     46:        {"COMMANDS", U_COMMANDS},
                     47:        {"VALIDATE", U_VALIDATE},
                     48:        {"PUBDIR", U_PUBDIR},
                     49: };
                     50: 
                     51: #define MAXCMDS                30
                     52: #define MAXPATHS       20
                     53: 
                     54: /* for all options on paths - read, write, noread, nowrite */
                     55: static char *_RPaths[MAXPATHS+1];
                     56: static char *_WPaths[MAXPATHS+1];
                     57: static char *_NoRPaths[MAXPATHS+1];
                     58: static char *_NoWPaths[MAXPATHS+1];
                     59: static char *_Commands[MAXCMDS+1];
                     60: static char _Cmd_defaults[BUFSIZ];
                     61: 
                     62: /* option variables */
                     63: static int _Request;   /* TRUE can request, FALSE can not request files */
                     64: static int _Switch;    /* FALSE requires a call back to send any files */
                     65: static int _CallBack;  /* TRUE for call back for any transaction */
                     66: static char _MyName[MAXBASENAME+1];    /* Myname from PERMISSIONS file */
                     67: static char *_Pubdir = NULL;                   /* PUBDIR from PERMISSIONS file */
                     68: 
                     69: struct name_value
                     70: {
                     71:        char *name;
                     72:        char *value;
                     73: };
                     74: 
                     75: /* file pointer for PERMISSIONS */
                     76: static FILE *Fp = NULL;
                     77: 
                     78: /* functions */
                     79: static char *next_token(), *nextarg();
                     80: static void fillFlds();
                     81: static int fillList();
                     82: 
                     83: /*
                     84:  * fill in fields for login name
                     85:  * name - the login id
                     86:  * rmtname - remote system name
                     87:  *
                     88:  * return:
                     89:  *     0 -> found login name
                     90:  *     FAIL -> did not find login
                     91:  */
                     92: 
                     93: logFind(name, rmtname)
                     94: char *name, *rmtname;
                     95: {
                     96:        int ret;
                     97:        DEBUG(5, "logFind called (name: %s, ", name);
                     98:        DEBUG(5, "rmtname: %s)\n", rmtname);
                     99: 
                    100:        ret = validateFind (rmtname);
                    101:        if (ret == SUCCESS) { /* found VALIDATE entry */
                    102:            ret = userFind (name, rmtname, U_VALIDATE);
                    103:            if (ret) {
                    104:                DEBUG(5, "machine/login match failed", "");
                    105:                return(FAIL);
                    106:            }
                    107:        }
                    108:        else
                    109:            ret = userFind (name, "", U_LOGNAME);
                    110: 
                    111:        DEBUG(7, "_Request (%s), ",
                    112:            requestOK() ? "TRUE" : "FALSE");
                    113:        DEBUG(7, "_Switch (%s), ",
                    114:            switchRole() ? "TRUE" : "FALSE");
                    115:        DEBUG(7, "_CallBack (%s), ",
                    116:            callBack() ? "TRUE" : "FALSE");
                    117:        DEBUG(7, "_MyName (%s), ", _MyName);
                    118:        return(ret);
                    119: }
                    120: 
                    121: /*
                    122:  * fill in fields for machine name
                    123:  * return:
                    124:  *     0 -> found machine name
                    125:  *     FAIL -> did not find machine
                    126:  */
                    127: 
                    128: mchFind(name)
                    129: char *name;
                    130: {
                    131:        register i, ret;
                    132:        DEBUG(5, "mchFind called (%s)\n", name);
                    133:        if ( (ret = userFind (name, "", U_MACHINE)) == FAIL)
                    134:            /* see if there is a default line */
                    135:            (void) userFind ("OTHER", "", U_MACHINE);
                    136: 
                    137:        /*  mchFind is from MASTER mode - switch role is always ok */
                    138:        _Switch = TRUE;
                    139: 
                    140:        DEBUG(7, "_Request (%s), ",
                    141:            requestOK() ? "TRUE" : "FALSE");
                    142:        DEBUG(7, "_Switch (%s), ",
                    143:            switchRole() ? "TRUE" : "FALSE");
                    144:        DEBUG(7, "_CallBack (%s), ",
                    145:            callBack() ? "TRUE" : "FALSE");
                    146:        DEBUG(7, "_MyName (%s), ", _MyName);
                    147:        for (i=0; _Commands[i] != NULL; i++)
                    148:            DEBUG(7, "_Commands %s\n",  _Commands[i]);
                    149:        return(ret);
                    150: }
                    151: 
                    152: /*
                    153:  * this function will find a login name in the LOGNAME
                    154:  * field.
                    155:  * input:
                    156:  *     name    -> who the remote says he/she is
                    157:  * return:
                    158:  *     SUCCESS -> found
                    159:  *     FAIL    -> not found
                    160:  */
                    161: static
                    162: int
                    163: nameMatch(name, fld)
                    164: char *name, *fld;
                    165: {
                    166:        char *arg;
                    167: 
                    168:        if (fld == NULL)
                    169:            return(FAIL);
                    170: 
                    171:        while (*fld) {
                    172:            fld = nextarg(fld, &arg);
                    173:            if (EQUALS(arg, name))
                    174:                return(SUCCESS);
                    175:        }
                    176:        return (FAIL);
                    177: }
                    178: 
                    179: 
                    180: /*
                    181:  * interpret the _Flds options and set the option variables
                    182:  */
                    183: static
                    184: void
                    185: fillFlds()
                    186: {
                    187: 
                    188:        if (EQUALS(_Flds[U_REQUEST], "yes"))
                    189:                _Request = TRUE;
                    190:        else
                    191:                _Request = FALSE;
                    192: 
                    193:        if (EQUALS(_Flds[U_SENDFILES], "yes"))
                    194:                _Switch = TRUE;
                    195:        else
                    196:                _Switch = FALSE;
                    197: 
                    198:        if (EQUALS(_Flds[U_CALLBACK], "yes"))
                    199:                _CallBack = TRUE;
                    200:        else
                    201:                _CallBack = FALSE;
                    202: 
                    203:        if (_Flds[U_MYNAME] != NULL) {
                    204:                strncpy(_MyName, _Flds[U_MYNAME], MAXBASENAME);
                    205:                _MyName[MAXBASENAME] = NULLCHAR;
                    206:        }
                    207:        else
                    208:                *_MyName = NULLCHAR;
                    209: 
                    210:        if (_Flds[U_PUBDIR] != NULL) {
                    211:                if (_Pubdir != NULL)
                    212:                    free(_Pubdir);      /* get rid of previous one */
                    213:                _Pubdir = malloc(strlen(_Flds[U_PUBDIR])+1);
                    214: #ifndef UUCHECK
                    215:                ASSERT(_Pubdir != NULL, Ct_ALLOCATE, _Flds[U_PUBDIR], 0);
                    216: #else
                    217:                if (_Pubdir == NULL) {
                    218:                    (void) fprintf(stderr, "malloc() error\n");
                    219:                    exit(1);
                    220:                }
                    221: #endif
                    222:                strcpy(_Pubdir, _Flds[U_PUBDIR]);
                    223:                Pubdir = _RPaths[0] = _WPaths[0] = _Pubdir; /* reset default */
                    224:        }
                    225:        else
                    226:                Pubdir = PUBDIR;
                    227: 
                    228:        return;
                    229: }
                    230: 
                    231: /*
                    232:  * fill in the list vector for the system/login
                    233:  * input:
                    234:  *     type - list type (read, write, noread, nowrite, command)
                    235:  * output:
                    236:  *     list - filled in with items.
                    237:  * return:
                    238:  *     number of items in list
                    239:  */
                    240: static
                    241: fillList(type, list)
                    242: int type;
                    243: char *list[];
                    244: {
                    245:        register char *p;
                    246:        register num;
                    247:        int maxlist = 0;
                    248: 
                    249:        p = _Flds[type];
                    250: 
                    251:        /* find list limit */
                    252:        if (type == U_READPATH || type == U_WRITEPATH
                    253:         || type == U_NOREADPATH || type == U_NOWRITEPATH)
                    254:                maxlist = MAXPATHS;
                    255:        else if (type == U_COMMANDS)
                    256:                maxlist = MAXCMDS;
                    257: 
                    258:        if (p == NULL || !*p) {
                    259:                 /* no names specified, default already setup */
                    260:                return(0);
                    261:        }
                    262: 
                    263:        num = 0;
                    264:        while (*p && num < maxlist) {
                    265:                list[num] = p;
                    266:                if (*p == ':') {        /* null path */
                    267:                        *p++ = NULLCHAR; 
                    268:                        continue;
                    269:                }
                    270:                while (*p && *p != ':')
                    271:                        p++;
                    272:                if (*p == ':')
                    273:                        *p++ = NULLCHAR;
                    274:                DEBUG(7, "list (%s) ", list[num]);
                    275:                num++;
                    276:        }
                    277:        DEBUG(7, "num = %d\n", num);
                    278:        list[num] = NULL;
                    279:        return(num);
                    280: }
                    281: 
                    282: /*
                    283:  * Find the line of PERMISSIONS for login.
                    284:  * The search is determined by the type field
                    285:  * (type=U_LOGNAME, U_MACHINE or U_VALIDATE)
                    286:  * For U_LOGNAME:
                    287:  *     search for "name" in a LOGNAME= option
                    288:  * For U_MACHINE:
                    289:  *     search for "name" in a MACHINE= option
                    290:  * For U_VALIDATE:
                    291:  *     search for "rmtname" in a VALIDATE= option and
                    292:  *     for the same entry see if "name" is in the LOGNAME= option
                    293:  * input:
                    294:  *     name -> search name
                    295:  *     logname -> for validate entry
                    296:  *     type -> U_MACHINE or U_LOGNAME
                    297:  * output:
                    298:  *     The global values of all options will be set
                    299:  *     (e.g. _RPaths, _WPaths,  _Request, ...)
                    300:  * return:
                    301:  *     0 -> ok
                    302:  *     FAIL -> no match found
                    303:  */
                    304: static
                    305: userFind(name, rmtname, type)
                    306: char *name, *rmtname;
                    307: int type;
                    308: {
                    309:        char *p, *arg;
                    310: 
                    311:        /* initialize permission variables in case line is not found */
                    312:        _Request = FALSE;
                    313:        _CallBack = FALSE;
                    314:        _Switch = FALSE;
                    315:        _MyName[0] = NULLCHAR;
                    316:        _RPaths[0] = _WPaths[0] = PUBDIR;       /* default is public */
                    317:        _RPaths[1] = _WPaths[1] = NULLCHAR;
                    318:        /* set up Commands defaults */
                    319:        _Flds[U_COMMANDS] = strcpy(_Cmd_defaults, DEFAULTCMDS);
                    320:        fillList(U_COMMANDS, _Commands);
                    321: 
                    322:        if (name == NULL)       /* use defaults */
                    323:                return(0);      /* I don't think this will ever happen */
                    324: 
                    325:        if ( (Fp = fopen(PFILE, "r")) == NULL) {
                    326:                DEBUG(5, "can't open %s\n", PFILE);
                    327:                return(FAIL);
                    328:        }
                    329: 
                    330:        for (;;) {
                    331:            if (parse_tokens (_Flds) != 0) {
                    332:                (void) fclose(Fp);
                    333:                DEBUG(5, "name (%s) not found; return FAIL\n", name);
                    334:                return(FAIL);
                    335:            }
                    336: 
                    337:            p = _Flds[type];
                    338:            while (p && *p) {
                    339:                p = nextarg(p, &arg);
                    340:                switch (type) {
                    341:                case U_VALIDATE:
                    342:                    if (EQUALS(arg, rmtname)
                    343:                        && nameMatch(name, _Flds[U_LOGNAME])==SUCCESS)
                    344:                                break;
                    345:                    continue;
                    346: 
                    347:                case U_LOGNAME:
                    348:                    if (EQUALS(arg, name)) 
                    349:                                break;
                    350:                    continue;
                    351: 
                    352:                case U_MACHINE:
                    353:                    if (EQUALSN(arg, name, SYSNSIZE))
                    354:                                break;
                    355:                    continue;
                    356:                }
                    357: 
                    358:                (void) fclose(Fp);
                    359:                fillFlds();
                    360: 
                    361:                /* fill in path lists */
                    362:                fillList(U_READPATH, _RPaths);
                    363:                fillList(U_WRITEPATH, _WPaths);
                    364:                if (!requestOK())
                    365:                    _Flds[U_NOREADPATH] = "/";
                    366:                fillList(U_NOREADPATH, _NoRPaths);
                    367:                fillList(U_NOWRITEPATH, _NoWPaths);
                    368: 
                    369:                /* fill in command list */
                    370:                fillList(U_COMMANDS, _Commands);
                    371: 
                    372:                return(0);
                    373:            }
                    374:        }
                    375: }
                    376: 
                    377: /*
                    378:  * see if name is in a VALIDATE option
                    379:  * return:
                    380:  *     FAIL -> not found
                    381:  *     SUCCESS -> found
                    382:  */
                    383: static
                    384: int
                    385: validateFind(name)
                    386: char *name;
                    387: {
                    388:        
                    389:        if ( (Fp = fopen(PFILE, "r")) == NULL) {
                    390:                DEBUG(5, "can't open %s\n", PFILE);
                    391:                return(FAIL);
                    392:        }
                    393: 
                    394:        for (;;) {
                    395:            if (parse_tokens (_Flds) != 0) {
                    396:                DEBUG(5, "validateFind (%s) FAIL\n", name);
                    397:                (void) fclose(Fp);
                    398:                return(FAIL);
                    399:            }
                    400: 
                    401:            if (_Flds[U_VALIDATE] == NULL)
                    402:                continue;
                    403:            if (nameMatch(name, _Flds[U_VALIDATE])==SUCCESS) {
                    404:                (void) fclose(Fp);
                    405:                return (SUCCESS);
                    406:            }
                    407:        }
                    408: 
                    409: }
                    410: 
                    411: 
                    412: /*
                    413:  * parse a line in PERMISSIONS and return a vector
                    414:  * of fields (flds)
                    415:  *
                    416:  * return:
                    417:  *     0 - OK
                    418:  *     EOF - at end of file            
                    419:  */
                    420: parse_tokens (flds)
                    421: char *flds[];
                    422: {
                    423:        register i;
                    424:        register char *p;
                    425:        struct name_value pair;
                    426:        static char line[BUFSIZ];
                    427: 
                    428:        /* initialize defaults  in case parameter is not specified */
                    429:        for (i=0;i<NUMFLDS;i++)
                    430:                flds[i] = NULL;
                    431: 
                    432:        if (getuline(line) == 0)
                    433:                return(EOF);
                    434: 
                    435:        for (p=line;p && *p;) {
                    436:                p = next_token (p, &pair);
                    437: 
                    438:                for (i=0; i<NUMFLDS; i++) {
                    439:                        if (EQUALS(pair.name, _Kwords[i].kword)) {
                    440:                                flds[i] = pair.value;
                    441:                                break;
                    442:                        }
                    443:                }
                    444: #ifndef UUCHECK
                    445:                ASSERT(i<NUMFLDS, "PERMISSIONS file: BAD OPTION--",
                    446:                    pair.name, NUMFLDS);
                    447: #else
                    448:                if (i >= NUMFLDS) {
                    449:                        DEBUG(3, "bad option (%s) in PERMISSIONS\n",pair.name);
                    450:                        (void) printf("\n*****************************\n");
                    451:                        (void) printf("**BAD OPTION in PERMISSIONS file: %s\n",
                    452:                                pair.name);
                    453:                        (void) printf("*****************************\n");
                    454:                        Uerrors++;
                    455:                        return(0);
                    456:                }
                    457: #endif
                    458: 
                    459:        }
                    460:        return(0);
                    461: }
                    462: 
                    463: /*
                    464:  * return a name value pair
                    465:  *     string  -> input pointer
                    466:  *     pair    -> name value pair
                    467:  * return:
                    468:  *     pointer to next character
                    469:  */
                    470: static
                    471: char *
                    472: next_token (string, pair)
                    473: register char *string;
                    474: struct name_value *pair;
                    475: {
                    476: 
                    477:        while ( (*string) && ((*string == '\t') || (*string == ' ')) )
                    478:                string++;
                    479: 
                    480:        pair->name = string;
                    481:        while ((*string) && (*string != '='))
                    482:                string++;
                    483:        if (*string)
                    484:                *string++ = NULLCHAR;
                    485:        
                    486:        pair->value = string;
                    487:        while ((*string) && (*string != '\t') && (*string != ' ')
                    488:            && (*string != '\n'))
                    489:                string++;
                    490: 
                    491:        if (*string)
                    492:                *string++ = NULLCHAR;
                    493: 
                    494:        return (string);
                    495: }
                    496: 
                    497: /*
                    498:  * get a line from the PERMISSIONS
                    499:  * take care of comments (#) in col 1
                    500:  * and continuations (\) in last col
                    501:  * return:
                    502:  *     len of line
                    503:  *     0 -> end of file
                    504:  */
                    505: getuline(line)
                    506: char *line;
                    507: {
                    508:        register char *p, *c;
                    509:        char buf[BUFSIZ];
                    510:        
                    511:        p = line;
                    512:        for (;fgets(buf, BUFSIZ, Fp) != NULL;) {
                    513:                /* remove trailing white space */
                    514:                c = &buf[strlen(buf)-1];
                    515:                while (c>=buf && (*c == '\n' || *c == '\t' || *c == ' ') )
                    516:                        *c-- = NULLCHAR;
                    517: 
                    518:                if (buf[0] == '#' || buf[0] == '\n' || buf[0] == NULLCHAR)
                    519:                        continue;
                    520:                (void) strcpy(p, buf);
                    521:                p += strlen(buf);
                    522:                if ( *(p-1) == '\\')
                    523:                        p--;
                    524:                else
                    525:                        break;
                    526:        }
                    527: 
                    528:        return(p-line);
                    529: }
                    530: 
                    531: 
                    532: #define SMAX   15
                    533: 
                    534: /*
                    535:  * get the next colon separated argument from the list
                    536:  * return:
                    537:  *     p -> pointer to next arg in string
                    538:  * input:
                    539:  *     str -> pointer to input string
                    540:  * output:
                    541:  *     name -> pointer to arg string
                    542:  */
                    543: static
                    544: char *
                    545: nextarg(str, name)
                    546: char *str, **name;
                    547: {
                    548:        register char *p, *b;
                    549:        static char buf[SMAX+1];
                    550: 
                    551:        for(b=buf,p=str; *p != ':' && *p && b < buf+SMAX;)
                    552:                *b++ = *p++;
                    553:        *b++ = NULLCHAR;
                    554:        if (*p == ':')
                    555:                p++;
                    556:        *name = buf;
                    557:        return(p);
                    558: }
                    559: 
                    560: /*
                    561:  * check if requesting files is permitted
                    562:  * return
                    563:  *     TRUE -> request permitted
                    564:  *     FALSE -> request denied
                    565:  */
                    566: requestOK()
                    567: {
                    568:        return(_Request);
                    569: }
                    570: 
                    571: /*
                    572:  * myName - return my name from PERMISSIONS file
                    573:  *     or if not there, from  uucpname()
                    574:  * return: none
                    575:  */
                    576: 
                    577: void
                    578: myName(name)
                    579: char *name;
                    580: {
                    581:        if (*_MyName)
                    582:                strcpy(name, _MyName);
                    583:        else
                    584:                uucpname(name);
                    585:        return;
                    586: }
                    587: 
                    588: /*
                    589:  * check for callback required for any transaction
                    590:  * return:
                    591:  *     TRUE -> callback required
                    592:  *     FALSE-> callback NOT required
                    593:  */
                    594: callBack()
                    595: {
                    596:        return(_CallBack);
                    597: }
                    598: 
                    599: /*
                    600:  * check for callback to send any files from here
                    601:  * This means that the called (SLAVE) system will not switch roles.
                    602:  * return:
                    603:  *     TRUE -> callback requried to send files
                    604:  *     FALSE-> callback NOT required to send files
                    605:  */
                    606: switchRole()
                    607: {
                    608:        return(_Switch);
                    609: }
                    610: 
                    611: /*
                    612:  * Check to see if command is valid for a specific machine.
                    613:  * The PERMISSIONS file has an option XQT=name1:name2:... for
                    614:  * any machine that does not have the default list which is
                    615:  * rmail:rnews
                    616:  * Note that the PERMISSIONS file is read once for each system
                    617:  * at the time the Rmtname is set in xprocess().
                    618:  * Return codes:       
                    619:  *     ok: TRUE
                    620:  *     fail: FALSE
                    621:  */
                    622: cmdOK(cmd, fullcmd)
                    623: char   *cmd, *fullcmd;
                    624: {
                    625:        DEBUG(7, "cmdOK(%s, )\n", cmd);
                    626:        return(cmdMatch(cmd, fullcmd));
                    627: }
                    628: 
                    629: 
                    630: /*
                    631:  * check a name against a list
                    632:  * input:
                    633:  *     name    -> name
                    634:  *     list    -> list of names
                    635:  * return:
                    636:  *     TRUE    -> found path
                    637:  *     FALSE   -> not found
                    638:  */
                    639: static
                    640: int
                    641: listMatch(name, list)
                    642: register char *name, *list[];
                    643: {
                    644:        register i;
                    645: 
                    646:        for (i=0; list[i] != NULL; i++)
                    647:                if (PREFIX(list[i], name))
                    648:                        return(TRUE);
                    649:        return(FALSE);
                    650: }
                    651: 
                    652: 
                    653: /*
                    654:  * Check "name" against a BASENAME or full name of _Commands list.
                    655:  * If "name" specifies full path, check full, else check BASENAME.
                    656:  *  e.g. "name" rmail matches list item /usr/bin/rmail
                    657:  * input:
                    658:  *     name    -> name
                    659:  * output:
                    660:  *     fullname -> copy full command name into fullname if
                    661:  *                 a full path was specified in _Commands;
                    662:  *                 if not, put name into fullname.
                    663:  * return:
                    664:  *     TRUE    -> found path
                    665:  *     FALSE   -> not found
                    666:  */
                    667: static
                    668: cmdMatch(name, fullname)
                    669: register char *name;
                    670: char *fullname;
                    671: {
                    672:        register i;
                    673:        char *bname;
                    674:        int allok = FALSE;
                    675: 
                    676:        for (i=0; _Commands[i] != NULL; i++) {
                    677:                if (EQUALS(_Commands[i], "ALL")) {
                    678:                        /* if ALL specified in the list
                    679:                         * set allok and continue in case
                    680:                         * a full path name is specified for the command
                    681:                         */
                    682:                        allok = TRUE;
                    683:                        continue;
                    684:                }
                    685:                if (name[0] != '/')
                    686:                        bname = BASENAME(_Commands[i], '/');
                    687:                else
                    688:                        bname = _Commands[i];
                    689:                DEBUG(7, "bname=%s\n", bname);
                    690:                if (EQUALS(bname, name)) {
                    691:                        (void) strcpy(fullname, _Commands[i]);
                    692:                        return(TRUE);
                    693:                }
                    694:        }
                    695:        if (allok == TRUE) {
                    696:                /* ALL was specified and the command was not found in list */
                    697:                (void) strcpy(fullname, name);
                    698:                return(TRUE);
                    699:        }
                    700:        (void) strcpy(fullname, "NuLL");        /* this is a dummy command */
                    701:        return(FALSE);
                    702: }
                    703: 
                    704: 
                    705: /*
                    706:  * check the paths for this login/machine
                    707:  * input:
                    708:  *     path    pathname
                    709:  *     flag    CK_READ or CK_WRITE
                    710:  * output:
                    711:  *     path    may be modified to canonical form
                    712:  *             (../, ./, // will be interpreted/removed)
                    713:  * returns:
                    714:  *     0               -> success
                    715:  *     FAIL            -> failure - not a valid path for access
                    716:  */
                    717: chkpth(path, flag)
                    718: char *path;
                    719: {
                    720:        register char *s;
                    721: 
                    722:        /*
                    723:         * this is probably redundant,
                    724:         * because expfile did it, but that's ok
                    725:         * Note - the /../ check is not required because of canPath
                    726:         */
                    727:        if (canPath(path) == FAIL)
                    728:                return(FAIL);
                    729: 
                    730:        if (flag == CK_READ)
                    731:                if (listMatch(path, _RPaths)
                    732:                && !listMatch(path, _NoRPaths))
                    733:                        return(0);
                    734:        if (flag == CK_WRITE)
                    735:                if (listMatch(path, _WPaths)
                    736:                && !listMatch(path, _NoWPaths))
                    737:                        return(0);
                    738: 
                    739: 
                    740:        /* ok if uucp generated D. or X. name for the spool directory */
                    741:        if (PREFIX(RemSpool, path) ) {
                    742:                s = &path[strlen(RemSpool)];
                    743:                if ( (*s++ == '/')
                    744:                  && (*s == DATAPRE || *s == XQTPRE)
                    745:                  && (*(++s) == '.')
                    746:                  && (strchr(s, '/') == NULL) )
                    747:                        return(0);
                    748:        }
                    749: 
                    750:        /*  path name not valid */
                    751:        return(FAIL);
                    752: }
                    753: 
                    754: /*
                    755:  * check write permission of file.
                    756:  * if mopt != NULL and permissions are ok,
                    757:  * a side effect of this routine is to make
                    758:  * directories up to the last part of the
                    759:  * "to" ( if they do not exit).
                    760:  * Input:
                    761:  *     to - a path name of the destination file or directory
                    762:  *     from - full path name of source file
                    763:  *     opt - create directory option (NULL - don't create)
                    764:  * Output:
                    765:  *     to - will be the full path name of the destination file
                    766:  * returns:
                    767:  *     0       ->success
                    768:  *     FAIL    -> failure
                    769:  */
                    770: chkperm(from, to, opt)
                    771: char *from, *to, *opt;
                    772: {
                    773:        register char *lxp, *p;
                    774:        struct stat s;
                    775:        char dir[MAXFULLNAME];
                    776: 
                    777:        if ( *(p = LASTCHAR(to)) == '/')
                    778:            (void) strcpy(p+1, BASENAME(from, '/'));
                    779:        else
                    780:            if (DIRECTORY(to)) {
                    781:                *++p = '/';
                    782:                (void) strcpy(p+1, BASENAME(from, '/'));
                    783:            }
                    784: 
                    785:        /* to is now the full path name of the destination file */
                    786: 
                    787:        if (WRITEANY(to))
                    788:            return(0);
                    789:        if (stat(to, &s) == 0)
                    790:            return(FAIL);       /* file exists, but not writeable */
                    791: 
                    792:        /* file does not exist--check directory and make when necessary */
                    793: 
                    794:        (void) strcpy(dir, to);
                    795:        if ( (lxp=strrchr(dir, '/')) == NULL)
                    796:            return(FAIL);       /* no directory part of name */
                    797:        if (lxp == dir) /* at root */
                    798:            lxp++;
                    799:        *lxp = NULLCHAR;
                    800: 
                    801:        if (!DIRECTORY(dir)) {
                    802:            if (opt == NULL)
                    803:                return(FAIL);   /* no directory and no opt to make them */
                    804:            else if (mkdirs(dir) == FAIL)
                    805:                return(FAIL);
                    806:        }
                    807: 
                    808:        /* the directory now exists--check for writability */
                    809:        if (EQUALS(RemSpool, dir) || WRITEANY(dir))
                    810:            return(0);
                    811: 
                    812:        return(FAIL);
                    813: }

unix.superglobalmegacorp.com

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