1 /* $NetBSD: devopen.c,v 1.10 2005/12/11 12:17:48 christos Exp $ */
5 * Matthias Drochner. All rights reserved.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 #include <lib/libsa/stand.h>
30 #include <lib/libkern/libkern.h>
31 #include <lib/libsa/ufs.h>
38 struct devsw devsw
[] = {
39 {"disk", biosdisk_strategy
, biosdisk_open
, biosdisk_close
, biosdisk_ioctl
},
41 int ndevs
= sizeof(devsw
) / sizeof(struct devsw
);
43 static struct fs_ops dosfs
= {
44 dos_open
, dos_close
, dos_read
, dos_write
, dos_seek
, dos_stat
46 static struct fs_ops ufsfs
= {
47 ufs_open
, ufs_close
, ufs_read
, ufs_write
, ufs_seek
, ufs_stat
50 struct fs_ops file_system
[] = {
72 #define NUMBIOSDEVS (sizeof(biosdevtab) / sizeof(biosdevtab[0]))
74 static int dev2bios(char *, unsigned int, int *);
77 dev2bios(char *devname
, unsigned int unit
, int *biosdev
)
81 for (i
= 0; i
< NUMBIOSDEVS
; i
++)
82 if (!strcmp(devname
, biosdevtab
[i
].name
)) {
83 *biosdev
= biosdevtab
[i
].biosdev
+ unit
;
84 if (unit
>= 4) /* ??? */
91 struct btinfo_bootpath bibp
;
94 devopen(struct open_file
*f
, const char *fname
, char **file
)
103 if ((error
= parsebootfile(fname
, &fsmode
, &devname
, &unit
,
104 &partition
, (const char **) file
)))
107 if (!strcmp(fsmode
, "dos")) {
108 file_system
[0] = dosfs
; /* structure assignment! */
109 f
->f_flags
|= F_NODEV
; /* handled by DOS */
111 } else if (!strcmp(fsmode
, "ufs")) {
112 if ((error
= dev2bios(devname
, unit
, &biosdev
)))
114 file_system
[0] = ufsfs
; /* structure assignment! */
115 dp
= &devsw
[0]; /* must be biosdisk */
118 strncpy(bibp
.bootpath
, *file
, sizeof(bibp
.bootpath
));
119 BI_ADD(&bibp
, BTINFO_BOOTPATH
, sizeof(bibp
));
121 return (biosdisk_open(f
, biosdev
, partition
));
123 printf("no file system\n");