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