1 1.7 christos /* $NetBSD: devopen.c,v 1.7 2017/08/01 11:58:45 christos Exp $ */ 2 1.3 takemura 3 1.3 takemura /*- 4 1.3 takemura * Copyright (c) 1999 Shin Takemura. 5 1.3 takemura * All rights reserved. 6 1.3 takemura * 7 1.3 takemura * This software is part of the PocketBSD. 8 1.3 takemura * 9 1.3 takemura * Redistribution and use in source and binary forms, with or without 10 1.3 takemura * modification, are permitted provided that the following conditions 11 1.3 takemura * are met: 12 1.3 takemura * 1. Redistributions of source code must retain the above copyright 13 1.3 takemura * notice, this list of conditions and the following disclaimer. 14 1.3 takemura * 2. Redistributions in binary form must reproduce the above copyright 15 1.3 takemura * notice, this list of conditions and the following disclaimer in the 16 1.3 takemura * documentation and/or other materials provided with the distribution. 17 1.3 takemura * 3. All advertising materials mentioning features or use of this software 18 1.3 takemura * must display the following acknowledgement: 19 1.3 takemura * This product includes software developed by the PocketBSD project 20 1.3 takemura * and its contributors. 21 1.3 takemura * 4. Neither the name of the project nor the names of its contributors 22 1.3 takemura * may be used to endorse or promote products derived from this software 23 1.3 takemura * without specific prior written permission. 24 1.3 takemura * 25 1.3 takemura * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 26 1.3 takemura * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27 1.3 takemura * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28 1.3 takemura * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 29 1.3 takemura * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 30 1.3 takemura * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31 1.3 takemura * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32 1.3 takemura * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33 1.3 takemura * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34 1.3 takemura * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35 1.3 takemura * SUCH DAMAGE. 36 1.3 takemura * 37 1.3 takemura */ 38 1.3 takemura #define STANDALONE_WINDOWS_SIDE 39 1.3 takemura #include <stand.h> 40 1.3 takemura #include <winblk.h> 41 1.3 takemura #include <winfs.h> 42 1.3 takemura #include <lib/libsa/ufs.h> 43 1.3 takemura 44 1.4 dsl extern int parsebootfile(const char *, char**, char**, unsigned int*, 45 1.4 dsl unsigned int*, const char**); 46 1.3 takemura 47 1.3 takemura struct devsw devsw[] = { 48 1.3 takemura {"winblk", winblkstrategy, winblkopen, winblkclose, winblkioctl }, 49 1.3 takemura }; 50 1.3 takemura int ndevs = sizeof(devsw) / sizeof(struct devsw); 51 1.3 takemura 52 1.3 takemura static struct fs_ops winop = { 53 1.3 takemura win_open, win_close, win_read, win_write, win_seek, win_stat 54 1.3 takemura }; 55 1.3 takemura 56 1.3 takemura static struct fs_ops ufsop = { 57 1.3 takemura ufs_open, ufs_close, ufs_read, ufs_write, ufs_seek, ufs_stat 58 1.3 takemura }; 59 1.3 takemura 60 1.3 takemura struct fs_ops file_system[] = { 61 1.3 takemura { 0 }, 62 1.3 takemura }; 63 1.3 takemura int nfsys = 1; 64 1.3 takemura 65 1.3 takemura int 66 1.6 dsl parsebootfile(const char *fnamexx, char **fsmode, char **devname, unsigned int *unit, unsigned int *partition, const char **file) 67 1.6 dsl /* fsmode: out */ 68 1.6 dsl /* devname: out */ 69 1.6 dsl /* unit, *partition: out */ 70 1.6 dsl /* file: out */ 71 1.3 takemura { 72 1.3 takemura TCHAR *fname = (TCHAR*)fnamexx; 73 1.3 takemura 74 1.3 takemura if (fname[0] == TEXT('\\')) { 75 1.3 takemura *fsmode = "win"; 76 1.3 takemura *devname = ""; 77 1.3 takemura *unit = 0; 78 1.3 takemura *partition = 0; 79 1.3 takemura *file = fname; 80 1.3 takemura } else { 81 1.3 takemura static char name[1024]; /* XXX */ 82 1.3 takemura 83 1.7 christos if (wcstombs(name, (TCHAR*)fname, sizeof(name)) == (size_t)-1) { 84 1.3 takemura return (ENOENT); 85 1.3 takemura } 86 1.3 takemura if ('1' <= name[0] && name[0] <= '9' && name[1] == ':') { 87 1.3 takemura *unit = name[0] - '0'; 88 1.3 takemura *file = &name[2]; 89 1.3 takemura } else { 90 1.3 takemura *unit = 1; 91 1.3 takemura *file = name; 92 1.3 takemura } 93 1.3 takemura *fsmode = "ufs"; 94 1.3 takemura *devname = "DSK"; 95 1.3 takemura *partition = 0; 96 1.3 takemura } 97 1.3 takemura 98 1.3 takemura return (0); 99 1.3 takemura } 100 1.3 takemura 101 1.3 takemura 102 1.3 takemura int 103 1.5 dsl devopen(struct open_file *f, const char *fname, char **file) 104 1.3 takemura { 105 1.3 takemura char *devname; 106 1.3 takemura char *fsmode; 107 1.3 takemura unsigned int unit, partition; 108 1.3 takemura int error; 109 1.3 takemura 110 1.3 takemura if ((error = parsebootfile(fname, &fsmode, &devname, &unit, 111 1.3 takemura &partition, (const char **) file))) 112 1.3 takemura return (error); 113 1.3 takemura 114 1.3 takemura if (!strcmp(fsmode, "win")) { 115 1.3 takemura file_system[0] = winop; 116 1.3 takemura f->f_flags |= F_NODEV; /* handled by Windows */ 117 1.3 takemura return (0); 118 1.3 takemura } else 119 1.3 takemura if (!strcmp(fsmode, "ufs")) { 120 1.3 takemura file_system[0] = ufsop; 121 1.3 takemura f->f_dev = &devsw[0]; /* Windows block device. */ 122 1.3 takemura return (*f->f_dev->dv_open)(f, devname, unit, partition); 123 1.3 takemura } else { 124 1.3 takemura printf("no file system\n"); 125 1.3 takemura return (ENXIO); 126 1.3 takemura } 127 1.3 takemura /* NOTREACHED */ 128 1.3 takemura } 129