]>
Commit | Line | Data |
---|---|---|
83d290c5 | 1 | // SPDX-License-Identifier: GPL-2.0+ |
92ccc96b SG |
2 | /* |
3 | * Copyright (c) 2012, Google Inc. | |
92ccc96b SG |
4 | */ |
5 | ||
6 | #include <common.h> | |
7 | #include <fs.h> | |
336d4615 | 8 | #include <malloc.h> |
92ccc96b | 9 | #include <os.h> |
e6f6f9e6 | 10 | #include <sandboxfs.h> |
92ccc96b | 11 | |
0528979f | 12 | int sandbox_fs_set_blk_dev(struct blk_desc *rbdd, struct disk_partition *info) |
92ccc96b | 13 | { |
85300a9a | 14 | /* |
4101f687 | 15 | * Only accept a NULL struct blk_desc for the sandbox, which is when |
85300a9a SS |
16 | * hostfs interface is used |
17 | */ | |
18 | return rbdd != NULL; | |
92ccc96b SG |
19 | } |
20 | ||
96b1046d SR |
21 | int sandbox_fs_read_at(const char *filename, loff_t pos, void *buffer, |
22 | loff_t maxsize, loff_t *actread) | |
92ccc96b | 23 | { |
96b1046d | 24 | loff_t size; |
92ccc96b SG |
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 | } | |
96b1046d SR |
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 | ||
92ccc96b SG |
45 | size = os_read(fd, buffer, maxsize); |
46 | os_close(fd); | |
47 | ||
96b1046d SR |
48 | if (size < 0) { |
49 | ret = -1; | |
50 | } else { | |
51 | ret = 0; | |
52 | *actread = size; | |
53 | } | |
54 | ||
55 | return ret; | |
92ccc96b SG |
56 | } |
57 | ||
96b1046d SR |
58 | int sandbox_fs_write_at(const char *filename, loff_t pos, void *buffer, |
59 | loff_t towrite, loff_t *actwrite) | |
7eb2c8d5 SG |
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 | ||
96b1046d SR |
75 | if (size == -1) { |
76 | ret = -1; | |
77 | } else { | |
78 | ret = 0; | |
79 | *actwrite = size; | |
80 | } | |
81 | ||
82 | return ret; | |
7eb2c8d5 SG |
83 | } |
84 | ||
92ccc96b SG |
85 | int 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) | |
0317724e | 92 | goto out; |
92ccc96b SG |
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 | } | |
0317724e | 98 | out: |
86167089 | 99 | os_dirent_free(head); |
92ccc96b | 100 | |
0317724e | 101 | return ret; |
92ccc96b SG |
102 | } |
103 | ||
0a30aa1e SW |
104 | int sandbox_fs_exists(const char *filename) |
105 | { | |
96b1046d SR |
106 | loff_t size; |
107 | int ret; | |
0a30aa1e | 108 | |
96b1046d SR |
109 | ret = os_get_filesize(filename, &size); |
110 | return ret == 0; | |
0a30aa1e SW |
111 | } |
112 | ||
d455d878 | 113 | int sandbox_fs_size(const char *filename, loff_t *size) |
cf659819 | 114 | { |
d455d878 | 115 | return os_get_filesize(filename, size); |
cf659819 SW |
116 | } |
117 | ||
92ccc96b SG |
118 | void sandbox_fs_close(void) |
119 | { | |
120 | } | |
121 | ||
d455d878 SR |
122 | int fs_read_sandbox(const char *filename, void *buf, loff_t offset, loff_t len, |
123 | loff_t *actread) | |
92ccc96b | 124 | { |
96b1046d | 125 | int ret; |
92ccc96b | 126 | |
d455d878 SR |
127 | ret = sandbox_fs_read_at(filename, offset, buf, len, actread); |
128 | if (ret) | |
92ccc96b | 129 | printf("** Unable to read file %s **\n", filename); |
92ccc96b | 130 | |
d455d878 | 131 | return ret; |
92ccc96b | 132 | } |
7eb2c8d5 | 133 | |
d455d878 SR |
134 | int fs_write_sandbox(const char *filename, void *buf, loff_t offset, |
135 | loff_t len, loff_t *actwrite) | |
7eb2c8d5 | 136 | { |
96b1046d | 137 | int ret; |
7eb2c8d5 | 138 | |
d455d878 SR |
139 | ret = sandbox_fs_write_at(filename, offset, buf, len, actwrite); |
140 | if (ret) | |
7eb2c8d5 | 141 | printf("** Unable to write file %s **\n", filename); |
7eb2c8d5 | 142 | |
d455d878 | 143 | return ret; |
7eb2c8d5 | 144 | } |