Annotation of 43BSDTahoe/etc/etc.tahoe/dlmpcc/dlmpcc.c, revision 1.1

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

unix.superglobalmegacorp.com

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