Annotation of 43BSDReno/contrib/mh/zotnet/bboards/getbbent.c, revision 1.1.1.1

1.1       root        1: /* getbbent.c - subroutines for accessing the BBoards file */
                      2: 
                      3: /* LINTLIBRARY */
                      4: 
                      5: #include "bboards.h"
                      6: #ifndef        MMDFONLY
                      7: #include "../h/strings.h"
                      8: #include <sys/types.h>
                      9: #else  MMDFONLY
                     10: #include "util.h"
                     11: #include "mmdf.h"
                     12: #include "strings.h"
                     13: #endif MMDFONLY
                     14: #include <ctype.h>
                     15: #include <pwd.h>
                     16: #include <grp.h>
                     17: #include <stdio.h>
                     18: #include <sys/stat.h>
                     19: 
                     20: 
                     21: #ifndef        MMDFONLY
                     22: #define        NOTOK   (-1)
                     23: #define        OK      0
                     24: #endif not MMDFONLY
                     25: 
                     26: 
                     27: #define        MaxBBAka        100
                     28: #define        MaxBBLdr        100
                     29: #define        MaxBBDist       100
                     30: 
                     31: 
                     32: #define        NCOLON  9               /* currently 10 fields per entry */
                     33: 
                     34: #define        COLON   ':'
                     35: #define        COMMA   ','
                     36: #define        NEWLINE '\n'
                     37: 
                     38: 
                     39: #define        ARCHIVE "archive"
                     40: #define        CNTFILE ".cnt"
                     41: #define        DSTFILE ".dist"
                     42: #define        MAPFILE ".map"
                     43: 
                     44: /*  */
                     45: 
                     46: static int  BBuid = -1;
                     47: 
                     48: static unsigned int  BBflags = SB_NULL;
                     49: 
                     50: static char BBName[BUFSIZ] = BBOARDS;
                     51: static char BBDir[BUFSIZ] = "";
                     52: static char BBData[BUFSIZ] = "";
                     53: 
                     54: static  FILE *BBfile = NULL;
                     55: 
                     56: 
                     57: static struct bboard    BB;
                     58: static struct bboard   *bb = &BB;
                     59: 
                     60: static int  BBload = 1;
                     61: 
                     62: static char BBFile[BUFSIZ];
                     63: static char BBArchive[BUFSIZ];
                     64: static char BBInfo[BUFSIZ];
                     65: static char BBMap[BUFSIZ];
                     66: static char *BBAkas[MaxBBAka];
                     67: static char *BBLeaders[MaxBBLdr];
                     68: static char *BBDists[MaxBBDist];
                     69: static char BBAddr[BUFSIZ];
                     70: static char BBRequest[BUFSIZ];
                     71: static char BBDate[BUFSIZ];
                     72: static char BBErrors[BUFSIZ];
                     73: 
                     74: #ifdef MMDFONLY
                     75: extern LLog *logptr;
                     76: #endif MMDFONLY
                     77: 
                     78: char *crypt(), *getpass();
                     79: struct group  *getgrnam();
                     80: struct passwd *getpwnam(), *getpwuid();
                     81: 
                     82: static int setbbaux(), setpwaux(), BBread(), getbbitem(), bblose();
                     83: static char *bbskip(), *getcpy();
                     84: 
                     85: /*  */
                     86: 
                     87: setbbfile(file, f)
                     88:        register char *file;
                     89:        register int f;
                     90: {
                     91:     if (BBuid == -1)
                     92:        return setbbinfo (BBOARDS, file, f);
                     93: 
                     94:     (void) strcpy (BBData, file);
                     95: 
                     96:     BBflags = SB_NULL;
                     97:     (void) endbbent ();
                     98: 
                     99:     return setbbent (f);
                    100: }
                    101: 
                    102: /*  */
                    103: 
                    104: setbbinfo(user, file, f)
                    105:        register char *user, *file;
                    106:        register int f;
                    107: {
                    108:     register struct passwd *pw;
                    109: 
                    110:     if ((pw = getpwnam (user)) == NULL) {
                    111:        (void) sprintf (BBErrors, "unknown user: %s", user);
                    112:        return 0;
                    113:     }
                    114: 
                    115:     return setpwinfo (pw, file, f);
                    116: }
                    117: 
                    118: 
                    119: setpwinfo(pw, file, f)
                    120:        register struct passwd *pw;
                    121:        register char *file;
                    122:        register int f;
                    123: {
                    124:     if (!setpwaux (pw, file))
                    125:        return 0;
                    126: 
                    127:     BBflags = SB_NULL;
                    128:     (void) endbbent ();
                    129: 
                    130:     return setbbent (f);
                    131: }
                    132: 
                    133: /*  */
                    134: 
                    135: static int
                    136: setbbaux(name, file)
                    137:        register char *name, *file;
                    138: {
                    139:     register struct passwd *pw;
                    140: 
                    141:     if ((pw = getpwnam (name)) == NULL) {
                    142:        (void) sprintf (BBErrors, "unknown user: %s", name);
                    143:        return 0;
                    144:     }
                    145: 
                    146:     return setpwaux (pw, file);
                    147: }
                    148: 
                    149: 
                    150: static int
                    151: setpwaux(pw, file)
                    152:        register struct passwd *pw;
                    153:        register char *file;
                    154: {
                    155:     (void) strcpy (BBName, pw -> pw_name);
                    156:     BBuid = pw -> pw_uid;
                    157:     (void) strcpy (BBDir, pw -> pw_dir);
                    158:     (void) sprintf (BBData, "%s/%s",
                    159:            *file != '/' ? BBDir : "",
                    160:            *file != '/' ? file : file + 1);
                    161: 
                    162:     BBflags = SB_NULL;
                    163: 
                    164:     return 1;
                    165: }
                    166: 
                    167: /*  */
                    168: 
                    169: setbbent(f)
                    170:        register int f;
                    171: {
                    172:     if (BBfile == NULL) {
                    173:        if (BBuid == -1 && !setbbaux (BBOARDS, BBDB))
                    174:            return 0;
                    175: 
                    176:        if ((BBfile = fopen (BBData, "r")) == NULL) {
                    177:            (void) sprintf (BBErrors, "unable to open: %s", BBData);
                    178:            return 0;
                    179:        }
                    180:     }
                    181:     else
                    182:        rewind (BBfile);
                    183: 
                    184:     BBflags |= f;
                    185:     return (BBfile != NULL);
                    186: }
                    187: 
                    188: 
                    189: int     endbbent () {
                    190:     if (BBfile != NULL && !(BBflags & SB_STAY)) {
                    191:        (void) fclose (BBfile);
                    192:        BBfile = NULL;
                    193:     }
                    194: 
                    195:     return 1;
                    196: }
                    197: 
                    198: 
                    199: long
                    200: getbbtime()
                    201: {
                    202:     struct stat st;
                    203: 
                    204:     if (BBfile == NULL) {
                    205:        if (BBuid == -1 && !setbbaux (BBOARDS, BBDB))
                    206:            return 0;
                    207: 
                    208:        if (stat (BBData, &st) == NOTOK) {
                    209:            (void) sprintf (BBErrors, "unable to stat: %s", BBData);
                    210:            return 0;
                    211:        }
                    212:     }
                    213:     else
                    214:        if (fstat (fileno (BBfile), &st) == NOTOK) {
                    215:            (void) sprintf (BBErrors, "unable to fstat: %s", BBData);
                    216:            return 0;
                    217:        }
                    218: 
                    219:     return ((long) st.st_mtime);
                    220: }
                    221: 
                    222: /*  */
                    223: 
                    224: struct bboard  *
                    225: getbbent()
                    226: {
                    227:     register int    count;
                    228:     register char  *p,
                    229:                    *q,
                    230:                    *r,
                    231:                    *d,
                    232:                    *f,
                    233:                   **s;
                    234:     static char line[BUFSIZ];
                    235: 
                    236:     if (BBfile == NULL && !setbbent (SB_NULL))
                    237:        return NULL;
                    238: 
                    239: retry: ;
                    240:     if ((p = fgets (line, sizeof line, BBfile)) == NULL)
                    241:        return NULL;
                    242: 
                    243:     for (q = p, count = 0; *q != NULL && *q != NEWLINE; q++)
                    244:        if (*q == COLON)
                    245:            count++;
                    246: 
                    247:     if (count != NCOLON) {
                    248: #ifdef MMDFONLY
                    249:        if (q = index (p, NEWLINE))
                    250:            *q = NULL;
                    251:        ll_log (logptr, LLOGTMP, "bad entry in %s: %s", BBData, p);
                    252: #endif MMDFONLY
                    253:        goto retry;
                    254:     }
                    255: 
                    256:     bb -> bb_name = p;
                    257:     p = q = bbskip (p, COLON);
                    258:     p = bb -> bb_file = bbskip (p, COLON);
                    259:     bb -> bb_archive = bb -> bb_info = bb -> bb_map = "";
                    260:     p = bb -> bb_passwd = bbskip (p, COLON);
                    261:     p = r = bbskip (p, COLON);
                    262:     p = bb -> bb_addr = bbskip (p, COLON);
                    263:     p = bb -> bb_request = bbskip (p, COLON);
                    264:     p = bb -> bb_relay = bbskip (p, COLON);
                    265:     p = d = bbskip (p, COLON);
                    266:     p = f = bbskip (p, COLON);
                    267:     (void) bbskip (p, NEWLINE);
                    268: 
                    269:     s = bb -> bb_aka = BBAkas;
                    270:     while (*q) {
                    271:        *s++ = q;
                    272:        q = bbskip (q, COMMA);
                    273:     }
                    274:     *s = NULL;
                    275: 
                    276:     s = bb -> bb_leader = BBLeaders;
                    277:     if (*r == NULL) {
                    278:        if (!(BBflags & SB_FAST))
                    279:            *s++ = BBName;
                    280:     }
                    281:     else
                    282:        while (*r) {
                    283:            *s++ = r;
                    284:            r = bbskip (r, COMMA);
                    285:        }
                    286:     *s = NULL;
                    287: 
                    288:     s = bb -> bb_dist = BBDists;
                    289:     while (*d) {
                    290:        *s++ = d;
                    291:        d = bbskip (d, COMMA);
                    292:     }
                    293:     *s = NULL;
                    294: 
                    295:     if (*f)
                    296:        (void) sscanf (f, "%o", &bb -> bb_flags);
                    297:     else
                    298:        bb -> bb_flags = BB_NULL;
                    299:     bb -> bb_count = bb -> bb_maxima = 0;
                    300:     bb -> bb_date = NULL;
                    301:     bb -> bb_next = bb -> bb_link = bb -> bb_chain = NULL;
                    302: 
                    303:     if (BBload)
                    304:        BBread ();
                    305: 
                    306:     return bb;
                    307: }
                    308: 
                    309: /*  */
                    310: 
                    311: struct bboard *
                    312: getbbnam(name)
                    313:        register char *name;
                    314: {
                    315:     register struct bboard *b = NULL;
                    316: 
                    317:     if (!setbbent (SB_NULL))
                    318:        return NULL;
                    319:     BBload = 0;
                    320:     while ((b = getbbent ()) && strcmp (name, b -> bb_name))
                    321:        continue;
                    322:     BBload = 1;
                    323:     (void) endbbent ();
                    324: 
                    325:     if (b != NULL)
                    326:        BBread ();
                    327: 
                    328:     return b;
                    329: }
                    330: 
                    331: 
                    332: struct bboard *
                    333: getbbaka(aka)
                    334:        register char *aka;
                    335: {
                    336:     register char **ap;
                    337:     register struct bboard *b = NULL;
                    338: 
                    339:     if (!setbbent (SB_NULL))
                    340:        return NULL;
                    341:     BBload = 0;
                    342:     while ((b = getbbent ()) != NULL)
                    343:        for (ap = b -> bb_aka; *ap; ap++)
                    344:            if (strcmp (aka, *ap) == 0)
                    345:                goto hit;
                    346: hit: ;
                    347:     BBload = 1;
                    348:     (void) endbbent ();
                    349: 
                    350:     if (b != NULL)
                    351:        BBread ();
                    352: 
                    353:     return b;
                    354: }
                    355: 
                    356: /*  */
                    357: 
                    358: static int
                    359: BBread()
                    360: {
                    361:     register int    i;
                    362:     register char  *cp,
                    363:                    *dp,
                    364:                   *p,
                    365:                   *r;
                    366:     char    prf[BUFSIZ];
                    367:     static char line[BUFSIZ];
                    368:     register    FILE * info;
                    369: 
                    370:     if (BBflags & SB_FAST)
                    371:        return;
                    372: 
                    373:     p = index (bb -> bb_request, '@');
                    374:     r = index (bb -> bb_addr, '@');
                    375:     BBRequest[0] = NULL;
                    376: 
                    377:     if (*bb -> bb_request == '-')
                    378:        if (p == NULL && r && *r == '@')
                    379:            (void) sprintf (BBRequest, "%s%s%s",
                    380:                    bb -> bb_name, bb -> bb_request, r);
                    381:        else
                    382:            (void) sprintf (BBRequest, "%s%s",
                    383:                    bb -> bb_name, bb -> bb_request);
                    384:     else
                    385:        if (p == NULL && r && *r == '@' && *bb -> bb_request)
                    386:            (void) sprintf (BBRequest, "%s%s", bb -> bb_request, r);
                    387: 
                    388:     if (BBRequest[0])
                    389:        bb -> bb_request = BBRequest;
                    390:     else
                    391:        if (*bb -> bb_request == NULL)
                    392:            bb -> bb_request = *bb -> bb_addr ? bb -> bb_addr
                    393:                : bb -> bb_leader[0];
                    394: 
                    395:     if (*bb -> bb_addr == '@') {
                    396:        (void) sprintf (BBAddr, "%s%s", bb -> bb_name, bb -> bb_addr);
                    397:        bb -> bb_addr = BBAddr;
                    398:     }
                    399:     else
                    400:        if (*bb -> bb_addr == NULL)
                    401:            bb -> bb_addr = bb -> bb_name;
                    402: 
                    403:     if (*bb -> bb_file == NULL)
                    404:        return;
                    405:     if (*bb -> bb_file != '/') {
                    406:        (void) sprintf (BBFile, "%s/%s", BBDir, bb -> bb_file);
                    407:        bb -> bb_file = BBFile;
                    408:     }
                    409: 
                    410:     if ((cp = rindex (bb -> bb_file, '/')) == NULL || *++cp == NULL)
                    411:        (void) strcpy (prf, ""), cp = bb -> bb_file;
                    412:     else
                    413:        (void) sprintf (prf, "%.*s", cp - bb -> bb_file, bb -> bb_file);
                    414:     if ((dp = index (cp, '.')) == NULL)
                    415:        dp = cp + strlen (cp);
                    416: 
                    417:     (void) sprintf (BBArchive, "%s%s/%s", prf, ARCHIVE, cp);
                    418:     bb -> bb_archive = BBArchive;
                    419:     (void) sprintf (BBInfo, "%s.%.*s%s", prf, dp - cp, cp, CNTFILE);
                    420:     bb -> bb_info = BBInfo;
                    421:     (void) sprintf (BBMap, "%s.%.*s%s", prf, dp - cp, cp, MAPFILE);
                    422:     bb -> bb_map = BBMap;
                    423: 
                    424:     if ((info = fopen (bb -> bb_info, "r")) == NULL)
                    425:        return;
                    426: 
                    427:     if (fgets (line, sizeof line, info) && (i = atoi (line)) > 0)
                    428:        bb -> bb_maxima = (unsigned) i;
                    429:     if (!feof (info) && fgets (line, sizeof line, info)) {
                    430:        (void) strcpy (BBDate, line);
                    431:        if (cp = index (BBDate, NEWLINE))
                    432:            *cp = NULL;
                    433:        bb -> bb_date = BBDate;
                    434:     }
                    435: 
                    436:     (void) fclose (info);
                    437: }
                    438: 
                    439: /*  */
                    440: 
                    441: ldrbb(b)
                    442:        register struct bboard *b;
                    443: {
                    444:     register char  *p,
                    445:                   **q,
                    446:                   **r;
                    447:     static int  uid = 0,
                    448:                 gid = 0;
                    449:     static char username[10] = "";
                    450:     register struct passwd *pw;
                    451:     register struct group  *gr;
                    452: 
                    453:     if (b == NULL)
                    454:        return 0;
                    455:     if (BBuid == -1 && !setbbaux (BBOARDS, BBDB))
                    456:        return 0;
                    457: 
                    458:     if (username[0] == NULL) {
                    459:        if ((pw = getpwuid (uid = getuid ())) == NULL)
                    460:            return 0;
                    461:        gid = getgid ();
                    462:        (void) strcpy (username, pw -> pw_name);
                    463:     }
                    464: 
                    465:     if (uid == BBuid)
                    466:        return 1;
                    467: 
                    468:     q = b -> bb_leader;
                    469:     while (p = *q++)
                    470:        if (*p == '=') {
                    471:            if ((gr = getgrnam (++p)) == NULL)
                    472:                continue;
                    473:            if (gid == gr -> gr_gid)
                    474:                return 1;
                    475:            r = gr -> gr_mem;
                    476:            while (p = *r++)
                    477:                if (strcmp (username, p) == 0)
                    478:                    return 1;
                    479:        }
                    480:        else
                    481:            if (strcmp (username, p) == 0)
                    482:                return 1;
                    483: 
                    484:     return 0;
                    485: }
                    486: 
                    487: /*  */
                    488: 
                    489: ldrchk(b)
                    490:        register struct bboard *b;
                    491: {
                    492:     if (b == NULL)
                    493:        return 0;
                    494: 
                    495:     if (*b -> bb_passwd == NULL)
                    496:        return 1;
                    497: 
                    498:     if (strcmp (b -> bb_passwd,
                    499:                crypt (getpass ("Password: "), b -> bb_passwd)) == 0)
                    500:        return 1;
                    501: 
                    502:     fprintf (stderr, "Sorry\n");
                    503:     return 0;
                    504: }
                    505: 
                    506: /*  */
                    507: 
                    508: struct bboard *
                    509: getbbcpy(bp)
                    510:        register struct bboard *bp;
                    511: {
                    512:     register char **p,
                    513:                   **q;
                    514:     register struct bboard *b;
                    515: 
                    516:     if (bp == NULL)
                    517:        return NULL;
                    518: 
                    519:     b = (struct bboard *) malloc ((unsigned) sizeof *b);
                    520:     if (b == NULL)
                    521:        return NULL;
                    522: 
                    523:     b -> bb_name = getcpy (bp -> bb_name);
                    524:     b -> bb_file = getcpy (bp -> bb_file);
                    525:     b -> bb_archive = getcpy (bp -> bb_archive);
                    526:     b -> bb_info = getcpy (bp -> bb_info);
                    527:     b -> bb_map = getcpy (bp -> bb_map);
                    528:     b -> bb_passwd = getcpy (bp -> bb_passwd);
                    529:     b -> bb_flags = bp -> bb_flags;
                    530:     b -> bb_count = bp -> bb_count;
                    531:     b -> bb_maxima = bp -> bb_maxima;
                    532:     b -> bb_date = getcpy (bp -> bb_date);
                    533:     b -> bb_addr = getcpy (bp -> bb_addr);
                    534:     b -> bb_request = getcpy (bp -> bb_request);
                    535:     b -> bb_relay = getcpy (bp -> bb_relay);
                    536: 
                    537:     for (p = bp -> bb_aka; *p; p++)
                    538:        continue;
                    539:     b -> bb_aka =
                    540:        q = (char **) calloc ((unsigned) (p - bp -> bb_aka + 1), sizeof *q);
                    541:     if (q == NULL)
                    542:        return NULL;
                    543:     for (p = bp -> bb_aka; *p; *q++ = getcpy (*p++))
                    544:        continue;
                    545:     *q = NULL;
                    546: 
                    547:     for (p = bp -> bb_leader; *p; p++)
                    548:        continue;
                    549:     b -> bb_leader =
                    550:        q = (char **) calloc ((unsigned) (p - bp -> bb_leader + 1), sizeof *q);
                    551:     if (q == NULL)
                    552:        return NULL;
                    553:     for (p = bp -> bb_leader; *p; *q++ = getcpy (*p++))
                    554:        continue;
                    555:     *q = NULL;
                    556: 
                    557:     for (p = bp -> bb_dist; *p; p++)
                    558:        continue;
                    559:     b -> bb_dist =
                    560:        q = (char **) calloc ((unsigned) (p - bp -> bb_dist + 1), sizeof *q);
                    561:     if (q == NULL)
                    562:        return NULL;
                    563:     for (p = bp -> bb_dist; *p; *q++ = getcpy (*p++))
                    564:        continue;
                    565:     *q = NULL;
                    566: 
                    567:     b -> bb_next = bp -> bb_next;
                    568:     b -> bb_link = bp -> bb_link;
                    569:     b -> bb_chain = bp -> bb_chain;
                    570: 
                    571:     return b;
                    572: }
                    573: 
                    574: /*  */
                    575: 
                    576: getbbdist(bb, action)
                    577:        register struct bboard *bb;
                    578:        register int (*action)();
                    579: {
                    580:     register int    result;
                    581:     register char **dp;
                    582: 
                    583:     BBErrors[0] = NULL;
                    584:     for (dp = bb -> bb_dist; *dp; dp++)
                    585:        if (result = getbbitem (bb, *dp, action))
                    586:            return result;
                    587: 
                    588:     return result;
                    589: }
                    590: 
                    591: char    *getbberr () {
                    592:     return (BBErrors[0] ? BBErrors : NULL);
                    593: };
                    594: 
                    595: /*  */
                    596: 
                    597: static int
                    598: getbbitem(bb, item, action)
                    599:        register struct bboard *bb;
                    600:        register char *item;
                    601:        register int (*action)();
                    602: {
                    603:     register int    result;
                    604:     register char  *cp,
                    605:                    *dp,
                    606:                    *hp,
                    607:                    *np;
                    608:     char    mbox[BUFSIZ],
                    609:             buffer[BUFSIZ],
                    610:             file[BUFSIZ],
                    611:             host[BUFSIZ],
                    612:             prf[BUFSIZ];
                    613:     register FILE *fp;
                    614: 
                    615:     switch (*item) {
                    616:        case '*':
                    617:            switch (*++item) {
                    618:                case '/':
                    619:                    hp = item;
                    620:                    break;
                    621: 
                    622:                case NULL:
                    623:                    if ((cp = rindex (bb -> bb_file, '/')) == NULL || *++cp == NULL)
                    624:                        (void) strcpy (prf, ""), cp = bb -> bb_file;
                    625:                    else
                    626:                        (void) sprintf (prf, "%.*s", cp - bb -> bb_file, bb -> bb_file);
                    627:                    if ((dp = index (cp, '.')) == NULL)
                    628:                        dp = cp + strlen (cp);
                    629:                    (void) sprintf (file, "%s.%.*s%s", prf, dp - cp, cp, DSTFILE);
                    630:                    hp = file;
                    631:                    break;
                    632: 
                    633:                default:
                    634:                    (void) sprintf (file, "%s/%s", BBDir, item);
                    635:                    hp = file;
                    636:                    break;
                    637:            }
                    638: 
                    639:            if ((fp = fopen (hp, "r")) == NULL)
                    640:                return bblose ("unable to read file %s", hp);
                    641:            while (fgets (buffer, sizeof buffer, fp)) {
                    642:                if (np = index (buffer, '\n'))
                    643:                    *np = NULL;
                    644:                if (result = getbbitem (bb, buffer, action)) {
                    645:                    (void) fclose (fp);
                    646:                    (void) bblose ("error with file %s, item %s", hp, buffer);
                    647:                    return result;
                    648:                }
                    649:            }
                    650:            (void) fclose (fp);
                    651:            return OK;
                    652: 
                    653:        default:
                    654:            if (hp = rindex (item, '@')) {
                    655:                *hp++ = NULL;
                    656:                (void) strcpy (mbox, item);
                    657:                (void) strcpy (host, hp);
                    658:                *--hp = '@';
                    659:            }
                    660:            else {
                    661:                (void) sprintf (mbox, "%s%s", DISTADR, bb -> bb_name);
                    662:                (void) strcpy (host, item);
                    663:            }
                    664:            if (result = (*action) (mbox, host))
                    665:                (void) bblose ("action (%s, %s) returned 0%o", mbox, host, result);
                    666:            return result;
                    667:     }
                    668: }
                    669: 
                    670: /*  */
                    671: 
                    672: /* VARARGS1 */
                    673: 
                    674: static int
                    675: bblose(fmt, a, b, c)
                    676:        char *fmt, *a, *b, *c;
                    677: {
                    678:     if (BBErrors[0] == NULL)
                    679:        (void) sprintf (BBErrors, fmt, a, b, c);
                    680: 
                    681:     return NOTOK;
                    682: }
                    683: 
                    684: /*  */
                    685: 
                    686: void
                    687: make_lower(s1, s2)
                    688:        register char *s1, *s2;
                    689: {
                    690:     if (s1 == NULL || s2 == NULL)
                    691:        return;
                    692: 
                    693:     for (; *s2; s2++)
                    694:        *s1++ = isupper (*s2) ? tolower (*s2) : *s2;
                    695:     *s1 = NULL;
                    696: }
                    697: 
                    698: /*  */
                    699: 
                    700: static char *
                    701: bbskip(p, c)
                    702:        register char *p, c;
                    703: {
                    704:     if (p == NULL)
                    705:        return NULL;
                    706: 
                    707:     while (*p && *p != c)
                    708:        p++;
                    709:     if (*p)
                    710:        *p++ = NULL;
                    711: 
                    712:     return p;
                    713: }
                    714: 
                    715: 
                    716: static char *
                    717: getcpy(s)
                    718:        register char *s;
                    719: {
                    720:     register char  *p;
                    721: 
                    722:     if (s == NULL)
                    723:        return NULL;
                    724: 
                    725:     if (p = malloc ((unsigned) (strlen (s) + 1)))
                    726:        (void) strcpy (p, s);
                    727:     return p;
                    728: }

unix.superglobalmegacorp.com

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