xref: /rk3399_rockchip-uboot/fs/sandbox/sandboxfs.c (revision 73eed452b9c9827474c0789c30729dca6fcf061d)
192ccc96bSSimon Glass /*
292ccc96bSSimon Glass  * Copyright (c) 2012, Google Inc.
392ccc96bSSimon Glass  *
41a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
592ccc96bSSimon Glass  */
692ccc96bSSimon Glass 
792ccc96bSSimon Glass #include <common.h>
892ccc96bSSimon Glass #include <fs.h>
992ccc96bSSimon Glass #include <os.h>
1092ccc96bSSimon Glass 
sandbox_fs_set_blk_dev(struct blk_desc * rbdd,disk_partition_t * info)114101f687SSimon Glass int sandbox_fs_set_blk_dev(struct blk_desc *rbdd, disk_partition_t *info)
1292ccc96bSSimon Glass {
1385300a9aSSjoerd Simons 	/*
144101f687SSimon Glass 	 * Only accept a NULL struct blk_desc for the sandbox, which is when
1585300a9aSSjoerd Simons 	 * hostfs interface is used
1685300a9aSSjoerd Simons 	 */
1785300a9aSSjoerd Simons 	return rbdd != NULL;
1892ccc96bSSimon Glass }
1992ccc96bSSimon Glass 
sandbox_fs_read_at(const char * filename,loff_t pos,void * buffer,loff_t maxsize,loff_t * actread)2096b1046dSSuriyan Ramasami int sandbox_fs_read_at(const char *filename, loff_t pos, void *buffer,
2196b1046dSSuriyan Ramasami 		       loff_t maxsize, loff_t *actread)
2292ccc96bSSimon Glass {
2396b1046dSSuriyan Ramasami 	loff_t size;
2492ccc96bSSimon Glass 	int fd, ret;
2592ccc96bSSimon Glass 
2692ccc96bSSimon Glass 	fd = os_open(filename, OS_O_RDONLY);
2792ccc96bSSimon Glass 	if (fd < 0)
2892ccc96bSSimon Glass 		return fd;
2992ccc96bSSimon Glass 	ret = os_lseek(fd, pos, OS_SEEK_SET);
3092ccc96bSSimon Glass 	if (ret == -1) {
3192ccc96bSSimon Glass 		os_close(fd);
3292ccc96bSSimon Glass 		return ret;
3392ccc96bSSimon Glass 	}
3496b1046dSSuriyan Ramasami 	if (!maxsize) {
3596b1046dSSuriyan Ramasami 		ret = os_get_filesize(filename, &size);
3696b1046dSSuriyan Ramasami 		if (ret) {
3796b1046dSSuriyan Ramasami 			os_close(fd);
3896b1046dSSuriyan Ramasami 			return ret;
3996b1046dSSuriyan Ramasami 		}
4096b1046dSSuriyan Ramasami 
4196b1046dSSuriyan Ramasami 		maxsize = size;
4296b1046dSSuriyan Ramasami 	}
4396b1046dSSuriyan Ramasami 
4492ccc96bSSimon Glass 	size = os_read(fd, buffer, maxsize);
4592ccc96bSSimon Glass 	os_close(fd);
4692ccc96bSSimon Glass 
4796b1046dSSuriyan Ramasami 	if (size < 0) {
4896b1046dSSuriyan Ramasami 		ret = -1;
4996b1046dSSuriyan Ramasami 	} else {
5096b1046dSSuriyan Ramasami 		ret = 0;
5196b1046dSSuriyan Ramasami 		*actread = size;
5292ccc96bSSimon Glass 	}
5392ccc96bSSimon Glass 
5496b1046dSSuriyan Ramasami 	return ret;
5596b1046dSSuriyan Ramasami }
5696b1046dSSuriyan Ramasami 
sandbox_fs_write_at(const char * filename,loff_t pos,void * buffer,loff_t towrite,loff_t * actwrite)5796b1046dSSuriyan Ramasami int sandbox_fs_write_at(const char *filename, loff_t pos, void *buffer,
5896b1046dSSuriyan Ramasami 			loff_t towrite, loff_t *actwrite)
597eb2c8d5SSimon Glass {
607eb2c8d5SSimon Glass 	ssize_t size;
617eb2c8d5SSimon Glass 	int fd, ret;
627eb2c8d5SSimon Glass 
637eb2c8d5SSimon Glass 	fd = os_open(filename, OS_O_RDWR | OS_O_CREAT);
647eb2c8d5SSimon Glass 	if (fd < 0)
657eb2c8d5SSimon Glass 		return fd;
667eb2c8d5SSimon Glass 	ret = os_lseek(fd, pos, OS_SEEK_SET);
677eb2c8d5SSimon Glass 	if (ret == -1) {
687eb2c8d5SSimon Glass 		os_close(fd);
697eb2c8d5SSimon Glass 		return ret;
707eb2c8d5SSimon Glass 	}
717eb2c8d5SSimon Glass 	size = os_write(fd, buffer, towrite);
727eb2c8d5SSimon Glass 	os_close(fd);
737eb2c8d5SSimon Glass 
7496b1046dSSuriyan Ramasami 	if (size == -1) {
7596b1046dSSuriyan Ramasami 		ret = -1;
7696b1046dSSuriyan Ramasami 	} else {
7796b1046dSSuriyan Ramasami 		ret = 0;
7896b1046dSSuriyan Ramasami 		*actwrite = size;
7996b1046dSSuriyan Ramasami 	}
8096b1046dSSuriyan Ramasami 
8196b1046dSSuriyan Ramasami 	return ret;
827eb2c8d5SSimon Glass }
837eb2c8d5SSimon Glass 
sandbox_fs_ls(const char * dirname)8492ccc96bSSimon Glass int sandbox_fs_ls(const char *dirname)
8592ccc96bSSimon Glass {
8692ccc96bSSimon Glass 	struct os_dirent_node *head, *node;
8792ccc96bSSimon Glass 	int ret;
8892ccc96bSSimon Glass 
8992ccc96bSSimon Glass 	ret = os_dirent_ls(dirname, &head);
9092ccc96bSSimon Glass 	if (ret)
91*0317724eSTom Rini 		goto out;
9292ccc96bSSimon Glass 
9392ccc96bSSimon Glass 	for (node = head; node; node = node->next) {
9492ccc96bSSimon Glass 		printf("%s %10lu %s\n", os_dirent_get_typename(node->type),
9592ccc96bSSimon Glass 		       node->size, node->name);
9692ccc96bSSimon Glass 	}
97*0317724eSTom Rini out:
9886167089SStefan Brüns 	os_dirent_free(head);
9992ccc96bSSimon Glass 
100*0317724eSTom Rini 	return ret;
10192ccc96bSSimon Glass }
10292ccc96bSSimon Glass 
sandbox_fs_exists(const char * filename)1030a30aa1eSStephen Warren int sandbox_fs_exists(const char *filename)
1040a30aa1eSStephen Warren {
10596b1046dSSuriyan Ramasami 	loff_t size;
10696b1046dSSuriyan Ramasami 	int ret;
1070a30aa1eSStephen Warren 
10896b1046dSSuriyan Ramasami 	ret = os_get_filesize(filename, &size);
10996b1046dSSuriyan Ramasami 	return ret == 0;
1100a30aa1eSStephen Warren }
1110a30aa1eSStephen Warren 
sandbox_fs_size(const char * filename,loff_t * size)112d455d878SSuriyan Ramasami int sandbox_fs_size(const char *filename, loff_t *size)
113cf659819SStephen Warren {
114d455d878SSuriyan Ramasami 	return os_get_filesize(filename, size);
115cf659819SStephen Warren }
116cf659819SStephen Warren 
sandbox_fs_close(void)11792ccc96bSSimon Glass void sandbox_fs_close(void)
11892ccc96bSSimon Glass {
11992ccc96bSSimon Glass }
12092ccc96bSSimon Glass 
fs_read_sandbox(const char * filename,void * buf,loff_t offset,loff_t len,loff_t * actread)121d455d878SSuriyan Ramasami int fs_read_sandbox(const char *filename, void *buf, loff_t offset, loff_t len,
122d455d878SSuriyan Ramasami 		    loff_t *actread)
12392ccc96bSSimon Glass {
12496b1046dSSuriyan Ramasami 	int ret;
12592ccc96bSSimon Glass 
126d455d878SSuriyan Ramasami 	ret = sandbox_fs_read_at(filename, offset, buf, len, actread);
127d455d878SSuriyan Ramasami 	if (ret)
12892ccc96bSSimon Glass 		printf("** Unable to read file %s **\n", filename);
129d455d878SSuriyan Ramasami 
13096b1046dSSuriyan Ramasami 	return ret;
13192ccc96bSSimon Glass }
13292ccc96bSSimon Glass 
fs_write_sandbox(const char * filename,void * buf,loff_t offset,loff_t len,loff_t * actwrite)133d455d878SSuriyan Ramasami int fs_write_sandbox(const char *filename, void *buf, loff_t offset,
134d455d878SSuriyan Ramasami 		     loff_t len, loff_t *actwrite)
1357eb2c8d5SSimon Glass {
13696b1046dSSuriyan Ramasami 	int ret;
1377eb2c8d5SSimon Glass 
138d455d878SSuriyan Ramasami 	ret = sandbox_fs_write_at(filename, offset, buf, len, actwrite);
139d455d878SSuriyan Ramasami 	if (ret)
1407eb2c8d5SSimon Glass 		printf("** Unable to write file %s **\n", filename);
1417eb2c8d5SSimon Glass 
142d455d878SSuriyan Ramasami 	return ret;
1437eb2c8d5SSimon Glass }
144