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 1192ccc96bSSimon Glass int sandbox_fs_set_blk_dev(block_dev_desc_t *rbdd, disk_partition_t *info) 1292ccc96bSSimon Glass { 13*85300a9aSSjoerd Simons /* 14*85300a9aSSjoerd Simons * Only accept a NULL block_dev_desc_t for the sandbox, which is when 15*85300a9aSSjoerd Simons * hostfs interface is used 16*85300a9aSSjoerd Simons */ 17*85300a9aSSjoerd Simons return rbdd != NULL; 1892ccc96bSSimon Glass } 1992ccc96bSSimon Glass 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 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 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) 9192ccc96bSSimon Glass return ret; 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 } 9792ccc96bSSimon Glass 9892ccc96bSSimon Glass return 0; 9992ccc96bSSimon Glass } 10092ccc96bSSimon Glass 1010a30aa1eSStephen Warren int sandbox_fs_exists(const char *filename) 1020a30aa1eSStephen Warren { 10396b1046dSSuriyan Ramasami loff_t size; 10496b1046dSSuriyan Ramasami int ret; 1050a30aa1eSStephen Warren 10696b1046dSSuriyan Ramasami ret = os_get_filesize(filename, &size); 10796b1046dSSuriyan Ramasami return ret == 0; 1080a30aa1eSStephen Warren } 1090a30aa1eSStephen Warren 110d455d878SSuriyan Ramasami int sandbox_fs_size(const char *filename, loff_t *size) 111cf659819SStephen Warren { 112d455d878SSuriyan Ramasami return os_get_filesize(filename, size); 113cf659819SStephen Warren } 114cf659819SStephen Warren 11592ccc96bSSimon Glass void sandbox_fs_close(void) 11692ccc96bSSimon Glass { 11792ccc96bSSimon Glass } 11892ccc96bSSimon Glass 119d455d878SSuriyan Ramasami int fs_read_sandbox(const char *filename, void *buf, loff_t offset, loff_t len, 120d455d878SSuriyan Ramasami loff_t *actread) 12192ccc96bSSimon Glass { 12296b1046dSSuriyan Ramasami int ret; 12392ccc96bSSimon Glass 124d455d878SSuriyan Ramasami ret = sandbox_fs_read_at(filename, offset, buf, len, actread); 125d455d878SSuriyan Ramasami if (ret) 12692ccc96bSSimon Glass printf("** Unable to read file %s **\n", filename); 127d455d878SSuriyan Ramasami 12896b1046dSSuriyan Ramasami return ret; 12992ccc96bSSimon Glass } 13092ccc96bSSimon Glass 131d455d878SSuriyan Ramasami int fs_write_sandbox(const char *filename, void *buf, loff_t offset, 132d455d878SSuriyan Ramasami loff_t len, loff_t *actwrite) 1337eb2c8d5SSimon Glass { 13496b1046dSSuriyan Ramasami int ret; 1357eb2c8d5SSimon Glass 136d455d878SSuriyan Ramasami ret = sandbox_fs_write_at(filename, offset, buf, len, actwrite); 137d455d878SSuriyan Ramasami if (ret) 1387eb2c8d5SSimon Glass printf("** Unable to write file %s **\n", filename); 1397eb2c8d5SSimon Glass 140d455d878SSuriyan Ramasami return ret; 1417eb2c8d5SSimon Glass } 142