Annotation of 43BSDReno/usr.sbin/dlmpcc/dlmpcc.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1988 The Regents of the University of California.
        !             3:  * All rights reserved.
        !             4:  *
        !             5:  * This code is derived from software contributed to Berkeley by
        !             6:  * Computer Consoles Inc.
        !             7:  *
        !             8:  * Redistribution and use in source and binary forms are permitted provided
        !             9:  * that: (1) source distributions retain this entire copyright notice and
        !            10:  * comment, and (2) distributions including binaries display the following
        !            11:  * acknowledgement:  ``This product includes software developed by the
        !            12:  * University of California, Berkeley and its contributors'' in the
        !            13:  * documentation or other materials provided with the distribution and in
        !            14:  * all advertising materials mentioning features or use of this software.
        !            15:  * Neither the name of the University nor the names of its contributors may
        !            16:  * be used to endorse or promote products derived from this software without
        !            17:  * specific prior written permission.
        !            18:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
        !            19:  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
        !            20:  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !            21:  */
        !            22: 
        !            23: #ifndef lint
        !            24: char copyright[] =
        !            25: "@(#) Copyright (c) 1988 The Regents of the University of California.\n\
        !            26:  All rights reserved.\n";
        !            27: #endif /* not lint */
        !            28: 
        !            29: #ifndef lint
        !            30: static char sccsid[] = "@(#)dlmpcc.c   5.5 (Berkeley) 6/1/90";
        !            31: #endif /* not lint */
        !            32: 
        !            33: /*
        !            34:  * MPCC Download and Configuration Program.
        !            35:  */
        !            36: #include <sys/ioctl.h>
        !            37: #include <sys/types.h>
        !            38: #include <tahoevba/mpreg.h>
        !            39: #include <fcntl.h>
        !            40: #include <errno.h>
        !            41: #include <stdio.h>
        !            42: #include <ctype.h>
        !            43: #include "scnhdr.h"
        !            44: #include "pathnames.h"
        !            45: 
        !            46: #define MAXMPCC 16
        !            47: 
        !            48: char   *MPCCTAB = _PATH_MPCCTAB;
        !            49: int    resetflg = 0;
        !            50: 
        !            51: main(argc, argv)
        !            52:        char *argv[];
        !            53: {
        !            54:        int bd;
        !            55: 
        !            56:        if (argc == 1) {
        !            57:                for (bd = 0; bd < MAXMPCC; bd++)
        !            58:                        if (bldmap(bd) != -1)
        !            59:                                download(bd);
        !            60:                exit(0);
        !            61:        }
        !            62:        for (argc--, argv++; argc > 0; argc--, argv++) {
        !            63:                bd = atoi(argv[0]);
        !            64:                if (strcmp(argv[0], "-r") == 0) {
        !            65:                        resetflg = 1;
        !            66:                        continue;
        !            67:                }
        !            68:                if (bd > MAXMPCC || bd < 0) {
        !            69:                        printf("Illegal Board Number=> %d\n", bd);
        !            70:                        continue;
        !            71:                }
        !            72:                if (bldmap(bd) == -1)
        !            73:                        continue;
        !            74:                download(bd);
        !            75:        }
        !            76:        exit(0);
        !            77: }
        !            78: 
        !            79: /*     
        !            80:  * Build Load Module Map
        !            81:  */
        !            82: struct  bdcf cf;
        !            83: struct abdcf bdasy;
        !            84: 
        !            85: #define LINESIZE 128
        !            86: 
        !            87: bldmap(dlbd)
        !            88:        int dlbd;               /* board to be downloaded */
        !            89: {
        !            90:        FILE *tabfp;
        !            91:        int bd, port, count;
        !            92:        char *bdstr, *strtok(), protocol, line[LINESIZE];
        !            93:        char *lptr, *lptr1, *lptr2;
        !            94:        
        !            95:        protocol = '\0';
        !            96:        /* open the configuration file for reading */
        !            97:        if ((tabfp = fopen(MPCCTAB, "r")) == NULL) {
        !            98:                printf("No Configuration File: %s\n", MPCCTAB);
        !            99:                return (-1);
        !           100:        }
        !           101:        for (;;) {
        !           102:                if (fgets(&line[0], LINESIZE-1, tabfp) == NULL) {
        !           103:                        fclose(tabfp);
        !           104:                        return (-1);
        !           105:                }
        !           106:                count++;
        !           107:                line[strlen(line)-1] = '\0';
        !           108:                lptr = strtok(line, ':');
        !           109:                if (tolower(*lptr) != 'm')
        !           110:                        continue;
        !           111:                lptr = strtok((char *)0, ':');
        !           112:                bd = atoi(lptr);
        !           113:                if (bd == dlbd)
        !           114:                        break;
        !           115:        }
        !           116:        cf.fccstimer = 20;      /* default to 1 sec (20 * 50ms) */
        !           117:        cf.fccsports = 0;       /* no ports are fccs */
        !           118:        cf.fccssoc = 0;         /* no ports switch on close */
        !           119:        for (port = 0; port < MPMAXPORT; port++)
        !           120:                cf.protoports[port] = MPPROTO_UNUSED;
        !           121:        /* check for the keywords following the board number */
        !           122:        lptr1 = (char *)0;
        !           123:        lptr2 = (char *)0;
        !           124:        while (*lptr) {
        !           125:                lptr = strtok((char *)0, ':');
        !           126:                if (!strncmp(lptr, "FCCS", 4)) {
        !           127:                        lptr1 = lptr;
        !           128:                        continue;
        !           129:                }
        !           130:                if (!strncmp(lptr, "SOC", 3)) {
        !           131:                        lptr2 = lptr;
        !           132:                        continue;
        !           133:                }
        !           134:        }
        !           135:        /* process the board and port characteristics */
        !           136:        while (fgets(&line[0], LINESIZE-1, tabfp) != NULL) {
        !           137:                count++;
        !           138:                line[strlen(line)-1] = '\0';
        !           139:                if (!line[0])           /* if newline only */
        !           140:                        continue;
        !           141:                lptr = strtok(line, ':');
        !           142:                if (tolower(*lptr) == 'm')
        !           143:                        break;
        !           144:                if (*lptr == '#')       /* ignore comment */
        !           145:                        continue;
        !           146:                if (tolower(*lptr) == 'p' && tolower(*(lptr+1)) == 'o') {
        !           147:                        /* PORT */
        !           148:                        port = atoi(lptr = strtok((char *)0, ':'));
        !           149:                        protocol = *(lptr = strtok((char *)0, ':'));
        !           150:                        switch (cf.protoports[port] = protocol) {
        !           151:                        case '3' :              /* ASYNCH 32 port */
        !           152:                        case 'A' :              /* ASYNCH */
        !           153:                                break;
        !           154:                        case 'B':               /* BISYNCH */
        !           155:                                break;
        !           156:                        case 'S':               /* SDLC */
        !           157:                                snapargs(port, lptr);
        !           158:                                break;
        !           159:                        case 'X':               /* X25 */
        !           160:                                x25pargs(port, lptr);
        !           161:                                break;
        !           162:                        default:
        !           163:                                printf(
        !           164: "No protocol specified on PROTOCOL line in configuration file %s:%d: %s\n",
        !           165:                                    MPCCTAB, count, line);
        !           166:                                protocol = 'A';
        !           167:                                break;
        !           168:                        }
        !           169:                        continue;
        !           170:                }
        !           171:                if (tolower(*lptr) == 'p' && tolower(*(lptr+1)) == 'r') {
        !           172:                        /* PROTOCOL */
        !           173: #ifdef notdef
        !           174:                        if(protocol) {
        !           175:                                printf(
        !           176: "second protocol specified on PROTOCOL line in configuration file %s:%d: %s\n",
        !           177:                                    MPCCTAB, count, line);
        !           178:                                continue;
        !           179:                        }
        !           180: #endif
        !           181:                        lptr = strtok((char *) 0, ':');
        !           182:                        switch (protocol = *lptr) {
        !           183:                        case '3':               /* ASYNCH 32 port */
        !           184:                        case 'A':               /* ASYNCH */
        !           185:                                asybargs(lptr);
        !           186:                                break;
        !           187:                        case 'B':               /* BISYNCH */
        !           188:                                break;
        !           189:                        case 'S':               /* SDLC */
        !           190:                                snabargs(lptr);
        !           191:                                break;
        !           192:                        case 'X':               /* X25 */
        !           193:                                x25bargs(lptr);
        !           194:                                break;
        !           195:                        default:
        !           196:                                printf(
        !           197: "No protocol specified on PROTOCOL line in configuration file %s:%d: %s\n",
        !           198:                                    MPCCTAB, count, line);
        !           199:                                protocol = 'A';
        !           200:                                break;
        !           201:                        }
        !           202:                        continue;
        !           203:                }
        !           204:                printf("Error in configuration file %s,line %d, %s\n",
        !           205:                    MPCCTAB, count, line);
        !           206:        }
        !           207:        fclose(tabfp);
        !           208:        mkldnm();
        !           209:        return (0);
        !           210: }
        !           211: 
        !           212: /*
        !           213:  * decode x25 arguments for board
        !           214:  *
        !           215:  * for X.25, the arguments are N1, N2, T1, T2, T3, T4, K).
        !           216:  */
        !           217: x25bargs(args)
        !           218:        char *args;
        !           219: {
        !           220: }
        !           221: 
        !           222: /*
        !           223:  * decode sna arguments for board
        !           224:  * for SNA, the arguments are N1, N2, T1, T2, T3, T4, K).
        !           225:  */
        !           226: snabargs(args)
        !           227:        char *args;
        !           228: {
        !           229: }
        !           230: 
        !           231: /*
        !           232:  * decode async arguments for board
        !           233:  */
        !           234: asybargs(args)
        !           235: char *args;
        !           236: {
        !           237: 
        !           238:        bdasy.xmtbsz = atoi(strtok((char *)0, ':'));
        !           239: }
        !           240: 
        !           241: /*
        !           242:  * decode x25 arguments for port
        !           243:  */
        !           244: x25pargs(port,args)
        !           245:        int port;
        !           246:        char *args;
        !           247: {
        !           248: }
        !           249: 
        !           250: /*
        !           251:  * decode sna arguments for port
        !           252:  */
        !           253: snapargs(port, args)
        !           254:        int port;
        !           255:        char *args;
        !           256: {
        !           257: }
        !           258: 
        !           259: gethi()
        !           260: {
        !           261:        int i;
        !           262: 
        !           263:        for (i = MPMAXPORT-1; i >= 0 && cf.protoports[i] == 0; i--)
        !           264:                ;
        !           265:        return (i);
        !           266: }
        !           267: 
        !           268: getlo()
        !           269: {
        !           270:        int i;
        !           271: 
        !           272:        for (i = 0; i < MPMAXPORT && cf.protoports[i] == 0; i++)
        !           273:                ;
        !           274:        return (i);
        !           275: }
        !           276: 
        !           277: prntmap(board)
        !           278:        int board;
        !           279: {
        !           280:        int j;
        !           281: 
        !           282:        printf("\nMPCC #: %d\n", board);
        !           283:        for (j = 0; j < MPMAXPORT; j++) {
        !           284:                printf("port: %d  %c", j, cf.protoports[j]);
        !           285:                switch (cf.protoports[j]) {
        !           286:                case '3': case 'A':
        !           287:                        printf("\n");
        !           288:                        break;
        !           289:                case 'B':
        !           290:                        break;
        !           291:                case 'S':
        !           292:                        break;
        !           293:                case 'X':
        !           294:                        break;
        !           295:                default:
        !           296:                        printf("Unused\n");
        !           297:                        break;
        !           298:                }
        !           299:        }
        !           300:        printf("ldname: %s, ", cf.loadname);
        !           301:        printf("hiport: %d, loport: %d\n", gethi(), getlo());
        !           302:        if (cf.fccsports != 0)
        !           303:                printf("FCCS\n");
        !           304:        switch (cf.protoports[0]) {
        !           305:        case '3': case 'A':
        !           306:                printf("xmtsize: %d\n", bdasy.xmtbsz);
        !           307:                break;
        !           308:        case 'B':
        !           309:                break;
        !           310:        case 'S':
        !           311:                break;
        !           312:        case 'X':
        !           313:                break;
        !           314:        }
        !           315:        printf("protoports: %s\n", cf.protoports);
        !           316: }
        !           317: 
        !           318: /*
        !           319:  * Make Load Module Name
        !           320:  *
        !           321:  * if any port is 'ASYNCH"
        !           322:  *     add 'a' to load module name
        !           323:  * if any port is 'BISYNCH'
        !           324:  *     add 'b' to load module name
        !           325:  * if any port is 'SDLC'
        !           326:  *     add 's' to load module name
        !           327:  * if any port is 'X25'
        !           328:  *     add 'x' to load module name
        !           329:  */
        !           330: mkldnm()
        !           331: {
        !           332:        static char *pcols = "ABSX3";
        !           333:        char *proto;
        !           334:        int j, offset;
        !           335: 
        !           336:        offset = 0;
        !           337:        for (proto = pcols; *proto; proto++) {
        !           338:                for (j = 0; j < MPMAXPORT; j++) {
        !           339:                        if (cf.protoports[j] == *proto) {
        !           340:                                if (*proto == '3')
        !           341:                                        cf.loadname[offset] = '3';
        !           342:                                else
        !           343:                                        cf.loadname[offset] = tolower(*proto);
        !           344:                                offset++;
        !           345:                                break;
        !           346:                        }
        !           347:                }
        !           348:                cf.loadname[offset] = '\0';
        !           349:        }
        !           350: }
        !           351: 
        !           352: /*
        !           353:  * if a string is passed as an argument,
        !           354:  *     save it in the local string area
        !           355:  *     set the local index to the start of the string
        !           356:  * else
        !           357:  *     set start to the current character in the string
        !           358:  *     while the character is not the separator,
        !           359:  *             and the character is not NULL
        !           360:  *                     skip the character
        !           361:  */
        !           362: static
        !           363: char *
        !           364: strtok(s, c)
        !           365:        char *s, c;
        !           366: {
        !           367:        static char locals[LINESIZE];
        !           368:        static int i;
        !           369:        char *start;
        !           370: 
        !           371:        if (s != 0) {
        !           372:                strcpy(locals, s);
        !           373:                i = 0;
        !           374:        }
        !           375:        for (start = &locals[i] ; locals[i] && locals[i] != c; i++)
        !           376:                ;
        !           377:        if (locals[i]) {
        !           378:                locals[i] = '\0';
        !           379:                i++;
        !           380:        }
        !           381:        while (*start == ' ')
        !           382:                start++;
        !           383:        return (start);
        !           384: }
        !           385: 
        !           386: short  bits[] = { 1, 2, 4, 8, 16, 32, 64, 128 };
        !           387: fccs(line, tptr, pptr)
        !           388:        char *line, *tptr, *pptr;
        !           389: {
        !           390:        u_short ports, num, time;
        !           391: 
        !           392:        ports = 0;
        !           393:        line = strtok(line, ',');
        !           394:        while (*(line = strtok((char *) 0, ',')) != '\0') {
        !           395:                num = (short) atoi(line);
        !           396:                if (num >= 0 && num < 8)
        !           397:                        ports |= bits[num];
        !           398:                else if (num >= 50 && num < 6400)
        !           399:                        time = num / 50;
        !           400:                else
        !           401:                        printf("bad value for FCCS: %d\n", num);
        !           402:        }
        !           403:        *pptr = ports;
        !           404:        *tptr = time;
        !           405: }
        !           406: 
        !           407: soc(line, sptr)
        !           408:        char *line, *sptr;
        !           409: {
        !           410:        u_short ports, num;
        !           411: 
        !           412:        ports = 0;
        !           413:        line = strtok(line, ',');
        !           414:        while (*(line = strtok((char *) 0, ',')) != '\0') {
        !           415:                num = atoi(line);
        !           416:                if (num >= 0 && num < 8)
        !           417:                        ports |= bits[num];
        !           418:                else
        !           419:                        printf("bad value for SOC: %d\n",num);
        !           420:        }
        !           421:        *sptr = ports;
        !           422: }
        !           423: 
        !           424: char   buffer[MPDLBUFSIZE];
        !           425: extern int errno;
        !           426: struct head1 {
        !           427:        long    magic;
        !           428:        long    fill[12];
        !           429:        struct  scnhdr text;
        !           430:        struct  scnhdr data;
        !           431:        struct  scnhdr bss;
        !           432: } header1;
        !           433: 
        !           434: download(mpccnum)
        !           435:        int mpccnum;
        !           436: {
        !           437:        char dlname[LINESIZE], fullname[LINESIZE];
        !           438:        char *ldname, *ppmap;
        !           439:        int dlfd, ldfd;
        !           440:        char *it;
        !           441:        short i;
        !           442:        char hilo[2];
        !           443:        long realsize;
        !           444: 
        !           445:        sprintf(dlname, "%s/mpcc%d", _PATH_DEV, mpccnum);
        !           446:        if (*cf.loadname == '3')
        !           447:                sprintf(fullname, _PATH_MPCC32);
        !           448:        else
        !           449:                sprintf(fullname, _PATH_MPCCDL);
        !           450:        if ((cf.loadname[0]) == '\0')
        !           451:                return (-1);
        !           452:        if ((dlfd = open(dlname, O_RDWR)) == MP_DLERROR) {
        !           453:                printf("Can not open %s\n",dlname);
        !           454:                return (-1);
        !           455:        }
        !           456:        if ((ldfd = open(fullname, O_RDONLY)) == MP_DLERROR) {
        !           457:                close(dlfd);
        !           458:                printf("Can not access protocol code file: %s\n", fullname);
        !           459:                return (-1);
        !           460:        }
        !           461:        if (dlokay(dlfd,mpccnum) == MP_DLERROR) {
        !           462:                close(ldfd);
        !           463:                close(dlfd);
        !           464:                return (-1);
        !           465:        }
        !           466:        printf("Downloading MPCC #%x\n", mpccnum);
        !           467:        /* read executable file header */
        !           468:        if (read(ldfd, &header1, sizeof(header1)) != sizeof(header1)) {
        !           469:                printf("Can not read %s\n", fullname);
        !           470:                return (-1);
        !           471:        }
        !           472:        /* place at start of text space */
        !           473:        if (lseek(ldfd, header1.text.s_scnptr , (int) 0) == -1) {
        !           474:                printf("lseek error(text): %d", errno);
        !           475:                return (-1);
        !           476:        }
        !           477:        /* send text */
        !           478:        realsize = header1.data.s_paddr - header1.text.s_paddr;
        !           479:        if (dl(ldfd, dlfd, realsize) == -1) {
        !           480:                ioctl(dlfd, MPIORESETBOARD, 0L);
        !           481:                return (-1);
        !           482:        }
        !           483:        /* place at start of data space */
        !           484:        if (lseek(ldfd, header1.data.s_scnptr , (int) 0) == -1) {
        !           485:                printf("lseek error(data): %d", errno);
        !           486:                return (-1);
        !           487:        }
        !           488:        /* send initialized data */
        !           489:        realsize = header1.bss.s_paddr - header1.data.s_paddr;
        !           490:        if (dl(ldfd, dlfd, realsize) == -1) {
        !           491:                ioctl(dlfd, MPIORESETBOARD, 0L);
        !           492:                return (-1);
        !           493:        }
        !           494:        /* signal end of code */
        !           495:        if (ioctl(dlfd, MPIOENDCODE, (char *) 0) == MP_DLERROR) {
        !           496:                printf("MPIOENDCODE ioctl failed\n");
        !           497:                ioctl(dlfd, MPIORESETBOARD, 0L);
        !           498:                return (-1);
        !           499:        }
        !           500:        /* download configuration information   */
        !           501:        if (config(dlfd) == -1) {
        !           502:                ioctl(dlfd, MPIORESETBOARD, 0L);
        !           503:                return (-1);
        !           504:        }
        !           505:        /* write port/protocol map */
        !           506:        ppmap = (char *)&cf.protoports[0];
        !           507:        tknzmap(ppmap);
        !           508:        if (ioctl(dlfd, MPIOPORTMAP, ppmap) == MP_DLERROR) {
        !           509:                printf("MPIOPORTMAP ioctl failed\n");
        !           510:                ioctl(dlfd, MPIORESETBOARD, 0L);
        !           511:                return (-1);
        !           512:        }
        !           513:        /* signal end of download */
        !           514:        if (ioctl(dlfd, MPIOENDDL, (char *) 0) == MP_DLERROR) {
        !           515:                printf("MPIOENDDL ioctl failed\n");
        !           516:                ioctl(dlfd, MPIORESETBOARD, 0L);
        !           517:                return (-1);
        !           518:        }
        !           519:        close(dlfd);
        !           520:        close(ldfd);
        !           521:        printf("Download Complete and Successful\n");
        !           522:        return (0);
        !           523: }
        !           524: 
        !           525: dlokay(bdfd, mpccnum)
        !           526:        int bdfd, mpccnum;
        !           527: {
        !           528:        char answer;
        !           529: 
        !           530:        if (resetflg) {
        !           531:                printf("Reseting MPCC #%x\n",mpccnum);
        !           532:                ioctl(bdfd, MPIORESETBOARD, 0L);
        !           533:                sleep(10);
        !           534:        }
        !           535:        if (ioctl(bdfd, MPIOSTARTDL, 0) == MP_DLERROR) {
        !           536:                if (errno == EBUSY) {
        !           537:                        printf("MPCC #%x has already been downloaded.\n",
        !           538:                            mpccnum);
        !           539:                        printf("Do you want to re-download it?: ");
        !           540:                        fscanf(stdin,"%c",&answer);
        !           541:                        while (getchar() != '\n')
        !           542:                                ;
        !           543:                        if ((answer | 0x60) != 'y')
        !           544:                                return (MP_DLERROR);
        !           545:                        ioctl(bdfd, MPIORESETBOARD, 0L);
        !           546:                        sleep(10);
        !           547:                        if (ioctl(bdfd, MPIOSTARTDL, (char *) 0) == MP_DLERROR) {
        !           548:                                printf("Can't download MPCC #%x\n", mpccnum);
        !           549:                                return (MP_DLERROR);
        !           550:                        }
        !           551:                } else {
        !           552:                        switch (errno) {
        !           553:                        case ENODEV:
        !           554:                                printf("MPCC #%x not in system\n", mpccnum);
        !           555:                                break;
        !           556:                        case EACCES:
        !           557:                                printf("Download area in use, try later\n");
        !           558:                                break;
        !           559:                        case ENOSPC:
        !           560:                                printf("MPCC #%x already being downloaded\n",
        !           561:                                    mpccnum);
        !           562:                                break;
        !           563:                        default:
        !           564:                                printf("Unknown response from MPCC #%x\n",
        !           565:                                    mpccnum);
        !           566:                                break;
        !           567:                        }
        !           568:                        return (MP_DLERROR);
        !           569:                }
        !           570:        }
        !           571:        return (0);
        !           572: }
        !           573: 
        !           574: dl(dskfd, bdfd, size)
        !           575:        int dskfd, bdfd;
        !           576:        long size;
        !           577: {
        !           578:        int bytes;
        !           579: 
        !           580:        while (size > 0) {
        !           581:                bytes = (size < MPDLBUFSIZE) ? (int) size : MPDLBUFSIZE;
        !           582:                if ((bytes = read(dskfd, buffer, bytes)) == MP_DLERROR) {
        !           583:                        close(dskfd);
        !           584:                        close(bdfd);
        !           585:                        printf("Download-Can't read buffer\n");
        !           586:                        return (-1);
        !           587:                }
        !           588:                if (write(bdfd, buffer, bytes) == MP_DLERROR) {
        !           589:                        close(dskfd);
        !           590:                        close(bdfd);
        !           591:                        printf("Download-Can't write buffer\n");
        !           592:                        return (-1);
        !           593:                }
        !           594:                size -= bytes;
        !           595:        }
        !           596:        return (0);
        !           597: }
        !           598: 
        !           599: /*
        !           600:  * download each protocol's configuration data
        !           601:  * and the configuration data for tboard.
        !           602:  */
        !           603: config(dlfd)
        !           604:        int dlfd;
        !           605: {
        !           606:        register int i;
        !           607:        char *ldname;
        !           608: 
        !           609:        for (ldname = cf.loadname; *ldname; ldname++) {
        !           610:                switch (*ldname) {
        !           611:                case '3': case 'a':
        !           612:                        if (ioctl(dlfd, MPIOASYNCNF, &bdasy) == MP_DLERROR) {
        !           613:                                printf("async ioctl failed\n");
        !           614:                                return (-1);
        !           615:                        }
        !           616:                        break;
        !           617:                case 'b':
        !           618:                        break;
        !           619:                case 'x':
        !           620:                        break;
        !           621: 
        !           622:                case 's':
        !           623:                        break;
        !           624:                }
        !           625:        }
        !           626: }
        !           627: 
        !           628: /*
        !           629:  * tokenize the protoport string,
        !           630:  * (change from the letter to the corresponding number).
        !           631:  */
        !           632: tknzmap(map)
        !           633:        char *map;
        !           634: {
        !           635:        short i;
        !           636: 
        !           637:        for (i = 0; i < MPMAXPORT; i++) {
        !           638:                switch (*map) {
        !           639:                case '3' :      *map = MPPROTO_ASYNC; break;
        !           640:                case 'A' :      *map = MPPROTO_ASYNC; break;
        !           641:                case 'B' :      *map = MPPROTO_BISYNC; break;
        !           642:                case 'S' :      *map = MPPROTO_SNA; break;
        !           643:                case 'X' :      *map = MPPROTO_X25; break;
        !           644:                default:        *map = MPPROTO_UNUSED; break;
        !           645:                }
        !           646:                map++;
        !           647:        }
        !           648: }

unix.superglobalmegacorp.com

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