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