1/* $NetBSD: devopen.c,v 1.7 2017/08/01 11:58:45 christos 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 44extern int parsebootfile(const char *, char**, char**, unsigned int*, 45 unsigned int*, const char**); 46 47struct devsw devsw[] = { 48 {"winblk", winblkstrategy, winblkopen, winblkclose, winblkioctl }, 49}; 50int ndevs = sizeof(devsw) / sizeof(struct devsw); 51 52static struct fs_ops winop = { 53 win_open, win_close, win_read, win_write, win_seek, win_stat 54}; 55 56static struct fs_ops ufsop = { 57 ufs_open, ufs_close, ufs_read, ufs_write, ufs_seek, ufs_stat 58}; 59 60struct fs_ops file_system[] = { 61 { 0 }, 62}; 63int nfsys = 1; 64 65int 66parsebootfile(const char *fnamexx, char **fsmode, char **devname, unsigned int *unit, unsigned int *partition, const char **file) 67 /* fsmode: out */ 68 /* devname: out */ 69 /* unit, *partition: out */ 70 /* file: out */ 71{ 72 TCHAR *fname = (TCHAR*)fnamexx; 73 74 if (fname[0] == TEXT('\\')) { 75 *fsmode = "win"; 76 *devname = ""; 77 *unit = 0; 78 *partition = 0; 79 *file = fname; 80 } else { 81 static char name[1024]; /* XXX */ 82 83 if (wcstombs(name, (TCHAR*)fname, sizeof(name)) == (size_t)-1) { 84 return (ENOENT); 85 } 86 if ('1' <= name[0] && name[0] <= '9' && name[1] == ':') { 87 *unit = name[0] - '0'; 88 *file = &name[2]; 89 } else { 90 *unit = 1; 91 *file = name; 92 } 93 *fsmode = "ufs"; 94 *devname = "DSK"; 95 *partition = 0; 96 } 97 98 return (0); 99} 100 101 102int 103devopen(struct open_file *f, const char *fname, char **file) 104{ 105 char *devname; 106 char *fsmode; 107 unsigned int unit, partition; 108 int error; 109 110 if ((error = parsebootfile(fname, &fsmode, &devname, &unit, 111 &partition, (const char **) file))) 112 return (error); 113 114 if (!strcmp(fsmode, "win")) { 115 file_system[0] = winop; 116 f->f_flags |= F_NODEV; /* handled by Windows */ 117 return (0); 118 } else 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); 123 } else { 124 printf("no file system\n"); 125 return (ENXIO); 126 } 127 /* NOTREACHED */ 128} 129