1 /* $NetBSD: devopen.c,v 1.6 2008/04/28 20:23:16 martin Exp $ */
4 * Copyright (c) 2003 The NetBSD Foundation, Inc.
7 * This code is derived from software contributed to The NetBSD Foundation
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
32 #include <lib/libsa/stand.h>
33 #include <lib/libkern/libkern.h>
37 extern const struct fs_ops file_system_nfs
;
40 * Parse a device spec.
46 devparse(const char *fname
, int *dev
, uint8_t *unit
, uint8_t *part
,
51 *unit
= 0; /* default to wd0a */
54 *file
= DEFKERNELNAME
;
59 if ((col
= strchr(fname
, ':')) != NULL
) {
63 char devname
[MAXDEVNAME
];
66 if (devlen
> MAXDEVNAME
)
69 #define isnum(c) (((c) >= '0') && ((c) <= '9'))
70 #define isalpha(c) (((c) >= 'a') && ((c) <= 'z'))
72 /* extract device name */
73 for (i
= 0; isalpha(fname
[i
]) && (i
< devlen
); i
++)
74 devname
[i
] = fname
[i
];
77 if (strcmp(devname
, "nfs") == 0) {
78 /* no unit number or partition suffix on netboot */
82 file_system
[0] = file_system_nfs
;
84 /* parse [disk][unit][part] (ex. wd0a) strings */
89 for (u
= 0; isnum(fname
[i
]) && (i
< devlen
); i
++)
90 u
= u
* 10 + (fname
[i
] - '0');
92 if (!isalpha(fname
[i
]))
95 /* partition number */
104 /* check device name */
105 for (dp
= devsw
, i
= 0; i
< ndevs
; dp
++, i
++) {
106 if (dp
->dv_name
&& !strcmp(devname
, dp
->dv_name
))
126 devopen(struct open_file
*f
, const char *fname
, char **file
)
132 DPRINTF(("devopen(%s)\n", fname
));
134 if ((error
= devparse(fname
, &dev
, &unit
, &part
,
135 (const char **)file
)) != 0)
139 if ((void *)dp
->dv_open
== (void *)nodev
)
144 if ((error
= (*dp
->dv_open
)(f
, unit
, part
)) != 0)
145 printf("%s%d%c: %d = %s\n", devsw
[dev
].dv_name
,
146 unit
, 'a' + part
, error
, strerror(error
));