1 /* $NetBSD: devopen.c,v 1.3 2000/01/16 03:07:24 takemura Exp $ */ 2 3 /*- 4 * Copyright (c) 1999 Shin Takemura. 5 * All rights reserved. 6 * 7 * This software is part of the PocketBSD. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 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. 24 * 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 35 * SUCH DAMAGE. 36 * 37 */ 38 #define STANDALONE_WINDOWS_SIDE 39 #include <stand.h> 40 #include <winblk.h> 41 #include <winfs.h> 42 #include <lib/libsa/ufs.h> 43 44 extern int parsebootfile __P((const char *, char**, char**, unsigned int*, 45 unsigned int*, const char**)); 46 47 struct devsw devsw[] = { 48 {"winblk", winblkstrategy, winblkopen, winblkclose, winblkioctl }, 49 }; 50 int ndevs = sizeof(devsw) / sizeof(struct devsw); 51 52 static struct fs_ops winop = { 53 win_open, win_close, win_read, win_write, win_seek, win_stat 54 }; 55 56 static struct fs_ops ufsop = { 57 ufs_open, ufs_close, ufs_read, ufs_write, ufs_seek, ufs_stat 58 }; 59 60 struct fs_ops file_system[] = { 61 { 0 }, 62 }; 63 int nfsys = 1; 64 65 int 66 parsebootfile(fnamexx, fsmode, devname, unit, partition, file) 67 const char *fnamexx; 68 char **fsmode; /* out */ 69 char **devname; /* out */ 70 unsigned int *unit, *partition; /* out */ 71 const char **file; /* out */ 72 { 73 TCHAR *fname = (TCHAR*)fnamexx; 74 75 if (fname[0] == TEXT('\\')) { 76 *fsmode = "win"; 77 *devname = ""; 78 *unit = 0; 79 *partition = 0; 80 *file = fname; 81 } else { 82 static char name[1024]; /* XXX */ 83 84 if (wcstombs(name, (TCHAR*)fname, sizeof(name)) < 0) { 85 return (ENOENT); 86 } 87 if ('1' <= name[0] && name[0] <= '9' && name[1] == ':') { 88 *unit = name[0] - '0'; 89 *file = &name[2]; 90 } else { 91 *unit = 1; 92 *file = name; 93 } 94 *fsmode = "ufs"; 95 *devname = "DSK"; 96 *partition = 0; 97 } 98 99 return (0); 100 } 101 102 103 int 104 devopen(f, fname, file) 105 struct open_file *f; 106 const char *fname; 107 char **file; 108 { 109 char *devname; 110 char *fsmode; 111 unsigned int unit, partition; 112 int error; 113 114 if ((error = parsebootfile(fname, &fsmode, &devname, &unit, 115 &partition, (const char **) file))) 116 return (error); 117 118 if (!strcmp(fsmode, "win")) { 119 file_system[0] = winop; 120 f->f_flags |= F_NODEV; /* handled by Windows */ 121 return (0); 122 } else 123 if (!strcmp(fsmode, "ufs")) { 124 file_system[0] = ufsop; 125 f->f_dev = &devsw[0]; /* Windows block device. */ 126 return (*f->f_dev->dv_open)(f, devname, unit, partition); 127 } else { 128 printf("no file system\n"); 129 return (ENXIO); 130 } 131 /* NOTREACHED */ 132 } 133