1// SPDX-License-Identifier: GPL-2.0+
2/*
3 * Copyright (c) 2012, Google Inc.
4 */
5
6#include <common.h>
7#include <fs.h>
8#include <malloc.h>
9#include <os.h>
10#include <sandboxfs.h>
11
12int sandbox_fs_set_blk_dev(struct blk_desc *rbdd, struct disk_partition *info)
13{
14	/*
15	 * Only accept a NULL struct blk_desc for the sandbox, which is when
16	 * hostfs interface is used
17	 */
18	return rbdd != NULL;
19}
20
21int sandbox_fs_read_at(const char *filename, loff_t pos, void *buffer,
22		       loff_t maxsize, loff_t *actread)
23{
24	loff_t size;
25	int fd, ret;
26
27	fd = os_open(filename, OS_O_RDONLY);
28	if (fd < 0)
29		return fd;
30	ret = os_lseek(fd, pos, OS_SEEK_SET);
31	if (ret == -1) {
32		os_close(fd);
33		return ret;
34	}
35	if (!maxsize) {
36		ret = os_get_filesize(filename, &size);
37		if (ret) {
38			os_close(fd);
39			return ret;
40		}
41
42		maxsize = size;
43	}
44
45	size = os_read(fd, buffer, maxsize);
46	os_close(fd);
47
48	if (size < 0) {
49		ret = -1;
50	} else {
51		ret = 0;
52		*actread = size;
53	}
54
55	return ret;
56}
57
58int sandbox_fs_write_at(const char *filename, loff_t pos, void *buffer,
59			loff_t towrite, loff_t *actwrite)
60{
61	ssize_t size;
62	int fd, ret;
63
64	fd = os_open(filename, OS_O_RDWR | OS_O_CREAT);
65	if (fd < 0)
66		return fd;
67	ret = os_lseek(fd, pos, OS_SEEK_SET);
68	if (ret == -1) {
69		os_close(fd);
70		return ret;
71	}
72	size = os_write(fd, buffer, towrite);
73	os_close(fd);
74
75	if (size == -1) {
76		ret = -1;
77	} else {
78		ret = 0;
79		*actwrite = size;
80	}
81
82	return ret;
83}
84
85int sandbox_fs_ls(const char *dirname)
86{
87	struct os_dirent_node *head, *node;
88	int ret;
89
90	ret = os_dirent_ls(dirname, &head);
91	if (ret)
92		goto out;
93
94	for (node = head; node; node = node->next) {
95		printf("%s %10lu %s\n", os_dirent_get_typename(node->type),
96		       node->size, node->name);
97	}
98out:
99	os_dirent_free(head);
100
101	return ret;
102}
103
104int sandbox_fs_exists(const char *filename)
105{
106	loff_t size;
107	int ret;
108
109	ret = os_get_filesize(filename, &size);
110	return ret == 0;
111}
112
113int sandbox_fs_size(const char *filename, loff_t *size)
114{
115	return os_get_filesize(filename, size);
116}
117
118void sandbox_fs_close(void)
119{
120}
121
122int fs_read_sandbox(const char *filename, void *buf, loff_t offset, loff_t len,
123		    loff_t *actread)
124{
125	int ret;
126
127	ret = sandbox_fs_read_at(filename, offset, buf, len, actread);
128	if (ret)
129		printf("** Unable to read file %s **\n", filename);
130
131	return ret;
132}
133
134int fs_write_sandbox(const char *filename, void *buf, loff_t offset,
135		     loff_t len, loff_t *actwrite)
136{
137	int ret;
138
139	ret = sandbox_fs_write_at(filename, offset, buf, len, actwrite);
140	if (ret)
141		printf("** Unable to write file %s **\n", filename);
142
143	return ret;
144}
145