xref: /csrg-svn/old/dlmpcc/dlmpcc.c (revision 45977)
135523Sbostic /*
235523Sbostic  * Copyright (c) 1988 The Regents of the University of California.
335523Sbostic  * All rights reserved.
435523Sbostic  *
535523Sbostic  * This code is derived from software contributed to Berkeley by
635523Sbostic  * Computer Consoles Inc.
735523Sbostic  *
842795Sbostic  * %sccs.include.redist.c%
935523Sbostic  */
1035523Sbostic 
1132618Ssam #ifndef lint
1235523Sbostic char copyright[] =
1335523Sbostic "@(#) Copyright (c) 1988 The Regents of the University of California.\n\
1435523Sbostic  All rights reserved.\n";
1535523Sbostic #endif /* not lint */
1632618Ssam 
1735523Sbostic #ifndef lint
18*45977Sbostic static char sccsid[] = "@(#)dlmpcc.c	5.6 (Berkeley) 01/17/91";
1935523Sbostic #endif /* not lint */
2035523Sbostic 
2132618Ssam /*
2232618Ssam  * MPCC Download and Configuration Program.
2332618Ssam  */
2432618Ssam #include <sys/ioctl.h>
2532618Ssam #include <sys/types.h>
26*45977Sbostic #include <tahoe/vba/mpreg.h>
2737978Sbostic #include <fcntl.h>
2837978Sbostic #include <errno.h>
2932618Ssam #include <stdio.h>
3037978Sbostic #include <ctype.h>
3132618Ssam #include "scnhdr.h"
3237978Sbostic #include "pathnames.h"
3332618Ssam 
3432618Ssam #define MAXMPCC 16
3532618Ssam 
3637978Sbostic char	*MPCCTAB = _PATH_MPCCTAB;
3732618Ssam int	resetflg = 0;
3832618Ssam 
main(argc,argv)3932618Ssam main(argc, argv)
4032618Ssam 	char *argv[];
4132618Ssam {
4232618Ssam 	int bd;
4332618Ssam 
4432618Ssam 	if (argc == 1) {
4532618Ssam 		for (bd = 0; bd < MAXMPCC; bd++)
4632618Ssam 			if (bldmap(bd) != -1)
4732618Ssam 				download(bd);
4832618Ssam 		exit(0);
4932618Ssam 	}
5032618Ssam 	for (argc--, argv++; argc > 0; argc--, argv++) {
5132618Ssam 		bd = atoi(argv[0]);
5232618Ssam 		if (strcmp(argv[0], "-r") == 0) {
5332618Ssam 			resetflg = 1;
5432618Ssam 			continue;
5532618Ssam 		}
5632618Ssam 		if (bd > MAXMPCC || bd < 0) {
5732618Ssam 			printf("Illegal Board Number=> %d\n", bd);
5832618Ssam 			continue;
5932618Ssam 		}
6032618Ssam 		if (bldmap(bd) == -1)
6132618Ssam 			continue;
6232618Ssam 		download(bd);
6332618Ssam 	}
6432618Ssam 	exit(0);
6532618Ssam }
6632618Ssam 
6732618Ssam /*
6832618Ssam  * Build Load Module Map
6932618Ssam  */
7032618Ssam struct  bdcf cf;
7132618Ssam struct	abdcf bdasy;
7232618Ssam 
7332618Ssam #define LINESIZE 128
7432618Ssam 
bldmap(dlbd)7532618Ssam bldmap(dlbd)
7632618Ssam 	int dlbd;		/* board to be downloaded */
7732618Ssam {
7832618Ssam 	FILE *tabfp;
7932618Ssam 	int bd, port, count;
8032618Ssam 	char *bdstr, *strtok(), protocol, line[LINESIZE];
8132618Ssam 	char *lptr, *lptr1, *lptr2;
8232618Ssam 
8332618Ssam 	protocol = '\0';
8432618Ssam 	/* open the configuration file for reading */
8532618Ssam 	if ((tabfp = fopen(MPCCTAB, "r")) == NULL) {
8632618Ssam 		printf("No Configuration File: %s\n", MPCCTAB);
8732618Ssam 		return (-1);
8832618Ssam 	}
8932618Ssam 	for (;;) {
9032618Ssam 		if (fgets(&line[0], LINESIZE-1, tabfp) == NULL) {
9132618Ssam 			fclose(tabfp);
9232618Ssam 			return (-1);
9332618Ssam 		}
9432618Ssam 		count++;
9532618Ssam 		line[strlen(line)-1] = '\0';
9632618Ssam 		lptr = strtok(line, ':');
9732618Ssam 		if (tolower(*lptr) != 'm')
9832618Ssam 			continue;
9932618Ssam 		lptr = strtok((char *)0, ':');
10032618Ssam 		bd = atoi(lptr);
10132618Ssam 		if (bd == dlbd)
10232618Ssam 			break;
10332618Ssam 	}
10432618Ssam 	cf.fccstimer = 20;      /* default to 1 sec (20 * 50ms) */
10532618Ssam 	cf.fccsports = 0;       /* no ports are fccs */
10632618Ssam 	cf.fccssoc = 0;         /* no ports switch on close */
10732618Ssam 	for (port = 0; port < MPMAXPORT; port++)
10832618Ssam 		cf.protoports[port] = MPPROTO_UNUSED;
10932618Ssam 	/* check for the keywords following the board number */
11032618Ssam 	lptr1 = (char *)0;
11132618Ssam 	lptr2 = (char *)0;
11232618Ssam 	while (*lptr) {
11332618Ssam 		lptr = strtok((char *)0, ':');
11432618Ssam 		if (!strncmp(lptr, "FCCS", 4)) {
11532618Ssam 			lptr1 = lptr;
11632618Ssam 			continue;
11732618Ssam 		}
11832618Ssam 		if (!strncmp(lptr, "SOC", 3)) {
11932618Ssam 			lptr2 = lptr;
12032618Ssam 			continue;
12132618Ssam 		}
12232618Ssam 	}
12332618Ssam 	/* process the board and port characteristics */
12432618Ssam 	while (fgets(&line[0], LINESIZE-1, tabfp) != NULL) {
12532618Ssam 		count++;
12632618Ssam 		line[strlen(line)-1] = '\0';
12732618Ssam 		if (!line[0])		/* if newline only */
12832618Ssam 			continue;
12932618Ssam 		lptr = strtok(line, ':');
13032618Ssam 		if (tolower(*lptr) == 'm')
13132618Ssam 			break;
13232618Ssam 		if (*lptr == '#')	/* ignore comment */
13332618Ssam 			continue;
13432618Ssam 		if (tolower(*lptr) == 'p' && tolower(*(lptr+1)) == 'o') {
13532618Ssam 			/* PORT */
13632618Ssam 			port = atoi(lptr = strtok((char *)0, ':'));
13732618Ssam 			protocol = *(lptr = strtok((char *)0, ':'));
13832618Ssam 			switch (cf.protoports[port] = protocol) {
13932618Ssam 			case '3' :		/* ASYNCH 32 port */
14032618Ssam 			case 'A' :		/* ASYNCH */
14132618Ssam 				break;
14232618Ssam 			case 'B':		/* BISYNCH */
14332618Ssam 				break;
14432618Ssam 			case 'S':		/* SDLC */
14532618Ssam 				snapargs(port, lptr);
14632618Ssam 				break;
14732618Ssam 			case 'X':		/* X25 */
14832618Ssam 				x25pargs(port, lptr);
14932618Ssam 				break;
15032618Ssam 			default:
15132618Ssam 				printf(
15232618Ssam "No protocol specified on PROTOCOL line in configuration file %s:%d: %s\n",
15332618Ssam 				    MPCCTAB, count, line);
15432618Ssam 				protocol = 'A';
15532618Ssam 				break;
15632618Ssam 			}
15732618Ssam 			continue;
15832618Ssam 		}
15932618Ssam 		if (tolower(*lptr) == 'p' && tolower(*(lptr+1)) == 'r') {
16032618Ssam 			/* PROTOCOL */
16132618Ssam #ifdef notdef
16232618Ssam 			if(protocol) {
16332618Ssam 				printf(
16432618Ssam "second protocol specified on PROTOCOL line in configuration file %s:%d: %s\n",
16532618Ssam 				    MPCCTAB, count, line);
16632618Ssam 				continue;
16732618Ssam 			}
16832618Ssam #endif
16932618Ssam 			lptr = strtok((char *) 0, ':');
17032618Ssam 			switch (protocol = *lptr) {
17132618Ssam 			case '3':		/* ASYNCH 32 port */
17232618Ssam 			case 'A':		/* ASYNCH */
17332618Ssam 				asybargs(lptr);
17432618Ssam 				break;
17532618Ssam 			case 'B':		/* BISYNCH */
17632618Ssam 				break;
17732618Ssam 			case 'S':		/* SDLC */
17832618Ssam 				snabargs(lptr);
17932618Ssam 				break;
18032618Ssam 			case 'X':		/* X25 */
18132618Ssam 				x25bargs(lptr);
18232618Ssam 				break;
18332618Ssam 			default:
18432618Ssam 				printf(
18532618Ssam "No protocol specified on PROTOCOL line in configuration file %s:%d: %s\n",
18632618Ssam 				    MPCCTAB, count, line);
18732618Ssam 				protocol = 'A';
18832618Ssam 				break;
18932618Ssam 			}
19032618Ssam 			continue;
19132618Ssam 		}
19232618Ssam 		printf("Error in configuration file %s,line %d, %s\n",
19332618Ssam 		    MPCCTAB, count, line);
19432618Ssam 	}
19532618Ssam 	fclose(tabfp);
19632618Ssam 	mkldnm();
19732618Ssam 	return (0);
19832618Ssam }
19932618Ssam 
20032618Ssam /*
20132618Ssam  * decode x25 arguments for board
20232618Ssam  *
20332618Ssam  * for X.25, the arguments are N1, N2, T1, T2, T3, T4, K).
20432618Ssam  */
x25bargs(args)20532618Ssam x25bargs(args)
20632618Ssam 	char *args;
20732618Ssam {
20832618Ssam }
20932618Ssam 
21032618Ssam /*
21132618Ssam  * decode sna arguments for board
21232618Ssam  * for SNA, the arguments are N1, N2, T1, T2, T3, T4, K).
21332618Ssam  */
snabargs(args)21432618Ssam snabargs(args)
21532618Ssam 	char *args;
21632618Ssam {
21732618Ssam }
21832618Ssam 
21932618Ssam /*
22032618Ssam  * decode async arguments for board
22132618Ssam  */
asybargs(args)22232618Ssam asybargs(args)
22332618Ssam char *args;
22432618Ssam {
22532618Ssam 
22632618Ssam 	bdasy.xmtbsz = atoi(strtok((char *)0, ':'));
22732618Ssam }
22832618Ssam 
22932618Ssam /*
23032618Ssam  * decode x25 arguments for port
23132618Ssam  */
x25pargs(port,args)23232618Ssam x25pargs(port,args)
23332618Ssam 	int port;
23432618Ssam 	char *args;
23532618Ssam {
23632618Ssam }
23732618Ssam 
23832618Ssam /*
23932618Ssam  * decode sna arguments for port
24032618Ssam  */
snapargs(port,args)24132618Ssam snapargs(port, args)
24232618Ssam 	int port;
24332618Ssam 	char *args;
24432618Ssam {
24532618Ssam }
24632618Ssam 
gethi()24732618Ssam gethi()
24832618Ssam {
24932618Ssam 	int i;
25032618Ssam 
25132618Ssam 	for (i = MPMAXPORT-1; i >= 0 && cf.protoports[i] == 0; i--)
25232618Ssam 		;
25332618Ssam 	return (i);
25432618Ssam }
25532618Ssam 
getlo()25632618Ssam getlo()
25732618Ssam {
25832618Ssam 	int i;
25932618Ssam 
26032618Ssam 	for (i = 0; i < MPMAXPORT && cf.protoports[i] == 0; i++)
26132618Ssam 		;
26232618Ssam 	return (i);
26332618Ssam }
26432618Ssam 
prntmap(board)26532618Ssam prntmap(board)
26632618Ssam 	int board;
26732618Ssam {
26832618Ssam 	int j;
26932618Ssam 
27032618Ssam 	printf("\nMPCC #: %d\n", board);
27132618Ssam 	for (j = 0; j < MPMAXPORT; j++) {
27232618Ssam 		printf("port: %d  %c", j, cf.protoports[j]);
27332618Ssam 		switch (cf.protoports[j]) {
27432618Ssam 		case '3': case 'A':
27532618Ssam 			printf("\n");
27632618Ssam 			break;
27732618Ssam 		case 'B':
27832618Ssam 			break;
27932618Ssam 		case 'S':
28032618Ssam 			break;
28132618Ssam 		case 'X':
28232618Ssam 			break;
28332618Ssam 		default:
28432618Ssam 			printf("Unused\n");
28532618Ssam 			break;
28632618Ssam 		}
28732618Ssam 	}
28832618Ssam 	printf("ldname: %s, ", cf.loadname);
28932618Ssam 	printf("hiport: %d, loport: %d\n", gethi(), getlo());
29032618Ssam 	if (cf.fccsports != 0)
29132618Ssam 		printf("FCCS\n");
29232618Ssam 	switch (cf.protoports[0]) {
29332618Ssam 	case '3': case 'A':
29432618Ssam 		printf("xmtsize: %d\n", bdasy.xmtbsz);
29532618Ssam 		break;
29632618Ssam 	case 'B':
29732618Ssam 		break;
29832618Ssam 	case 'S':
29932618Ssam 		break;
30032618Ssam 	case 'X':
30132618Ssam 		break;
30232618Ssam 	}
30332618Ssam 	printf("protoports: %s\n", cf.protoports);
30432618Ssam }
30532618Ssam 
30632618Ssam /*
30732618Ssam  * Make Load Module Name
30832618Ssam  *
30932618Ssam  * if any port is 'ASYNCH"
31032618Ssam  * 	add 'a' to load module name
31132618Ssam  * if any port is 'BISYNCH'
31232618Ssam  * 	add 'b' to load module name
31332618Ssam  * if any port is 'SDLC'
31432618Ssam  * 	add 's' to load module name
31532618Ssam  * if any port is 'X25'
31632618Ssam  * 	add 'x' to load module name
31732618Ssam  */
mkldnm()31832618Ssam mkldnm()
31932618Ssam {
32032618Ssam 	static char *pcols = "ABSX3";
32132618Ssam 	char *proto;
32232618Ssam 	int j, offset;
32332618Ssam 
32432618Ssam 	offset = 0;
32532618Ssam 	for (proto = pcols; *proto; proto++) {
32632618Ssam 		for (j = 0; j < MPMAXPORT; j++) {
32732618Ssam 			if (cf.protoports[j] == *proto) {
32832618Ssam 				if (*proto == '3')
32932618Ssam 					cf.loadname[offset] = '3';
33032618Ssam 				else
33132618Ssam 					cf.loadname[offset] = tolower(*proto);
33232618Ssam 				offset++;
33332618Ssam 				break;
33432618Ssam 			}
33532618Ssam 		}
33632618Ssam 		cf.loadname[offset] = '\0';
33732618Ssam 	}
33832618Ssam }
33932618Ssam 
34032618Ssam /*
34132618Ssam  * if a string is passed as an argument,
34232618Ssam  * 	save it in the local string area
34332618Ssam  * 	set the local index to the start of the string
34432618Ssam  * else
34532618Ssam  * 	set start to the current character in the string
34632618Ssam  * 	while the character is not the separator,
34732618Ssam  * 		and the character is not NULL
34832618Ssam  * 			skip the character
34932618Ssam  */
35032618Ssam static
35132618Ssam char *
strtok(s,c)35232618Ssam strtok(s, c)
35332618Ssam 	char *s, c;
35432618Ssam {
35532618Ssam 	static char locals[LINESIZE];
35632618Ssam 	static int i;
35732618Ssam 	char *start;
35832618Ssam 
35932618Ssam 	if (s != 0) {
36032618Ssam 		strcpy(locals, s);
36132618Ssam 		i = 0;
36232618Ssam 	}
36332618Ssam 	for (start = &locals[i] ; locals[i] && locals[i] != c; i++)
36432618Ssam 		;
36532618Ssam 	if (locals[i]) {
36632618Ssam 		locals[i] = '\0';
36732618Ssam 		i++;
36832618Ssam 	}
36932618Ssam 	while (*start == ' ')
37032618Ssam 		start++;
37132618Ssam 	return (start);
37232618Ssam }
37332618Ssam 
37432618Ssam short	bits[] = { 1, 2, 4, 8, 16, 32, 64, 128 };
fccs(line,tptr,pptr)37532618Ssam fccs(line, tptr, pptr)
37632618Ssam 	char *line, *tptr, *pptr;
37732618Ssam {
37832618Ssam 	u_short ports, num, time;
37932618Ssam 
38032618Ssam 	ports = 0;
38132618Ssam 	line = strtok(line, ',');
38232618Ssam 	while (*(line = strtok((char *) 0, ',')) != '\0') {
38332618Ssam 		num = (short) atoi(line);
38432618Ssam 		if (num >= 0 && num < 8)
38532618Ssam 			ports |= bits[num];
38632618Ssam 		else if (num >= 50 && num < 6400)
38732618Ssam 			time = num / 50;
38832618Ssam 		else
38932618Ssam 			printf("bad value for FCCS: %d\n", num);
39032618Ssam 	}
39132618Ssam 	*pptr = ports;
39232618Ssam 	*tptr = time;
39332618Ssam }
39432618Ssam 
soc(line,sptr)39532618Ssam soc(line, sptr)
39632618Ssam 	char *line, *sptr;
39732618Ssam {
39832618Ssam 	u_short ports, num;
39932618Ssam 
40032618Ssam 	ports = 0;
40132618Ssam 	line = strtok(line, ',');
40232618Ssam 	while (*(line = strtok((char *) 0, ',')) != '\0') {
40332618Ssam 		num = atoi(line);
40432618Ssam 		if (num >= 0 && num < 8)
40532618Ssam 			ports |= bits[num];
40632618Ssam 		else
40732618Ssam 			printf("bad value for SOC: %d\n",num);
40832618Ssam 	}
40932618Ssam 	*sptr = ports;
41032618Ssam }
41132618Ssam 
41232618Ssam char	buffer[MPDLBUFSIZE];
41332618Ssam extern	int errno;
41432618Ssam struct head1 {
41532618Ssam 	long	magic;
41632618Ssam 	long	fill[12];
41732618Ssam 	struct	scnhdr text;
41832618Ssam 	struct	scnhdr data;
41932618Ssam 	struct	scnhdr bss;
42032618Ssam } header1;
42132618Ssam 
download(mpccnum)42232618Ssam download(mpccnum)
42332618Ssam 	int mpccnum;
42432618Ssam {
42532618Ssam 	char dlname[LINESIZE], fullname[LINESIZE];
42632618Ssam 	char *ldname, *ppmap;
42732618Ssam 	int dlfd, ldfd;
42832618Ssam 	char *it;
42932618Ssam 	short i;
43032618Ssam 	char hilo[2];
43132618Ssam 	long realsize;
43232618Ssam 
43337978Sbostic 	sprintf(dlname, "%s/mpcc%d", _PATH_DEV, mpccnum);
43432618Ssam 	if (*cf.loadname == '3')
43537978Sbostic 		sprintf(fullname, _PATH_MPCC32);
43632618Ssam 	else
43737978Sbostic 		sprintf(fullname, _PATH_MPCCDL);
43832618Ssam 	if ((cf.loadname[0]) == '\0')
43932618Ssam 		return (-1);
44032618Ssam 	if ((dlfd = open(dlname, O_RDWR)) == MP_DLERROR) {
44132618Ssam 		printf("Can not open %s\n",dlname);
44232618Ssam 		return (-1);
44332618Ssam 	}
44432618Ssam 	if ((ldfd = open(fullname, O_RDONLY)) == MP_DLERROR) {
44532618Ssam 		close(dlfd);
44632618Ssam 		printf("Can not access protocol code file: %s\n", fullname);
44732618Ssam 		return (-1);
44832618Ssam 	}
44932618Ssam 	if (dlokay(dlfd,mpccnum) == MP_DLERROR) {
45032618Ssam 		close(ldfd);
45132618Ssam 		close(dlfd);
45232618Ssam 		return (-1);
45332618Ssam 	}
45432618Ssam 	printf("Downloading MPCC #%x\n", mpccnum);
45532618Ssam 	/* read executable file header */
45632618Ssam 	if (read(ldfd, &header1, sizeof(header1)) != sizeof(header1)) {
45732618Ssam 		printf("Can not read %s\n", fullname);
45832618Ssam 		return (-1);
45932618Ssam 	}
46032618Ssam 	/* place at start of text space */
46132618Ssam 	if (lseek(ldfd, header1.text.s_scnptr , (int) 0) == -1) {
46232618Ssam 		printf("lseek error(text): %d", errno);
46332618Ssam 		return (-1);
46432618Ssam 	}
46532618Ssam 	/* send text */
46632618Ssam 	realsize = header1.data.s_paddr - header1.text.s_paddr;
46732618Ssam 	if (dl(ldfd, dlfd, realsize) == -1) {
46832618Ssam 		ioctl(dlfd, MPIORESETBOARD, 0L);
46932618Ssam 		return (-1);
47032618Ssam 	}
47132618Ssam 	/* place at start of data space	*/
47232618Ssam 	if (lseek(ldfd, header1.data.s_scnptr , (int) 0) == -1) {
47332618Ssam 		printf("lseek error(data): %d", errno);
47432618Ssam 		return (-1);
47532618Ssam 	}
47632618Ssam 	/* send initialized data */
47732618Ssam 	realsize = header1.bss.s_paddr - header1.data.s_paddr;
47832618Ssam 	if (dl(ldfd, dlfd, realsize) == -1) {
47932618Ssam 		ioctl(dlfd, MPIORESETBOARD, 0L);
48032618Ssam 		return (-1);
48132618Ssam 	}
48232618Ssam 	/* signal end of code */
48332618Ssam 	if (ioctl(dlfd, MPIOENDCODE, (char *) 0) == MP_DLERROR) {
48432618Ssam 		printf("MPIOENDCODE ioctl failed\n");
48532618Ssam 		ioctl(dlfd, MPIORESETBOARD, 0L);
48632618Ssam 		return (-1);
48732618Ssam 	}
48832618Ssam 	/* download configuration information	*/
48932618Ssam 	if (config(dlfd) == -1) {
49032618Ssam 		ioctl(dlfd, MPIORESETBOARD, 0L);
49132618Ssam 		return (-1);
49232618Ssam 	}
49332618Ssam 	/* write port/protocol map */
49432618Ssam 	ppmap = (char *)&cf.protoports[0];
49532618Ssam 	tknzmap(ppmap);
49632618Ssam 	if (ioctl(dlfd, MPIOPORTMAP, ppmap) == MP_DLERROR) {
49732618Ssam 		printf("MPIOPORTMAP ioctl failed\n");
49832618Ssam 		ioctl(dlfd, MPIORESETBOARD, 0L);
49932618Ssam 		return (-1);
50032618Ssam 	}
50132618Ssam 	/* signal end of download */
50232618Ssam 	if (ioctl(dlfd, MPIOENDDL, (char *) 0) == MP_DLERROR) {
50332618Ssam 		printf("MPIOENDDL ioctl failed\n");
50432618Ssam 		ioctl(dlfd, MPIORESETBOARD, 0L);
50532618Ssam 		return (-1);
50632618Ssam 	}
50732618Ssam 	close(dlfd);
50832618Ssam 	close(ldfd);
50932618Ssam 	printf("Download Complete and Successful\n");
51032618Ssam 	return (0);
51132618Ssam }
51232618Ssam 
dlokay(bdfd,mpccnum)51332618Ssam dlokay(bdfd, mpccnum)
51432618Ssam 	int bdfd, mpccnum;
51532618Ssam {
51632618Ssam 	char answer;
51732618Ssam 
51832618Ssam 	if (resetflg) {
51932618Ssam 		printf("Reseting MPCC #%x\n",mpccnum);
52032618Ssam 		ioctl(bdfd, MPIORESETBOARD, 0L);
52132618Ssam 		sleep(10);
52232618Ssam 	}
52332618Ssam 	if (ioctl(bdfd, MPIOSTARTDL, 0) == MP_DLERROR) {
52432618Ssam 		if (errno == EBUSY) {
52532618Ssam 			printf("MPCC #%x has already been downloaded.\n",
52632618Ssam 			    mpccnum);
52732618Ssam 			printf("Do you want to re-download it?: ");
52832618Ssam 			fscanf(stdin,"%c",&answer);
52932618Ssam 			while (getchar() != '\n')
53032618Ssam 				;
53132618Ssam 			if ((answer | 0x60) != 'y')
53232618Ssam 				return (MP_DLERROR);
53332618Ssam 			ioctl(bdfd, MPIORESETBOARD, 0L);
53432618Ssam 			sleep(10);
53532618Ssam 			if (ioctl(bdfd, MPIOSTARTDL, (char *) 0) == MP_DLERROR) {
53632618Ssam 				printf("Can't download MPCC #%x\n", mpccnum);
53732618Ssam 				return (MP_DLERROR);
53832618Ssam 			}
53932618Ssam 		} else {
54032618Ssam 			switch (errno) {
54132618Ssam 			case ENODEV:
54232618Ssam 				printf("MPCC #%x not in system\n", mpccnum);
54332618Ssam 				break;
54432618Ssam 			case EACCES:
54532618Ssam 				printf("Download area in use, try later\n");
54632618Ssam 				break;
54732618Ssam 			case ENOSPC:
54832618Ssam 				printf("MPCC #%x already being downloaded\n",
54932618Ssam 				    mpccnum);
55032618Ssam 				break;
55132618Ssam 			default:
55232618Ssam 				printf("Unknown response from MPCC #%x\n",
55332618Ssam 				    mpccnum);
55432618Ssam 				break;
55532618Ssam 			}
55632618Ssam 			return (MP_DLERROR);
55732618Ssam 		}
55832618Ssam 	}
55932618Ssam 	return (0);
56032618Ssam }
56132618Ssam 
dl(dskfd,bdfd,size)56232618Ssam dl(dskfd, bdfd, size)
56332618Ssam 	int dskfd, bdfd;
56432618Ssam 	long size;
56532618Ssam {
56632618Ssam 	int bytes;
56732618Ssam 
56832618Ssam 	while (size > 0) {
56932618Ssam 		bytes = (size < MPDLBUFSIZE) ? (int) size : MPDLBUFSIZE;
57032618Ssam 		if ((bytes = read(dskfd, buffer, bytes)) == MP_DLERROR) {
57132618Ssam 			close(dskfd);
57232618Ssam 			close(bdfd);
57332618Ssam 			printf("Download-Can't read buffer\n");
57432618Ssam 			return (-1);
57532618Ssam 		}
57632618Ssam 		if (write(bdfd, buffer, bytes) == MP_DLERROR) {
57732618Ssam 			close(dskfd);
57832618Ssam 			close(bdfd);
57932618Ssam 			printf("Download-Can't write buffer\n");
58032618Ssam 			return (-1);
58132618Ssam 		}
58232618Ssam 		size -= bytes;
58332618Ssam 	}
58432618Ssam 	return (0);
58532618Ssam }
58632618Ssam 
58732618Ssam /*
58832618Ssam  * download each protocol's configuration data
58932618Ssam  * and the configuration data for tboard.
59032618Ssam  */
config(dlfd)59132618Ssam config(dlfd)
59232618Ssam 	int dlfd;
59332618Ssam {
59432618Ssam 	register int i;
59532618Ssam 	char *ldname;
59632618Ssam 
59732618Ssam 	for (ldname = cf.loadname; *ldname; ldname++) {
59832618Ssam 		switch (*ldname) {
59932618Ssam 		case '3': case 'a':
60032618Ssam 			if (ioctl(dlfd, MPIOASYNCNF, &bdasy) == MP_DLERROR) {
60132618Ssam 				printf("async ioctl failed\n");
60232618Ssam 				return (-1);
60332618Ssam 			}
60432618Ssam 			break;
60532618Ssam 		case 'b':
60632618Ssam 			break;
60732618Ssam 		case 'x':
60832618Ssam 			break;
60932618Ssam 
61032618Ssam 		case 's':
61132618Ssam 			break;
61232618Ssam 		}
61332618Ssam 	}
61432618Ssam }
61532618Ssam 
61632618Ssam /*
61732618Ssam  * tokenize the protoport string,
61832618Ssam  * (change from the letter to the corresponding number).
61932618Ssam  */
tknzmap(map)62032618Ssam tknzmap(map)
62132618Ssam 	char *map;
62232618Ssam {
62332618Ssam 	short i;
62432618Ssam 
62532618Ssam 	for (i = 0; i < MPMAXPORT; i++) {
62632618Ssam 		switch (*map) {
62732618Ssam 		case '3' :	*map = MPPROTO_ASYNC; break;
62832618Ssam 		case 'A' :	*map = MPPROTO_ASYNC; break;
62932618Ssam 		case 'B' :	*map = MPPROTO_BISYNC; break;
63032618Ssam 		case 'S' :	*map = MPPROTO_SNA; break;
63132618Ssam 		case 'X' :	*map = MPPROTO_X25; break;
63232618Ssam 		default:	*map = MPPROTO_UNUSED; break;
63332618Ssam 		}
63432618Ssam 		map++;
63532618Ssam 	}
63632618Ssam }
637