diff options
| -rw-r--r-- | Makefile | 1 | ||||
| -rw-r--r-- | disk/part.c | 17 | ||||
| -rw-r--r-- | fs/fs.c | 10 | ||||
| -rw-r--r-- | fs/sandbox/Makefile | 47 | ||||
| -rw-r--r-- | fs/sandbox/sandboxfs.c | 83 | ||||
| -rw-r--r-- | include/fs.h | 1 | ||||
| -rw-r--r-- | include/sandboxfs.h | 30 | 
7 files changed, 189 insertions, 0 deletions
| @@ -264,6 +264,7 @@ LIBS-y += fs/libfs.o \  	fs/fdos/libfdos.o \  	fs/jffs2/libjffs2.o \  	fs/reiserfs/libreiserfs.o \ +	fs/sandbox/libsandboxfs.o \  	fs/ubifs/libubifs.o \  	fs/yaffs2/libyaffs2.o \  	fs/zfs/libzfs.o diff --git a/disk/part.c b/disk/part.c index 7bdc90eff..58a45637a 100644 --- a/disk/part.c +++ b/disk/part.c @@ -472,6 +472,23 @@ int get_device_and_partition(const char *ifname, const char *dev_part_str,  	int part;  	disk_partition_t tmpinfo; +	/* +	 * For now, we have a special case for sandbox, since there is no +	 * real block device support. +	 */ +	if (0 == strcmp(ifname, "host")) { +		*dev_desc = NULL; +		info->start = info->size =  info->blksz = 0; +		info->bootable = 0; +		strcpy((char *)info->type, BOOT_PART_TYPE); +		strcpy((char *)info->name, "Sandbox host"); +#ifdef CONFIG_PARTITION_UUIDS +		info->uuid[0] = 0; +#endif + +		return 0; +	} +  	/* If no dev_part_str, use bootdevice environment variable */  	if (!dev_part_str || !strlen(dev_part_str) ||  	    !strcmp(dev_part_str, "-")) @@ -20,6 +20,7 @@  #include <ext4fs.h>  #include <fat.h>  #include <fs.h> +#include <sandboxfs.h>  #include <asm/io.h>  DECLARE_GLOBAL_DATA_PTR; @@ -78,6 +79,15 @@ static struct fstype_info fstypes[] = {  		.read = ext4_read_file,  	},  #endif +#ifdef CONFIG_SANDBOX +	{ +		.fstype = FS_TYPE_SANDBOX, +		.probe = sandbox_fs_set_blk_dev, +		.close = sandbox_fs_close, +		.ls = sandbox_fs_ls, +		.read = fs_read_sandbox, +	}, +#endif  	{  		.fstype = FS_TYPE_ANY,  		.probe = fs_probe_unsupported, diff --git a/fs/sandbox/Makefile b/fs/sandbox/Makefile new file mode 100644 index 000000000..b3155b004 --- /dev/null +++ b/fs/sandbox/Makefile @@ -0,0 +1,47 @@ +# +# Copyright (c) 2012, Google Inc. +# +# (C) Copyright 2006 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# (C) Copyright 2003 +# Pavel Bartusek, Sysgo Real-Time Solutions AG, pba@sysgo.de +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# + +include $(TOPDIR)/config.mk + +LIB	= $(obj)libsandboxfs.o + +COBJS-$(CONFIG_SANDBOX) := sandboxfs.o + +SRCS	:= $(COBJS-y:.o=.c) +OBJS	:= $(addprefix $(obj),$(AOBJS) $(COBJS-y)) + +all:	$(LIB) $(AOBJS) + +$(LIB):	$(obj).depend $(OBJS) +	$(call cmd_link_o_target, $(OBJS)) + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################### diff --git a/fs/sandbox/sandboxfs.c b/fs/sandbox/sandboxfs.c new file mode 100644 index 000000000..02d26ff85 --- /dev/null +++ b/fs/sandbox/sandboxfs.c @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2012, Google Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <fs.h> +#include <os.h> + +int sandbox_fs_set_blk_dev(block_dev_desc_t *rbdd, disk_partition_t *info) +{ +	return 0; +} + +long sandbox_fs_read_at(const char *filename, unsigned long pos, +			     void *buffer, unsigned long maxsize) +{ +	ssize_t size; +	int fd, ret; + +	fd = os_open(filename, OS_O_RDONLY); +	if (fd < 0) +		return fd; +	ret = os_lseek(fd, pos, OS_SEEK_SET); +	if (ret == -1) { +		os_close(fd); +		return ret; +	} +	if (!maxsize) +		maxsize = os_get_filesize(filename); +	size = os_read(fd, buffer, maxsize); +	os_close(fd); + +	return size; +} + +int sandbox_fs_ls(const char *dirname) +{ +	struct os_dirent_node *head, *node; +	int ret; + +	ret = os_dirent_ls(dirname, &head); +	if (ret) +		return ret; + +	for (node = head; node; node = node->next) { +		printf("%s %10lu %s\n", os_dirent_get_typename(node->type), +		       node->size, node->name); +	} + +	return 0; +} + +void sandbox_fs_close(void) +{ +} + +int fs_read_sandbox(const char *filename, void *buf, int offset, int len) +{ +	int len_read; + +	len_read = sandbox_fs_read_at(filename, offset, buf, len); +	if (len_read == -1) { +		printf("** Unable to read file %s **\n", filename); +		return -1; +	} + +	return len_read; +} diff --git a/include/fs.h b/include/fs.h index 4f30a385a..b6d69e5ce 100644 --- a/include/fs.h +++ b/include/fs.h @@ -21,6 +21,7 @@  #define FS_TYPE_ANY	0  #define FS_TYPE_FAT	1  #define FS_TYPE_EXT	2 +#define FS_TYPE_SANDBOX	3  /*   * Tell the fs layer which block device an partition to use for future diff --git a/include/sandboxfs.h b/include/sandboxfs.h new file mode 100644 index 000000000..f5213ac10 --- /dev/null +++ b/include/sandboxfs.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2012, Google Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __SANDBOX_FS__ +#define __SANDBOX_FS__ + +int sandbox_fs_set_blk_dev(block_dev_desc_t *rbdd, disk_partition_t *info); + +long sandbox_fs_read_at(const char *filename, unsigned long pos, +			     void *buffer, unsigned long maxsize); + +void sandbox_fs_close(void); +int sandbox_fs_ls(const char *dirname); +int fs_read_sandbox(const char *filename, void *buf, int offset, int len); + +#endif |