Annotation of 43BSDReno/contrib/isode-beta/ftam2/ftam-glob.c, revision 1.1.1.1

1.1       root        1: /* ftam-glob.c - interactive initiator FTAM -- globbing */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/ftam2/RCS/ftam-glob.c,v 7.0 89/11/23 21:54:19 mrose Rel $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/ftam2/RCS/ftam-glob.c,v 7.0 89/11/23 21:54:19 mrose Rel $
                      9:  *
                     10:  *
                     11:  * $Log:       ftam-glob.c,v $
                     12:  * Revision 7.0  89/11/23  21:54:19  mrose
                     13:  * Release 6.0
                     14:  * 
                     15:  */
                     16: 
                     17: /*
                     18:  *                               NOTICE
                     19:  *
                     20:  *    Acquisition, use, and distribution of this module and related
                     21:  *    materials are subject to the restrictions of a license agreement.
                     22:  *    Consult the Preface in the User's Manual for the full terms of
                     23:  *    this agreement.
                     24:  *
                     25:  */
                     26: 
                     27: 
                     28: /*
                     29:  * C-shell glob for random programs.
                     30:  *
                     31:  * Modified for FTAM (and linted)
                     32:  *
                     33:  * Used by permission.
                     34:  */
                     35: 
                     36: #include <stdio.h>
                     37: #include <errno.h>
                     38: #include <pwd.h>
                     39: #include "ftamuser.h"
                     40: 
                     41: 
                     42: #define        QUOTE 0200
                     43: #define        TRIM 0177
                     44: #define        eq(a,b)         (strcmp(a, b)==0)
                     45: #define        GAVSIZ          (NCARGS/6)
                     46: #define        isdir(d)        ((d.st_mode & S_IFMT) == S_IFDIR)
                     47: 
                     48: static char **gargv;           /* Pointer to the (stack) arglist */
                     49: static int    gargc;           /* Number args in gargv */
                     50: static int    gnleft;
                     51: static int    gflag;
                     52: static int tglob();
                     53: char   **glob();
                     54: char   *globerr;
                     55: static char *home;
                     56: struct passwd *getpwnam();
                     57: extern int errno;
                     58: static char *strspl(), **copyblk(), *strend();
                     59: char   *malloc(), *strcpy(), *strcat();
                     60: 
                     61: static int globcnt;
                     62: 
                     63: static
                     64: char   *globchars = "`{[*?";
                     65: 
                     66: static char *gpath, *gpathp, *lastgpathp;
                     67: static int globbed;
                     68: static char *entp;
                     69: static char **sortbas;
                     70: 
                     71: 
                     72: int    chkldir (), chkrdir ();
                     73: static int (*chkdir) () = chkldir;
                     74: 
                     75: int    getldir (), getrdir ();
                     76: static int (*gethdir) () = getldir;
                     77: 
                     78: int    matchldir (), matchrdir ();
                     79: static int (*matchdir) () = matchldir;
                     80: 
                     81: 
                     82: static
                     83: char **
                     84: glob(v)
                     85:        register char *v;
                     86: {
                     87:        char agpath[BUFSIZ];
                     88:        char *agargv[GAVSIZ];
                     89:        char *vv[2];
                     90:        vv[0] = malloc ((unsigned) (strlen (v) + 1));
                     91:        if (vv[0] == (char *)0)
                     92:                fatal("out of memory");
                     93:        (void) strcpy (vv[0], v);
                     94:        v = vv[0];
                     95:        vv[1] = 0;
                     96:        gflag = 0;
                     97:        rscan(vv, tglob);
                     98:        if (gflag == 0)
                     99:                return (copyblk(vv));
                    100:        free(v);
                    101: 
                    102:        globerr = 0;
                    103:        gpath = agpath; gpathp = gpath; *gpathp = 0;
                    104:        lastgpathp = &gpath[sizeof agpath - 2];
                    105:        ginit(agargv); globcnt = 0;
                    106:        collect(v);
                    107:        if (globcnt == 0 && (gflag&1)) {
                    108:                blkfree(gargv), gargv = 0;
                    109:                return (0);
                    110:        } else
                    111:                return (gargv = copyblk(gargv));
                    112: }
                    113: 
                    114: static
                    115: ginit(agargv)
                    116:        char **agargv;
                    117: {
                    118: 
                    119:        agargv[0] = 0; gargv = agargv; sortbas = agargv; gargc = 0;
                    120:        gnleft = NCARGS - 4;
                    121: }
                    122: 
                    123: static
                    124: collect(as)
                    125:        register char *as;
                    126: {
                    127:        if (eq(as, "{") || eq(as, "{}")) {
                    128:                Gcat(as, "");
                    129:                sort();
                    130:        } else
                    131:                acollect(as);
                    132: }
                    133: 
                    134: static
                    135: acollect(as)
                    136:        register char *as;
                    137: {
                    138:        register int ogargc = gargc;
                    139: 
                    140:        gpathp = gpath; *gpathp = 0; globbed = 0;
                    141:        expand(as);
                    142:        if (gargc != ogargc)
                    143:                sort();
                    144: }
                    145: 
                    146: static
                    147: sort()
                    148: {
                    149:        register char **p1, **p2, *c;
                    150:        char **Gvp = &gargv[gargc];
                    151: 
                    152:        p1 = sortbas;
                    153:        while (p1 < Gvp-1) {
                    154:                p2 = p1;
                    155:                while (++p2 < Gvp)
                    156:                        if (strcmp(*p1, *p2) > 0)
                    157:                                c = *p1, *p1 = *p2, *p2 = c;
                    158:                p1++;
                    159:        }
                    160:        sortbas = Gvp;
                    161: }
                    162: 
                    163: static
                    164: expand(as)
                    165:        char *as;
                    166: {
                    167:        register char *cs,
                    168:                      *sgpathp,
                    169:                      *oldcs;
                    170:        char   *csstr;
                    171:        struct stat stb;
                    172: 
                    173:        sgpathp = gpathp;
                    174:        cs = csstr = strdup (as);
                    175:        if (*cs == '~' && gpathp == gpath) {
                    176:                addpath('~');
                    177:                for (cs++; letter(*cs) || digit(*cs) || *cs == '-';)
                    178:                        addpath(*cs++);
                    179:                if (!*cs || *cs == '/') {
                    180:                        if (gpathp != gpath + 1) {
                    181:                                *gpathp = 0;
                    182:                                if ((*gethdir) (gpath + 1))
                    183:                                        globerr = "Unknown user name after ~";
                    184:                                (void) strcpy(gpath, gpath + 1);
                    185:                        } else
                    186:                                (void) strcpy(gpath, home);
                    187:                        gpathp = strend(gpath);
                    188:                }
                    189:        }
                    190:        while (!any(*cs, globchars)) {
                    191:                if (*cs == 0) {
                    192:                        if (!globbed)
                    193:                                Gcat(gpath, "");
                    194:                        else if (stat(gpath, &stb) >= 0) {
                    195:                                Gcat(gpath, "");
                    196:                                globcnt++;
                    197:                        }
                    198:                        goto endit;
                    199:                }
                    200:                addpath(*cs++);
                    201:        }
                    202:        oldcs = cs;
                    203:        while (cs > as && *cs != '/')
                    204:                cs--, gpathp--;
                    205:        if (*cs == '/')
                    206:                cs++, gpathp++;
                    207:        *gpathp = 0;
                    208:        if (*oldcs == '{') {
                    209:                (void) execbrc(cs, ((char *)0));
                    210:                return;
                    211:        }
                    212:        (*matchdir) (cs);
                    213: endit:
                    214:        gpathp = sgpathp;
                    215:        *gpathp = 0;
                    216: 
                    217:        if (csstr)
                    218:            free (csstr);
                    219: }
                    220: 
                    221: static
                    222: matchldir(pattern)
                    223:        char *pattern;
                    224: {
                    225:        char    pat[MAXPATHLEN];
                    226:        struct stat stb;
                    227:        register struct dirent *dp;
                    228:        DIR *dirp;
                    229: 
                    230:        (void) strcpy (pat, pattern);
                    231: 
                    232:        dirp = opendir(*gpath ? gpath : ".");
                    233:        if (dirp == NULL) {
                    234:                if (globbed)
                    235:                        return;
                    236:                goto patherr2;
                    237:        }
                    238:        if (fstat(dirp->dd_fd, &stb) < 0)
                    239:                goto patherr1;
                    240:        if (!isdir(stb)) {
                    241:                errno = ENOTDIR;
                    242:                goto patherr1;
                    243:        }
                    244:        for (errno = 0; dp = readdir(dirp); errno = 0) {
                    245:                if (dp->d_ino == 0)
                    246:                        continue;
                    247:                if (match(dp->d_name, pat)) {
                    248:                        Gcat(gpath, dp->d_name);
                    249:                        globcnt++;
                    250:                }
                    251:        }
                    252:        if (errno)
                    253:            globerr = "corrupted directory";
                    254:        (void) closedir(dirp);
                    255:        return;
                    256: 
                    257: patherr1:
                    258:        (void) closedir(dirp);
                    259: patherr2:
                    260:        globerr = "Bad directory components";
                    261: }
                    262: 
                    263: static
                    264: execbrc(p, s)
                    265:        char *p, *s;
                    266: {
                    267:        char restbuf[BUFSIZ + 2];
                    268:        register char *pe, *pm, *pl;
                    269:        int brclev = 0;
                    270:        char *lm, savec, *sgpathp;
                    271: 
                    272:        for (lm = restbuf; *p != '{'; *lm++ = *p++)
                    273:                continue;
                    274:        for (pe = ++p; *pe; pe++)
                    275:        switch (*pe) {
                    276: 
                    277:        case '{':
                    278:                brclev++;
                    279:                continue;
                    280: 
                    281:        case '}':
                    282:                if (brclev == 0)
                    283:                        goto pend;
                    284:                brclev--;
                    285:                continue;
                    286: 
                    287:        case '[':
                    288:                for (pe++; *pe && *pe != ']'; pe++)
                    289:                        continue;
                    290:                continue;
                    291:        }
                    292: pend:
                    293:        brclev = 0;
                    294:        for (pl = pm = p; pm <= pe; pm++)
                    295:        switch (*pm & (QUOTE|TRIM)) {
                    296: 
                    297:        case '{':
                    298:                brclev++;
                    299:                continue;
                    300: 
                    301:        case '}':
                    302:                if (brclev) {
                    303:                        brclev--;
                    304:                        continue;
                    305:                }
                    306:                goto doit;
                    307: 
                    308:        case ','|QUOTE:
                    309:        case ',':
                    310:                if (brclev)
                    311:                        continue;
                    312: doit:
                    313:                savec = *pm;
                    314:                *pm = 0;
                    315:                (void) strcpy(lm, pl);
                    316:                (void) strcat(restbuf, pe + 1);
                    317:                *pm = savec;
                    318:                if (s == 0) {
                    319:                        sgpathp = gpathp;
                    320:                        expand(restbuf);
                    321:                        gpathp = sgpathp;
                    322:                        *gpathp = 0;
                    323:                } else if (amatch(s, restbuf))
                    324:                        return (1);
                    325:                sort();
                    326:                pl = pm + 1;
                    327:                if (brclev)
                    328:                        return (0);
                    329:                continue;
                    330: 
                    331:        case '[':
                    332:                for (pm++; *pm && *pm != ']'; pm++)
                    333:                        continue;
                    334:                if (!*pm)
                    335:                        pm--;
                    336:                continue;
                    337:        }
                    338:        if (brclev)
                    339:                goto doit;
                    340:        return (0);
                    341: }
                    342: 
                    343: static
                    344: match(s, p)
                    345:        char *s, *p;
                    346: {
                    347:        register int c;
                    348:        register char *sentp;
                    349:        char sglobbed = globbed;
                    350: 
                    351:        if (*s == '.' && *p != '.')
                    352:                return (0);
                    353:        sentp = entp;
                    354:        entp = s;
                    355:        c = amatch(s, p);
                    356:        entp = sentp;
                    357:        globbed = sglobbed;
                    358:        return (c);
                    359: }
                    360: 
                    361: static
                    362: amatch(s, p)
                    363:        register char *s, *p;
                    364: {
                    365:        register int scc;
                    366:        int ok, lc;
                    367:        char *sgpathp;
                    368:        struct stat stb;
                    369:        int c, cc;
                    370: 
                    371:        globbed = 1;
                    372:        for (;;) {
                    373:                scc = *s++ & TRIM;
                    374:                switch (c = *p++) {
                    375: 
                    376:                case '{':
                    377:                        return (execbrc(p - 1, s - 1));
                    378: 
                    379:                case '[':
                    380:                        ok = 0;
                    381:                        lc = 077777;
                    382:                        while (cc = *p++) {
                    383:                                if (cc == ']') {
                    384:                                        if (ok)
                    385:                                                break;
                    386:                                        return (0);
                    387:                                }
                    388:                                if (cc == '-') {
                    389:                                        if (lc <= scc && scc <= *p++)
                    390:                                                ok++;
                    391:                                } else
                    392:                                        if (scc == (lc = cc))
                    393:                                                ok++;
                    394:                        }
                    395:                        if (cc == 0)
                    396:                                if (ok)
                    397:                                        p--;
                    398:                                else
                    399:                                        return 0;
                    400:                        continue;
                    401: 
                    402:                case '*':
                    403:                        if (!*p)
                    404:                                return (1);
                    405:                        if (*p == '/') {
                    406:                                p++;
                    407:                                goto slash;
                    408:                        }
                    409:                        s--;
                    410:                        do {
                    411:                                if (amatch(s, p))
                    412:                                        return (1);
                    413:                        } while (*s++);
                    414:                        return (0);
                    415: 
                    416:                case 0:
                    417:                        return (scc == 0);
                    418: 
                    419:                default:
                    420:                        if (c != scc)
                    421:                                return (0);
                    422:                        continue;
                    423: 
                    424:                case '?':
                    425:                        if (scc == 0)
                    426:                                return (0);
                    427:                        continue;
                    428: 
                    429:                case '/':
                    430:                        if (scc)
                    431:                                return (0);
                    432: slash:
                    433:                        s = entp;
                    434:                        sgpathp = gpathp;
                    435:                        while (*s)
                    436:                                addpath(*s++);
                    437:                        addpath('/');
                    438:                        if ((*chkdir) (gpath, &stb)) 
                    439:                                if (*p == 0) {
                    440:                                        Gcat(gpath, "");
                    441:                                        globcnt++;
                    442:                                } else
                    443:                                        expand(p);
                    444:                        gpathp = sgpathp;
                    445:                        *gpathp = 0;
                    446:                        return (0);
                    447:                }
                    448:        }
                    449: }
                    450: 
                    451: static
                    452: chkldir (path, st)
                    453: char   *path;
                    454: struct stat *st;
                    455: {
                    456:     return (stat (path, st) == 0 && (st -> st_mode & S_IFMT) == S_IFDIR);
                    457: }
                    458: 
                    459: static
                    460: Gmatch(s, p)
                    461:        register char *s, *p;
                    462: {
                    463:        register int scc;
                    464:        int ok, lc;
                    465:        int c, cc;
                    466: 
                    467:        for (;;) {
                    468:                scc = *s++ & TRIM;
                    469:                switch (c = *p++) {
                    470: 
                    471:                case '[':
                    472:                        ok = 0;
                    473:                        lc = 077777;
                    474:                        while (cc = *p++) {
                    475:                                if (cc == ']') {
                    476:                                        if (ok)
                    477:                                                break;
                    478:                                        return (0);
                    479:                                }
                    480:                                if (cc == '-') {
                    481:                                        if (lc <= scc && scc <= *p++)
                    482:                                                ok++;
                    483:                                } else
                    484:                                        if (scc == (lc = cc))
                    485:                                                ok++;
                    486:                        }
                    487:                        if (cc == 0)
                    488:                                if (ok)
                    489:                                        p--;
                    490:                                else
                    491:                                        return 0;
                    492:                        continue;
                    493: 
                    494:                case '*':
                    495:                        if (!*p)
                    496:                                return (1);
                    497:                        for (s--; *s; s++)
                    498:                                if (Gmatch(s, p))
                    499:                                        return (1);
                    500:                        return (0);
                    501: 
                    502:                case 0:
                    503:                        return (scc == 0);
                    504: 
                    505:                default:
                    506:                        if ((c & TRIM) != scc)
                    507:                                return (0);
                    508:                        continue;
                    509: 
                    510:                case '?':
                    511:                        if (scc == 0)
                    512:                                return (0);
                    513:                        continue;
                    514: 
                    515:                }
                    516:        }
                    517: }
                    518: 
                    519: static
                    520: Gcat(s1, s2)
                    521:        register char *s1, *s2;
                    522: {
                    523:        register int len = strlen(s1) + strlen(s2) + 1;
                    524: 
                    525:        if (len >= gnleft || gargc >= GAVSIZ - 1)
                    526:                globerr = "Arguments too long";
                    527:        else {
                    528:                gargc++;
                    529:                gnleft -= len;
                    530:                gargv[gargc] = 0;
                    531:                gargv[gargc - 1] = strspl(s1, s2);
                    532:        }
                    533: }
                    534: 
                    535: static
                    536: addpath(c)
                    537:        char c;
                    538: {
                    539: 
                    540:        if (gpathp >= lastgpathp)
                    541:                globerr = "Pathname too long";
                    542:        else {
                    543:                *gpathp++ = c;
                    544:                *gpathp = 0;
                    545:        }
                    546: }
                    547: 
                    548: static
                    549: rscan(t, f)
                    550:        register char **t;
                    551:        int (*f)();
                    552: {
                    553:        register char *p, c;
                    554: 
                    555:        while (p = *t++) {
                    556:                if (f == tglob)
                    557:                        if (*p == '~')
                    558:                                gflag |= 2;
                    559:                        else if (eq(p, "{") || eq(p, "{}"))
                    560:                                continue;
                    561:                while (c = *p++)
                    562:                        (*f)(c);
                    563:        }
                    564: }
                    565: 
                    566: #ifdef notdef
                    567: static
                    568: scan(t, f)
                    569:        register char **t;
                    570:        int (*f)();
                    571: {
                    572:        register char *p, c;
                    573: 
                    574:        while (p = *t++)
                    575:                while (c = *p)
                    576:                        *p++ = (*f)(c);
                    577: }
                    578: #endif
                    579: 
                    580: static
                    581: tglob(c)
                    582:        register char c;
                    583: {
                    584: 
                    585:        if (any(c, globchars))
                    586:                gflag |= c == '{' ? 2 : 1;
                    587:        return (c);
                    588: }
                    589: 
                    590: #ifdef notdef
                    591: static
                    592: trim(c)
                    593:        char c;
                    594: {
                    595: 
                    596:        return (c & TRIM);
                    597: }
                    598: #endif
                    599: 
                    600: static
                    601: letter(c)
                    602:        register char c;
                    603: {
                    604: 
                    605:        return (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '_');
                    606: }
                    607: 
                    608: static
                    609: digit(c)
                    610:        register char c;
                    611: {
                    612: 
                    613:        return (c >= '0' && c <= '9');
                    614: }
                    615: 
                    616: static
                    617: any(c, s)
                    618:        register int c;
                    619:        register char *s;
                    620: {
                    621: 
                    622:        while (*s)
                    623:                if (*s++ == c)
                    624:                        return(1);
                    625:        return(0);
                    626: }
                    627: blklen(av)
                    628:        register char **av;
                    629: {
                    630:        register int i = 0;
                    631: 
                    632:        while (*av++)
                    633:                i++;
                    634:        return (i);
                    635: }
                    636: 
                    637: char **
                    638: blkcpy(oav, bv)
                    639:        char **oav;
                    640:        register char **bv;
                    641: {
                    642:        register char **av = oav;
                    643: 
                    644:        while (*av++ = *bv++)
                    645:                continue;
                    646:        return (oav);
                    647: }
                    648: 
                    649: blkfree(av0)
                    650:        char **av0;
                    651: {
                    652:        register char **av = av0;
                    653: 
                    654:        while (*av)
                    655:                free(*av++);
                    656:        free((char *)av0);
                    657: }
                    658: 
                    659: static
                    660: char *
                    661: strspl(cp, dp)
                    662:        register char *cp, *dp;
                    663: {
                    664:        register char *ep = malloc((unsigned)(strlen(cp) + strlen(dp) + 1));
                    665: 
                    666:        if (ep == (char *)0)
                    667:                fatal("out of memory");
                    668:        (void) strcpy(ep, cp);
                    669:        (void) strcat(ep, dp);
                    670:        return (ep);
                    671: }
                    672: 
                    673: static
                    674: char **
                    675: copyblk(v)
                    676:        register char **v;
                    677: {
                    678:        register char **nv = (char **)malloc((unsigned)((blklen(v) + 1) *
                    679:                                                sizeof(char **)));
                    680:        if (nv == (char **)0)
                    681:                fatal("out of memory");
                    682: 
                    683:        return (blkcpy(nv, v));
                    684: }
                    685: 
                    686: static
                    687: char *
                    688: strend(cp)
                    689:        register char *cp;
                    690: {
                    691: 
                    692:        while (*cp)
                    693:                cp++;
                    694:        return (cp);
                    695: }
                    696: /*
                    697:  * Extract a home directory from the password file
                    698:  * The argument points to a buffer where the name of the
                    699:  * user whose home directory is sought is currently.
                    700:  * We write the home directory of the user back there.
                    701:  */
                    702: static
                    703: getldir(hdir)
                    704:        char *hdir;
                    705: {
                    706:        register struct passwd *pp = getpwnam(hdir);
                    707: 
                    708:        if (pp == 0)
                    709:                return (1);
                    710:        (void) strcpy(hdir, pp->pw_dir);
                    711:        return (0);
                    712: }
                    713: 
                    714: /*  */
                    715: 
                    716: #undef isdir
                    717: 
                    718: 
                    719: int    xglobbed;
                    720: 
                    721: static OID   matchoid;
                    722: 
                    723: /*  */
                    724: 
                    725: char   *xglob1val (v, remote)
                    726: char   *v;
                    727: int    remote;
                    728: {
                    729:     register char **gp;
                    730:     char   *cp,
                    731:            *gb[2];
                    732: 
                    733:     gb[0] = v;
                    734:     gb[1] = NULLCP;
                    735: 
                    736:     if ((gp = xglob (gb, remote)) == NULLVP)
                    737:        return NULLCP;
                    738: 
                    739:     if (gp[1]) {
                    740:        advise (NULLCP, "%s: ambiguous", v);
                    741:        blkfree (gp);
                    742:        return NULLCP;
                    743:     }
                    744: 
                    745:     cp = *gp;
                    746:     free ((char *) gp);
                    747: 
                    748:     return cp;
                    749: }
                    750: 
                    751: /*  */
                    752: 
                    753: char  **xglob (v, remote)
                    754: char  **v;
                    755: int    remote;
                    756: {
                    757:     register int    i;
                    758:     register char  *cp,
                    759:                  **gp,
                    760:                   **vp;
                    761:     char   *loses;
                    762: 
                    763:     xglobbed = 0;
                    764: 
                    765:     if (!globbing) {
                    766:        register char *dp;
                    767: 
                    768:        for (gp = vp = copyblk (v); *gp; gp++) {
                    769:            cp = remote ? str2file (*gp) : *gp;
                    770:            if ((dp = malloc ((unsigned) (strlen (cp) + 1))) == NULLCP)
                    771:                fatal ("out of memory");
                    772:            (void) strcpy (dp, cp);
                    773:            *gp = dp;
                    774:        }
                    775: 
                    776:        return vp;
                    777:     }
                    778: 
                    779:     if (remote) {
                    780:        switch (realstore) {
                    781:            case RFS_UNKNOWN: 
                    782:                advise (NULLCP, "%s", rs_unknown);
                    783:                return NULLVP;
                    784: 
                    785:            case RFS_UNIX: 
                    786:                home = "~";
                    787:                chkdir = chkrdir;
                    788:                gethdir = getrdir;
                    789:                matchdir = matchrdir;
                    790:                break;
                    791: 
                    792:            default: 
                    793:                advise (NULLCP, "%s", rs_support);
                    794:                return NULLVP;
                    795:        }
                    796:     }
                    797:     else {
                    798:        home = myhome;
                    799:        chkdir = chkldir;
                    800:        gethdir = getldir;
                    801:        matchdir = matchldir;
                    802:     }
                    803: 
                    804:     for (i = 0, loses = NULL, vp = NULLVP; cp = *v++; ) {
                    805:        if ((gp = glob (remote ? str2file (cp) : cp)) == NULLVP) {
                    806:            if (!loses && globerr)
                    807:                loses = globerr;
                    808:            continue;
                    809:        }
                    810: 
                    811:        if (vp) {
                    812:            register int    j;
                    813:            register char **xp,
                    814:                          **yp;
                    815: 
                    816:            if ((j = blklen (gp)) > 1)
                    817:                xglobbed++;
                    818: 
                    819:            if ((vp = (char **) realloc ((char *) vp,
                    820:                                    ((unsigned) (i + j + 1)) * sizeof *vp))
                    821:                    == NULLVP)
                    822:                fatal ("out of memory");
                    823: 
                    824:            for (xp = vp + i, yp = gp; *xp = *yp; xp++, yp++)
                    825:                continue;
                    826:            i += j;
                    827: 
                    828:            free ((char *) gp);
                    829:        }
                    830:        else
                    831:            if ((i = blklen (vp = gp)) > 1)
                    832:                xglobbed++;
                    833:     }
                    834: 
                    835:     if (vp == NULLVP || *vp == NULLCP) {
                    836:        if (!loses)
                    837:            loses = "no files match specification";
                    838:        advise (NULLCP, "%s", loses);
                    839: 
                    840:        if (vp) {
                    841:            blkfree (vp);
                    842:            vp = NULLVP;
                    843:        }
                    844:     }
                    845: 
                    846:     if (vp && debug)
                    847:        for (gp = vp; *gp; gp++)
                    848:            printf ("%d: \"%s\"\n", gp - vp, *gp);
                    849: 
                    850:     return vp;
                    851: }
                    852: 
                    853: /*  */
                    854: 
                    855: static matchrdir (pattern)
                    856: char   *pattern;
                    857: {
                    858:     register char  *cp;
                    859:     char    cwd[MAXPATHLEN],
                    860:            pat[MAXPATHLEN];
                    861:     struct FADUidentity faduids;
                    862:     register struct FADUidentity *faduid = &faduids;
                    863:     register struct filent *fi, *gi;
                    864:     
                    865:     (void) strcpy (pat, pattern);
                    866: 
                    867:     switch (isdir (gpath, cwd, 1)) {
                    868:        case NOTOK:
                    869:        case OK:
                    870:            if (!globbed)
                    871:                globerr = "Bad directory components";
                    872:            return;
                    873: 
                    874:        default:
                    875:            if (cwd[0] == NULL)
                    876:                (void) strcpy (cwd, gpath);
                    877:            cp = cwd + strlen (cwd) - 1;
                    878:            if (*cp == '/')
                    879:                *cp = NULL;
                    880:            else {
                    881:                *++cp = '/';
                    882:                *++cp = NULL;
                    883:            }
                    884:            cp = cwd;
                    885:            break;
                    886:     }
                    887:     
                    888:     faduid -> fa_type = FA_FIRSTLAST;
                    889:     faduid -> fa_firstlast = FA_FIRST;
                    890: 
                    891:     (void) fdffnx (NOTOK, (struct PSAPdata *) 0, 1);
                    892:     (void) getvf (cp, NULLCP, faduid, &vfs[VFS_FDF], fdffnx);
                    893: 
                    894:     fi = gi = filents, filents = NULL;
                    895:     (void) fdffnx (NOTOK, (struct PSAPdata *) 0, 0);
                    896: 
                    897:     {
                    898:        register int len = strlen (cp);
                    899: 
                    900:        for (fi = gi; fi; fi = fi -> fi_next)
                    901:            if (strncmp (fi -> fi_name, cp, len) == 0)
                    902:                fi -> fi_entry = fi -> fi_name + len;
                    903:     }
                    904: 
                    905:     for (fi = gi; fi; fi = fi -> fi_next) {
                    906:        matchoid = fi -> fi_oid;
                    907:        if (match (fi -> fi_entry, pat)) {
                    908:            Gcat (gpath, fi -> fi_entry);
                    909:            globcnt++;
                    910:        }
                    911:     }
                    912: 
                    913:     filents = gi;
                    914:     (void) fdffnx (NOTOK, (struct PSAPdata *) 0, 0);
                    915: }
                    916: 
                    917: /*  */
                    918: 
                    919: /* ARGSUSED */
                    920: 
                    921: static chkrdir (path, st)
                    922: char   *path;
                    923: struct stat *st;
                    924: {
                    925:     return (oid_cmp (vfs[VFS_FDF].vf_oid, matchoid) == 0);
                    926: }
                    927: 
                    928: /*  */
                    929: 
                    930: static getrdir (hdir)
                    931: char    *hdir;
                    932: {
                    933:     char    buffer[BUFSIZ];
                    934: 
                    935:     (void) sprintf (buffer, "~%s", hdir);
                    936: 
                    937:     return (isdir (buffer, hdir, 1) != DONE);
                    938: }
                    939: 
                    940: /*  */
                    941: 
                    942: static int  fatal (s)
                    943: char   *s;
                    944: {
                    945:     adios (NULLCP, "%s", s);
                    946: }
                    947: 
                    948: /*  */
                    949: 
                    950: int    f_echo (vec)
                    951: char  **vec;
                    952: {
                    953:     char  **gb,
                    954:           **gp,
                    955:                   *gs;
                    956: 
                    957:     if (*++vec && (gp = gb = xglob (vec, 1))) {
                    958:        char   *cp;
                    959: 
                    960:        for (cp = ""; *gp; gp++, cp = " "){
                    961:                gs = rindex (*gp, '/');
                    962:                if (gs == NULL)
                    963:                printf ("%s%s", cp, *gp);
                    964:                else
                    965:                printf ("%s%s", cp, ++gs);
                    966:        }
                    967:        printf ("\n");
                    968: 
                    969:        blkfree (gb);
                    970:     }
                    971: 
                    972:     return OK;
                    973: }

unix.superglobalmegacorp.com

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