xref: /original-bsd/sys/pmax/stand/libsa/devopen.c (revision 3705696b)
1 /*-
2  * Copyright (c) 1992, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * This code is derived from software contributed to Berkeley by
6  * Ralph Campbell.
7  *
8  * %sccs.include.redist.c%
9  *
10  *	@(#)devopen.c	8.1 (Berkeley) 06/10/93
11  */
12 
13 #include <stand/stand.h>
14 
15 /*
16  * Decode the string 'fname', open the device and return the remaining
17  * file name if any.
18  */
19 devopen(f, fname, file)
20 	struct open_file *f;
21 	char *fname;
22 	char **file;	/* out */
23 {
24 	register char *cp;
25 	register char *ncp;
26 	register struct devsw *dp;
27 	register int c, i;
28 	int ctlr = 0, unit = 0, part = 0;
29 	char namebuf[20];
30 	int rc;
31 
32 	cp = fname;
33 	ncp = namebuf;
34 
35 	/* look for a string like '5/rz0/vmunix' or '5/rz3f/vmunix */
36 	if ((c = *cp) >= '0' && c <= '9') {
37 		ctlr = c - '0';
38 		/* skip the '/' */
39 		if (*++cp != '/')
40 			return (ENXIO);
41 		cp++;
42 		while ((c = *cp) != '\0') {
43 			if (c == '/')
44 				break;
45 			if (c >= '0' && c <= '9') {
46 				/* read unit number */
47 				unit = c - '0';
48 
49 				/* look for a partition */
50 				if ((c = *++cp) >= 'a' && c <= 'h') {
51 					part = c - 'a';
52 					c = *++cp;
53 				}
54 				if (c != '/')
55 					return (ENXIO);
56 				break;
57 			}
58 			if (ncp < namebuf + sizeof(namebuf) - 1)
59 				*ncp++ = c;
60 			cp++;
61 		}
62 	} else {
63 		/* expect a string like 'rz(0,0,0)vmunix' */
64 		while ((c = *cp) != '\0') {
65 			if (c == '(') {
66 				cp++;
67 				break;
68 			}
69 			if (ncp < namebuf + sizeof(namebuf) - 1)
70 				*ncp++ = c;
71 			cp++;
72 		}
73 
74 		/* get controller number */
75 		if ((c = *cp) >= '0' && c <= '9') {
76 			ctlr = c - '0';
77 			c = *++cp;
78 		}
79 
80 		if (c == ',') {
81 			/* get SCSI device number */
82 			if ((c = *++cp) >= '0' && c <= '9') {
83 				unit = c - '0';
84 				c = *++cp;
85 			}
86 
87 			if (c == ',') {
88 				/* get partition number */
89 				if ((c = *++cp) >= '0' && c <= '9') {
90 					part = c - '0';
91 					c = *++cp;
92 				}
93 			}
94 		}
95 		if (c != ')')
96 			return (ENXIO);
97 		cp++;
98 	}
99 	*ncp = '\0';
100 
101 	for (dp = devsw, i = 0; i < ndevs; dp++, i++)
102 		if (dp->dv_name && strcmp(namebuf, dp->dv_name) == 0)
103 			goto fnd;
104 	printf("Unknown device '%s'\nKnown devices are:", namebuf);
105 	for (dp = devsw, i = 0; i < ndevs; dp++, i++)
106 		if (dp->dv_name)
107 			printf(" %s", dp->dv_name);
108 	printf("\n");
109 	return (ENXIO);
110 
111 fnd:
112 	rc = (dp->dv_open)(f, ctlr, unit, part);
113 	if (rc)
114 		return (rc);
115 
116 	f->f_dev = dp;
117 	if (file && *cp != '\0')
118 		*file = cp;
119 	return (0);
120 }
121