1 /*- 2 * Copyright (c) 2011 Google, Inc. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 */ 26 27 #include <sys/cdefs.h> 28 __FBSDID("$FreeBSD$"); 29 30 /* 31 * Read from the host filesystem 32 */ 33 34 #include <sys/param.h> 35 #include <sys/time.h> 36 #include <stddef.h> 37 #include <stdarg.h> 38 #include <string.h> 39 #include <stand.h> 40 #include <bootstrap.h> 41 42 #include "libuserboot.h" 43 44 /* 45 * Open a file. 46 */ 47 static int 48 host_open(const char *upath, struct open_file *f) 49 { 50 51 if (f->f_dev != &host_dev) 52 return (EINVAL); 53 54 return (CALLBACK(open, upath, &f->f_fsdata)); 55 } 56 57 static int 58 host_close(struct open_file *f) 59 { 60 61 CALLBACK(close, f->f_fsdata); 62 f->f_fsdata = (void *)0; 63 64 return (0); 65 } 66 67 /* 68 * Copy a portion of a file into memory. 69 */ 70 static int 71 host_read(struct open_file *f, void *start, size_t size, size_t *resid) 72 { 73 74 return (CALLBACK(read, f->f_fsdata, start, size, resid)); 75 } 76 77 static off_t 78 host_seek(struct open_file *f, off_t offset, int where) 79 { 80 81 return (CALLBACK(seek, f->f_fsdata, offset, where)); 82 } 83 84 static int 85 host_stat(struct open_file *f, struct stat *sb) 86 { 87 88 CALLBACK(stat, f->f_fsdata, sb); 89 return (0); 90 } 91 92 static int 93 host_readdir(struct open_file *f, struct dirent *d) 94 { 95 uint32_t fileno; 96 uint8_t type; 97 size_t namelen; 98 int rc; 99 100 rc = CALLBACK(readdir, f->f_fsdata, &fileno, &type, &namelen, 101 d->d_name); 102 if (rc) 103 return (rc); 104 105 d->d_fileno = fileno; 106 d->d_type = type; 107 d->d_namlen = namelen; 108 109 return (0); 110 } 111 112 static int 113 host_dev_init(void) 114 { 115 116 return (0); 117 } 118 119 static int 120 host_dev_print(int verbose) 121 { 122 char line[80]; 123 124 printf("%s devices:", host_dev.dv_name); 125 if (pager_output("\n") != 0) 126 return (1); 127 128 snprintf(line, sizeof(line), " host%d: Host filesystem\n", 0); 129 return (pager_output(line)); 130 } 131 132 /* 133 * 'Open' the host device. 134 */ 135 static int 136 host_dev_open(struct open_file *f, ...) 137 { 138 139 return (0); 140 } 141 142 static int 143 host_dev_close(struct open_file *f) 144 { 145 146 return (0); 147 } 148 149 static int 150 host_dev_strategy(void *devdata, int rw, daddr_t dblk, size_t size, 151 char *buf, size_t *rsize) 152 { 153 154 return (ENOSYS); 155 } 156 157 struct fs_ops host_fsops = { 158 .fs_name = "host", 159 .fo_open = host_open, 160 .fo_close = host_close, 161 .fo_read = host_read, 162 .fo_write = null_write, 163 .fo_seek = host_seek, 164 .fo_stat = host_stat, 165 .fo_readdir = host_readdir, 166 }; 167 168 struct devsw host_dev = { 169 .dv_name = "host", 170 .dv_type = DEVT_NET, 171 .dv_init = host_dev_init, 172 .dv_strategy = host_dev_strategy, 173 .dv_open = host_dev_open, 174 .dv_close = host_dev_close, 175 .dv_ioctl = noioctl, 176 .dv_print = host_dev_print, 177 .dv_cleanup = nullsys, 178 }; 179