xref: /openbmc/u-boot/fs/sandbox/sandboxfs.c (revision 83d290c56fab2d38cd1ab4c4cc7099559c1d5046)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
292ccc96bSSimon Glass /*
392ccc96bSSimon Glass  * Copyright (c) 2012, Google Inc.
492ccc96bSSimon Glass  */
592ccc96bSSimon Glass 
692ccc96bSSimon Glass #include <common.h>
792ccc96bSSimon Glass #include <fs.h>
892ccc96bSSimon Glass #include <os.h>
992ccc96bSSimon Glass 
sandbox_fs_set_blk_dev(struct blk_desc * rbdd,disk_partition_t * info)104101f687SSimon Glass int sandbox_fs_set_blk_dev(struct blk_desc *rbdd, disk_partition_t *info)
1192ccc96bSSimon Glass {
1285300a9aSSjoerd Simons 	/*
134101f687SSimon Glass 	 * Only accept a NULL struct blk_desc for the sandbox, which is when
1485300a9aSSjoerd Simons 	 * hostfs interface is used
1585300a9aSSjoerd Simons 	 */
1685300a9aSSjoerd Simons 	return rbdd != NULL;
1792ccc96bSSimon Glass }
1892ccc96bSSimon Glass 
sandbox_fs_read_at(const char * filename,loff_t pos,void * buffer,loff_t maxsize,loff_t * actread)1996b1046dSSuriyan Ramasami int sandbox_fs_read_at(const char *filename, loff_t pos, void *buffer,
2096b1046dSSuriyan Ramasami 		       loff_t maxsize, loff_t *actread)
2192ccc96bSSimon Glass {
2296b1046dSSuriyan Ramasami 	loff_t size;
2392ccc96bSSimon Glass 	int fd, ret;
2492ccc96bSSimon Glass 
2592ccc96bSSimon Glass 	fd = os_open(filename, OS_O_RDONLY);
2692ccc96bSSimon Glass 	if (fd < 0)
2792ccc96bSSimon Glass 		return fd;
2892ccc96bSSimon Glass 	ret = os_lseek(fd, pos, OS_SEEK_SET);
2992ccc96bSSimon Glass 	if (ret == -1) {
3092ccc96bSSimon Glass 		os_close(fd);
3192ccc96bSSimon Glass 		return ret;
3292ccc96bSSimon Glass 	}
3396b1046dSSuriyan Ramasami 	if (!maxsize) {
3496b1046dSSuriyan Ramasami 		ret = os_get_filesize(filename, &size);
3596b1046dSSuriyan Ramasami 		if (ret) {
3696b1046dSSuriyan Ramasami 			os_close(fd);
3796b1046dSSuriyan Ramasami 			return ret;
3896b1046dSSuriyan Ramasami 		}
3996b1046dSSuriyan Ramasami 
4096b1046dSSuriyan Ramasami 		maxsize = size;
4196b1046dSSuriyan Ramasami 	}
4296b1046dSSuriyan Ramasami 
4392ccc96bSSimon Glass 	size = os_read(fd, buffer, maxsize);
4492ccc96bSSimon Glass 	os_close(fd);
4592ccc96bSSimon Glass 
4696b1046dSSuriyan Ramasami 	if (size < 0) {
4796b1046dSSuriyan Ramasami 		ret = -1;
4896b1046dSSuriyan Ramasami 	} else {
4996b1046dSSuriyan Ramasami 		ret = 0;
5096b1046dSSuriyan Ramasami 		*actread = size;
5192ccc96bSSimon Glass 	}
5292ccc96bSSimon Glass 
5396b1046dSSuriyan Ramasami 	return ret;
5496b1046dSSuriyan Ramasami }
5596b1046dSSuriyan Ramasami 
sandbox_fs_write_at(const char * filename,loff_t pos,void * buffer,loff_t towrite,loff_t * actwrite)5696b1046dSSuriyan Ramasami int sandbox_fs_write_at(const char *filename, loff_t pos, void *buffer,
5796b1046dSSuriyan Ramasami 			loff_t towrite, loff_t *actwrite)
587eb2c8d5SSimon Glass {
597eb2c8d5SSimon Glass 	ssize_t size;
607eb2c8d5SSimon Glass 	int fd, ret;
617eb2c8d5SSimon Glass 
627eb2c8d5SSimon Glass 	fd = os_open(filename, OS_O_RDWR | OS_O_CREAT);
637eb2c8d5SSimon Glass 	if (fd < 0)
647eb2c8d5SSimon Glass 		return fd;
657eb2c8d5SSimon Glass 	ret = os_lseek(fd, pos, OS_SEEK_SET);
667eb2c8d5SSimon Glass 	if (ret == -1) {
677eb2c8d5SSimon Glass 		os_close(fd);
687eb2c8d5SSimon Glass 		return ret;
697eb2c8d5SSimon Glass 	}
707eb2c8d5SSimon Glass 	size = os_write(fd, buffer, towrite);
717eb2c8d5SSimon Glass 	os_close(fd);
727eb2c8d5SSimon Glass 
7396b1046dSSuriyan Ramasami 	if (size == -1) {
7496b1046dSSuriyan Ramasami 		ret = -1;
7596b1046dSSuriyan Ramasami 	} else {
7696b1046dSSuriyan Ramasami 		ret = 0;
7796b1046dSSuriyan Ramasami 		*actwrite = size;
7896b1046dSSuriyan Ramasami 	}
7996b1046dSSuriyan Ramasami 
8096b1046dSSuriyan Ramasami 	return ret;
817eb2c8d5SSimon Glass }
827eb2c8d5SSimon Glass 
sandbox_fs_ls(const char * dirname)8392ccc96bSSimon Glass int sandbox_fs_ls(const char *dirname)
8492ccc96bSSimon Glass {
8592ccc96bSSimon Glass 	struct os_dirent_node *head, *node;
8692ccc96bSSimon Glass 	int ret;
8792ccc96bSSimon Glass 
8892ccc96bSSimon Glass 	ret = os_dirent_ls(dirname, &head);
8992ccc96bSSimon Glass 	if (ret)
900317724eSTom Rini 		goto out;
9192ccc96bSSimon Glass 
9292ccc96bSSimon Glass 	for (node = head; node; node = node->next) {
9392ccc96bSSimon Glass 		printf("%s %10lu %s\n", os_dirent_get_typename(node->type),
9492ccc96bSSimon Glass 		       node->size, node->name);
9592ccc96bSSimon Glass 	}
960317724eSTom Rini out:
9786167089SStefan Brüns 	os_dirent_free(head);
9892ccc96bSSimon Glass 
990317724eSTom Rini 	return ret;
10092ccc96bSSimon Glass }
10192ccc96bSSimon Glass 
sandbox_fs_exists(const char * filename)1020a30aa1eSStephen Warren int sandbox_fs_exists(const char *filename)
1030a30aa1eSStephen Warren {
10496b1046dSSuriyan Ramasami 	loff_t size;
10596b1046dSSuriyan Ramasami 	int ret;
1060a30aa1eSStephen Warren 
10796b1046dSSuriyan Ramasami 	ret = os_get_filesize(filename, &size);
10896b1046dSSuriyan Ramasami 	return ret == 0;
1090a30aa1eSStephen Warren }
1100a30aa1eSStephen Warren 
sandbox_fs_size(const char * filename,loff_t * size)111d455d878SSuriyan Ramasami int sandbox_fs_size(const char *filename, loff_t *size)
112cf659819SStephen Warren {
113d455d878SSuriyan Ramasami 	return os_get_filesize(filename, size);
114cf659819SStephen Warren }
115cf659819SStephen Warren 
sandbox_fs_close(void)11692ccc96bSSimon Glass void sandbox_fs_close(void)
11792ccc96bSSimon Glass {
11892ccc96bSSimon Glass }
11992ccc96bSSimon Glass 
fs_read_sandbox(const char * filename,void * buf,loff_t offset,loff_t len,loff_t * actread)120d455d878SSuriyan Ramasami int fs_read_sandbox(const char *filename, void *buf, loff_t offset, loff_t len,
121d455d878SSuriyan Ramasami 		    loff_t *actread)
12292ccc96bSSimon Glass {
12396b1046dSSuriyan Ramasami 	int ret;
12492ccc96bSSimon Glass 
125d455d878SSuriyan Ramasami 	ret = sandbox_fs_read_at(filename, offset, buf, len, actread);
126d455d878SSuriyan Ramasami 	if (ret)
12792ccc96bSSimon Glass 		printf("** Unable to read file %s **\n", filename);
128d455d878SSuriyan Ramasami 
12996b1046dSSuriyan Ramasami 	return ret;
13092ccc96bSSimon Glass }
13192ccc96bSSimon Glass 
fs_write_sandbox(const char * filename,void * buf,loff_t offset,loff_t len,loff_t * actwrite)132d455d878SSuriyan Ramasami int fs_write_sandbox(const char *filename, void *buf, loff_t offset,
133d455d878SSuriyan Ramasami 		     loff_t len, loff_t *actwrite)
1347eb2c8d5SSimon Glass {
13596b1046dSSuriyan Ramasami 	int ret;
1367eb2c8d5SSimon Glass 
137d455d878SSuriyan Ramasami 	ret = sandbox_fs_write_at(filename, offset, buf, len, actwrite);
138d455d878SSuriyan Ramasami 	if (ret)
1397eb2c8d5SSimon Glass 		printf("** Unable to write file %s **\n", filename);
1407eb2c8d5SSimon Glass 
141d455d878SSuriyan Ramasami 	return ret;
1427eb2c8d5SSimon Glass }
143