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

unix.superglobalmegacorp.com

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