|
|
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.