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