1 /* $NetBSD: devopen.c,v 1.5 2009/03/14 15:36:07 dsl Exp $ */
4 * Copyright (c) 1999 Shin Takemura.
7 * This software is part of the PocketBSD.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. All advertising materials mentioning features or use of this software
18 * must display the following acknowledgement:
19 * This product includes software developed by the PocketBSD project
20 * and its contributors.
21 * 4. Neither the name of the project nor the names of its contributors
22 * may be used to endorse or promote products derived from this software
23 * without specific prior written permission.
25 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
38 #define STANDALONE_WINDOWS_SIDE
42 #include <lib/libsa/ufs.h>
44 extern int parsebootfile(const char *, char**, char**, unsigned int*,
45 unsigned int*, const char**);
47 struct devsw devsw
[] = {
48 {"winblk", winblkstrategy
, winblkopen
, winblkclose
, winblkioctl
},
50 int ndevs
= sizeof(devsw
) / sizeof(struct devsw
);
52 static struct fs_ops winop
= {
53 win_open
, win_close
, win_read
, win_write
, win_seek
, win_stat
56 static struct fs_ops ufsop
= {
57 ufs_open
, ufs_close
, ufs_read
, ufs_write
, ufs_seek
, ufs_stat
60 struct fs_ops file_system
[] = {
66 parsebootfile(const char *fnamexx
, char **fsmode
, char **devname
, unsigned int *unit
, unsigned int *partition
, const char **file
)
69 /* unit, *partition: out */
72 TCHAR
*fname
= (TCHAR
*)fnamexx
;
74 if (fname
[0] == TEXT('\\')) {
81 static char name
[1024]; /* XXX */
83 if (wcstombs(name
, (TCHAR
*)fname
, sizeof(name
)) < 0) {
86 if ('1' <= name
[0] && name
[0] <= '9' && name
[1] == ':') {
87 *unit
= name
[0] - '0';
103 devopen(struct open_file
*f
, const char *fname
, char **file
)
107 unsigned int unit
, partition
;
110 if ((error
= parsebootfile(fname
, &fsmode
, &devname
, &unit
,
111 &partition
, (const char **) file
)))
114 if (!strcmp(fsmode
, "win")) {
115 file_system
[0] = winop
;
116 f
->f_flags
|= F_NODEV
; /* handled by Windows */
119 if (!strcmp(fsmode
, "ufs")) {
120 file_system
[0] = ufsop
;
121 f
->f_dev
= &devsw
[0]; /* Windows block device. */
122 return (*f
->f_dev
->dv_open
)(f
, devname
, unit
, partition
);
124 printf("no file system\n");