devopen.c revision 1.2.8.2 1 1.2.8.2 kleink /* $NetBSD: devopen.c,v 1.2.8.2 2001/05/28 15:53:52 kleink Exp $ */
2 1.2.8.2 kleink
3 1.2.8.2 kleink /*-
4 1.2.8.2 kleink * Copyright (c) 1993 John Brezak
5 1.2.8.2 kleink * All rights reserved.
6 1.2.8.2 kleink *
7 1.2.8.2 kleink * Redistribution and use in source and binary forms, with or without
8 1.2.8.2 kleink * modification, are permitted provided that the following conditions
9 1.2.8.2 kleink * are met:
10 1.2.8.2 kleink * 1. Redistributions of source code must retain the above copyright
11 1.2.8.2 kleink * notice, this list of conditions and the following disclaimer.
12 1.2.8.2 kleink * 2. Redistributions in binary form must reproduce the above copyright
13 1.2.8.2 kleink * notice, this list of conditions and the following disclaimer in the
14 1.2.8.2 kleink * documentation and/or other materials provided with the distribution.
15 1.2.8.2 kleink * 3. The name of the author may not be used to endorse or promote products
16 1.2.8.2 kleink * derived from this software without specific prior written permission.
17 1.2.8.2 kleink *
18 1.2.8.2 kleink * THIS SOFTWARE IS PROVIDED BY THE AUTHOR `AS IS'' AND ANY EXPRESS OR
19 1.2.8.2 kleink * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 1.2.8.2 kleink * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 1.2.8.2 kleink * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
22 1.2.8.2 kleink * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 1.2.8.2 kleink * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24 1.2.8.2 kleink * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 1.2.8.2 kleink * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26 1.2.8.2 kleink * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
27 1.2.8.2 kleink * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 1.2.8.2 kleink * POSSIBILITY OF SUCH DAMAGE.
29 1.2.8.2 kleink */
30 1.2.8.2 kleink
31 1.2.8.2 kleink #include <lib/libsa/stand.h>
32 1.2.8.2 kleink #include <lib/libkern/libkern.h>
33 1.2.8.2 kleink
34 1.2.8.2 kleink #define ispart(c) ((c) >= 'a' && (c) <= 'h')
35 1.2.8.2 kleink
36 1.2.8.2 kleink int atoi __P((char *));
37 1.2.8.2 kleink int devlookup __P((char *));
38 1.2.8.2 kleink int devparse __P((const char *, int *, int *, int *, int *, int *, char **));
39 1.2.8.2 kleink
40 1.2.8.2 kleink int
41 1.2.8.2 kleink atoi(cp)
42 1.2.8.2 kleink char *cp;
43 1.2.8.2 kleink {
44 1.2.8.2 kleink int val = 0;
45 1.2.8.2 kleink
46 1.2.8.2 kleink while (isdigit(*cp))
47 1.2.8.2 kleink val = val * 10 + (*cp++ - '0');
48 1.2.8.2 kleink return (val);
49 1.2.8.2 kleink }
50 1.2.8.2 kleink
51 1.2.8.2 kleink int
52 1.2.8.2 kleink devlookup(d)
53 1.2.8.2 kleink char *d;
54 1.2.8.2 kleink {
55 1.2.8.2 kleink struct devsw *dp = devsw;
56 1.2.8.2 kleink int i;
57 1.2.8.2 kleink
58 1.2.8.2 kleink for (i = 0; i < ndevs; i++, dp++)
59 1.2.8.2 kleink if (dp->dv_name && strcmp(dp->dv_name, d) == 0)
60 1.2.8.2 kleink return (i);
61 1.2.8.2 kleink
62 1.2.8.2 kleink printf("No such device - Configured devices are:\n");
63 1.2.8.2 kleink for (dp = devsw, i = 0; i < ndevs; i++, dp++)
64 1.2.8.2 kleink if (dp->dv_name)
65 1.2.8.2 kleink printf(" %s", dp->dv_name);
66 1.2.8.2 kleink printf("\n");
67 1.2.8.2 kleink return (-1);
68 1.2.8.2 kleink }
69 1.2.8.2 kleink
70 1.2.8.2 kleink /*
71 1.2.8.2 kleink * Parse a device spec in one of two forms.
72 1.2.8.2 kleink * dev(ctlr, unit, part)file
73 1.2.8.2 kleink */
74 1.2.8.2 kleink int
75 1.2.8.2 kleink devparse(fname, dev, adapt, ctlr, unit, part, file)
76 1.2.8.2 kleink const char *fname;
77 1.2.8.2 kleink int *dev;
78 1.2.8.2 kleink int *adapt;
79 1.2.8.2 kleink int *ctlr;
80 1.2.8.2 kleink int *unit;
81 1.2.8.2 kleink int *part;
82 1.2.8.2 kleink char **file;
83 1.2.8.2 kleink {
84 1.2.8.2 kleink int argc, flag;
85 1.2.8.2 kleink char *s, *args[3];
86 1.2.8.2 kleink extern char nametmp[];
87 1.2.8.2 kleink
88 1.2.8.2 kleink /* get device name and make lower case */
89 1.2.8.2 kleink strcpy(nametmp, (char *)fname);
90 1.2.8.2 kleink for (s = nametmp; *s && *s != '('; s++)
91 1.2.8.2 kleink if (isupper(*s)) *s = tolower(*s);
92 1.2.8.2 kleink
93 1.2.8.2 kleink if (*s == '(') {
94 1.2.8.2 kleink /* lookup device and get index */
95 1.2.8.2 kleink *s = NULL;
96 1.2.8.2 kleink if ((*dev = devlookup(nametmp)) < 0)
97 1.2.8.2 kleink goto baddev;
98 1.2.8.2 kleink
99 1.2.8.2 kleink /* tokenize device ident */
100 1.2.8.2 kleink for (++s, flag = 0, argc = 0; *s && *s != ')'; s++) {
101 1.2.8.2 kleink if (*s != ',') {
102 1.2.8.2 kleink if (!flag) {
103 1.2.8.2 kleink flag++;
104 1.2.8.2 kleink args[argc++] = s;
105 1.2.8.2 kleink }
106 1.2.8.2 kleink } else {
107 1.2.8.2 kleink if (flag) {
108 1.2.8.2 kleink *s = NULL;
109 1.2.8.2 kleink flag = 0;
110 1.2.8.2 kleink }
111 1.2.8.2 kleink }
112 1.2.8.2 kleink }
113 1.2.8.2 kleink if (*s == ')')
114 1.2.8.2 kleink *s = NULL;
115 1.2.8.2 kleink
116 1.2.8.2 kleink switch (argc) {
117 1.2.8.2 kleink case 3:
118 1.2.8.2 kleink *part = atoi(args[2]);
119 1.2.8.2 kleink /* FALL THROUGH */
120 1.2.8.2 kleink case 2:
121 1.2.8.2 kleink *unit = atoi(args[1]);
122 1.2.8.2 kleink /* FALL THROUGH */
123 1.2.8.2 kleink case 1:
124 1.2.8.2 kleink *ctlr = atoi(args[0]);
125 1.2.8.2 kleink break;
126 1.2.8.2 kleink }
127 1.2.8.2 kleink *file = ++s;
128 1.2.8.2 kleink } else {
129 1.2.8.2 kleink /* no device present */
130 1.2.8.2 kleink *file = (char *)fname;
131 1.2.8.2 kleink }
132 1.2.8.2 kleink return (0);
133 1.2.8.2 kleink
134 1.2.8.2 kleink baddev:
135 1.2.8.2 kleink return (EINVAL);
136 1.2.8.2 kleink }
137 1.2.8.2 kleink
138 1.2.8.2 kleink int
139 1.2.8.2 kleink devopen(f, fname, file)
140 1.2.8.2 kleink struct open_file *f;
141 1.2.8.2 kleink const char *fname;
142 1.2.8.2 kleink char **file;
143 1.2.8.2 kleink {
144 1.2.8.2 kleink int error;
145 1.2.8.2 kleink int dev = 0, ctlr = 0, unit = 0, part = 0;
146 1.2.8.2 kleink int adapt = 0;
147 1.2.8.2 kleink struct devsw *dp = &devsw[0];
148 1.2.8.2 kleink
149 1.2.8.2 kleink if ((error =
150 1.2.8.2 kleink devparse(fname, &dev, &adapt, &ctlr, &unit, &part, file)) != 0)
151 1.2.8.2 kleink return (error);
152 1.2.8.2 kleink
153 1.2.8.2 kleink dp = &devsw[dev];
154 1.2.8.2 kleink if (!dp->dv_open)
155 1.2.8.2 kleink return (ENODEV);
156 1.2.8.2 kleink
157 1.2.8.2 kleink f->f_dev = dp;
158 1.2.8.2 kleink if ((error = (*dp->dv_open)(f, ctlr, unit, part)) == 0)
159 1.2.8.2 kleink return (0);
160 1.2.8.2 kleink
161 1.2.8.2 kleink printf("%s(%d,%d,%d): %s\n", devsw[dev].dv_name,
162 1.2.8.2 kleink ctlr, unit, part, strerror(error));
163 1.2.8.2 kleink
164 1.2.8.2 kleink return (error);
165 1.2.8.2 kleink }
166