2 * Copyright (c) 2011 Google, Inc.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
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.
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
27 #include <sys/cdefs.h>
28 __FBSDID("$FreeBSD$");
31 * Read from the host filesystem
34 #include <sys/param.h>
40 #include <bootstrap.h>
42 #include "libuserboot.h"
48 host_open(const char *upath, struct open_file *f)
51 if (f->f_dev != &host_dev)
54 return (CALLBACK(open, upath, &f->f_fsdata));
58 host_close(struct open_file *f)
61 CALLBACK(close, f->f_fsdata);
62 f->f_fsdata = (void *)0;
68 * Copy a portion of a file into memory.
71 host_read(struct open_file *f, void *start, size_t size, size_t *resid)
74 return (CALLBACK(read, f->f_fsdata, start, size, resid));
78 * Don't be silly - the bootstrap has no business writing anything.
81 host_write(struct open_file *f, void *start, size_t size, size_t *resid)
88 host_seek(struct open_file *f, off_t offset, int where)
91 return (CALLBACK(seek, f->f_fsdata, offset, where));
95 host_stat(struct open_file *f, struct stat *sb)
102 CALLBACK(stat, f->f_fsdata, &mode, &uid, &gid, &size);
111 host_readdir(struct open_file *f, struct dirent *d)
118 rc = CALLBACK(readdir, f->f_fsdata, &fileno, &type, &namelen,
123 d->d_fileno = fileno;
125 d->d_namlen = namelen;
138 host_dev_print(int verbose)
142 printf("%s devices:", host_dev.dv_name);
143 if (pager_output("\n") != 0)
146 snprintf(line, sizeof(line), " host%d: Host filesystem\n", 0);
147 return (pager_output(line));
151 * 'Open' the host device.
154 host_dev_open(struct open_file *f, ...)
160 dev = va_arg(args, struct devdesc*);
167 host_dev_close(struct open_file *f)
174 host_dev_strategy(void *devdata, int rw, daddr_t dblk, size_t offset,
175 size_t size, char *buf, size_t *rsize)
181 struct fs_ops host_fsops = {
192 struct devsw host_dev = {
195 .dv_init = host_dev_init,
196 .dv_strategy = host_dev_strategy,
197 .dv_open = host_dev_open,
198 .dv_close = host_dev_close,
200 .dv_print = host_dev_print,