|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.