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