xref: /netbsd-src/sys/arch/evbmips/stand/sbmips/netboot/devopen.c (revision b1431b71daeb849d86a211537e1416d72a1397dc)
1*b1431b71Smrg /* $NetBSD: devopen.c,v 1.1.1.1 2017/07/24 08:56:29 mrg Exp $ */
2*b1431b71Smrg 
3*b1431b71Smrg /*-
4*b1431b71Smrg  * Copyright (c) 1992, 1993
5*b1431b71Smrg  *	The Regents of the University of California.  All rights reserved.
6*b1431b71Smrg  *
7*b1431b71Smrg  * This code is derived from software contributed to Berkeley by
8*b1431b71Smrg  * Ralph Campbell.
9*b1431b71Smrg  *
10*b1431b71Smrg  * Redistribution and use in source and binary forms, with or without
11*b1431b71Smrg  * modification, are permitted provided that the following conditions
12*b1431b71Smrg  * are met:
13*b1431b71Smrg  * 1. Redistributions of source code must retain the above copyright
14*b1431b71Smrg  *    notice, this list of conditions and the following disclaimer.
15*b1431b71Smrg  * 2. Redistributions in binary form must reproduce the above copyright
16*b1431b71Smrg  *    notice, this list of conditions and the following disclaimer in the
17*b1431b71Smrg  *    documentation and/or other materials provided with the distribution.
18*b1431b71Smrg  * 3. Neither the name of the University nor the names of its contributors
19*b1431b71Smrg  *    may be used to endorse or promote products derived from this software
20*b1431b71Smrg  *    without specific prior written permission.
21*b1431b71Smrg  *
22*b1431b71Smrg  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23*b1431b71Smrg  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24*b1431b71Smrg  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25*b1431b71Smrg  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26*b1431b71Smrg  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27*b1431b71Smrg  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28*b1431b71Smrg  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29*b1431b71Smrg  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30*b1431b71Smrg  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31*b1431b71Smrg  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32*b1431b71Smrg  * SUCH DAMAGE.
33*b1431b71Smrg  *
34*b1431b71Smrg  *	@(#)devopen.c	8.1 (Berkeley) 6/10/93
35*b1431b71Smrg  */
36*b1431b71Smrg 
37*b1431b71Smrg #include <lib/libsa/stand.h>
38*b1431b71Smrg 
39*b1431b71Smrg /*
40*b1431b71Smrg  * Decode the string 'fname', open the device and return the remaining
41*b1431b71Smrg  * file name if any.
42*b1431b71Smrg  */
43*b1431b71Smrg int
devopen(struct open_file * f,const char * fname,char ** file)44*b1431b71Smrg devopen(struct open_file *f, const char *fname, char **file)
45*b1431b71Smrg 	/* file:	 out */
46*b1431b71Smrg {
47*b1431b71Smrg 	register char *cp;
48*b1431b71Smrg 	register struct devsw *dp;
49*b1431b71Smrg #if 0
50*b1431b71Smrg 	register char *ncp;
51*b1431b71Smrg 	register int c, i;
52*b1431b71Smrg 	char namebuf[20];
53*b1431b71Smrg #endif
54*b1431b71Smrg 	int ctlr = 0, unit = 0, part = 0;
55*b1431b71Smrg 	int rc;
56*b1431b71Smrg 
57*b1431b71Smrg 	cp = (char *)fname;
58*b1431b71Smrg #if 0
59*b1431b71Smrg 	ncp = namebuf;
60*b1431b71Smrg 
61*b1431b71Smrg 	/* look for a string like '5/rz0/vmunix' or '5/rz3f/vmunix */
62*b1431b71Smrg 	if ((c = *cp) >= '0' && c <= '9') {
63*b1431b71Smrg 		ctlr = c - '0';
64*b1431b71Smrg 		/* skip the '/' */
65*b1431b71Smrg 		if (*++cp != '/')
66*b1431b71Smrg 			return (ENXIO);
67*b1431b71Smrg 		cp++;
68*b1431b71Smrg 		while ((c = *cp) != '\0') {
69*b1431b71Smrg 			if (c == '/')
70*b1431b71Smrg 				break;
71*b1431b71Smrg 			if (c >= '0' && c <= '9') {
72*b1431b71Smrg 				/* read unit number */
73*b1431b71Smrg 				unit = c - '0';
74*b1431b71Smrg 
75*b1431b71Smrg 				/* look for a partition */
76*b1431b71Smrg 				if ((c = *++cp) >= 'a' && c <= 'h') {
77*b1431b71Smrg 					part = c - 'a';
78*b1431b71Smrg 					c = *++cp;
79*b1431b71Smrg 				}
80*b1431b71Smrg 				if (c != '/')
81*b1431b71Smrg 					return (ENXIO);
82*b1431b71Smrg 				break;
83*b1431b71Smrg 			}
84*b1431b71Smrg 			if (ncp < namebuf + sizeof(namebuf) - 1)
85*b1431b71Smrg 				*ncp++ = c;
86*b1431b71Smrg 			cp++;
87*b1431b71Smrg 		}
88*b1431b71Smrg 		*ncp = '\0';
89*b1431b71Smrg 	/*
90*b1431b71Smrg 	 * XXX
91*b1431b71Smrg 	 * pulling strchr from the C library, should pull from libkern.
92*b1431b71Smrg 	 */
93*b1431b71Smrg 	} else if (strchr(cp, '(')) {
94*b1431b71Smrg 		/* expect a string like 'rz(0,0,0)vmunix' */
95*b1431b71Smrg 		while ((c = *cp) != '\0') {
96*b1431b71Smrg 			if (c == '(') {
97*b1431b71Smrg 				cp++;
98*b1431b71Smrg 				break;
99*b1431b71Smrg 			}
100*b1431b71Smrg 			if (ncp < namebuf + sizeof(namebuf) - 1)
101*b1431b71Smrg 				*ncp++ = c;
102*b1431b71Smrg 			cp++;
103*b1431b71Smrg 		}
104*b1431b71Smrg 
105*b1431b71Smrg 		/* get controller number */
106*b1431b71Smrg 		if ((c = *cp) >= '0' && c <= '9') {
107*b1431b71Smrg 			ctlr = c - '0';
108*b1431b71Smrg 			c = *++cp;
109*b1431b71Smrg 		}
110*b1431b71Smrg 
111*b1431b71Smrg 		if (c == ',') {
112*b1431b71Smrg 			/* get SCSI device number */
113*b1431b71Smrg 			if ((c = *++cp) >= '0' && c <= '9') {
114*b1431b71Smrg 				unit = c - '0';
115*b1431b71Smrg 				c = *++cp;
116*b1431b71Smrg 			}
117*b1431b71Smrg 
118*b1431b71Smrg 			if (c == ',') {
119*b1431b71Smrg 				/* get partition number */
120*b1431b71Smrg 				if ((c = *++cp) >= '0' && c <= '9') {
121*b1431b71Smrg 					part = c - '0';
122*b1431b71Smrg 					c = *++cp;
123*b1431b71Smrg 				}
124*b1431b71Smrg 			}
125*b1431b71Smrg 		}
126*b1431b71Smrg 		if (c != ')')
127*b1431b71Smrg 			return (ENXIO);
128*b1431b71Smrg 		cp++;
129*b1431b71Smrg 		*ncp = '\0';
130*b1431b71Smrg 	} else {
131*b1431b71Smrg #endif
132*b1431b71Smrg 		dp = devsw;
133*b1431b71Smrg 		ctlr = unit = part = 0;
134*b1431b71Smrg 		goto fnd;
135*b1431b71Smrg #if 0
136*b1431b71Smrg 	}
137*b1431b71Smrg 
138*b1431b71Smrg 	for (dp = devsw, i = 0; i < ndevs; dp++, i++)
139*b1431b71Smrg 		if (dp->dv_name && strcmp(namebuf, dp->dv_name) == 0)
140*b1431b71Smrg 			goto fnd;
141*b1431b71Smrg 	printf("Unknown device '%s'\nKnown devices are:", namebuf);
142*b1431b71Smrg 	for (dp = devsw, i = 0; i < ndevs; dp++, i++)
143*b1431b71Smrg 		if (dp->dv_name)
144*b1431b71Smrg 			printf(" %s", dp->dv_name);
145*b1431b71Smrg 	printf("\n");
146*b1431b71Smrg 	return (ENXIO);
147*b1431b71Smrg #endif
148*b1431b71Smrg 
149*b1431b71Smrg fnd:
150*b1431b71Smrg 	rc = (dp->dv_open)(f, ctlr, unit, part);
151*b1431b71Smrg 	if (rc)
152*b1431b71Smrg 		return (rc);
153*b1431b71Smrg 
154*b1431b71Smrg 	f->f_dev = dp;
155*b1431b71Smrg 	if (file && *cp != '\0')
156*b1431b71Smrg 		*file = cp;
157*b1431b71Smrg 	return (0);
158*b1431b71Smrg }
159