xref: /aosp_15_r20/system/incremental_delivery/incfs/include/incfs_ndk.h (revision 9190c2a8bd3622b7aa9bd7bfe4b3aec77820f478)
1*9190c2a8SAndroid Build Coastguard Worker /*
2*9190c2a8SAndroid Build Coastguard Worker  * Copyright (C) 2019 The Android Open Source Project
3*9190c2a8SAndroid Build Coastguard Worker  *
4*9190c2a8SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*9190c2a8SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*9190c2a8SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*9190c2a8SAndroid Build Coastguard Worker  *
8*9190c2a8SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*9190c2a8SAndroid Build Coastguard Worker  *
10*9190c2a8SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*9190c2a8SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*9190c2a8SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*9190c2a8SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*9190c2a8SAndroid Build Coastguard Worker  * limitations under the License.
15*9190c2a8SAndroid Build Coastguard Worker  */
16*9190c2a8SAndroid Build Coastguard Worker 
17*9190c2a8SAndroid Build Coastguard Worker #ifndef ANDROID_INCREMENTAL_FILE_SYSTEM_NDK_H
18*9190c2a8SAndroid Build Coastguard Worker #define ANDROID_INCREMENTAL_FILE_SYSTEM_NDK_H
19*9190c2a8SAndroid Build Coastguard Worker 
20*9190c2a8SAndroid Build Coastguard Worker #include <linux/incrementalfs.h>
21*9190c2a8SAndroid Build Coastguard Worker #include <stdbool.h>
22*9190c2a8SAndroid Build Coastguard Worker #include <stddef.h>
23*9190c2a8SAndroid Build Coastguard Worker #include <stdint.h>
24*9190c2a8SAndroid Build Coastguard Worker #include <string.h>
25*9190c2a8SAndroid Build Coastguard Worker #include <sys/cdefs.h>
26*9190c2a8SAndroid Build Coastguard Worker 
27*9190c2a8SAndroid Build Coastguard Worker __BEGIN_DECLS
28*9190c2a8SAndroid Build Coastguard Worker 
29*9190c2a8SAndroid Build Coastguard Worker #define INCFS_LIBRARY_NAME "libincfs.so"
30*9190c2a8SAndroid Build Coastguard Worker 
31*9190c2a8SAndroid Build Coastguard Worker typedef struct {
32*9190c2a8SAndroid Build Coastguard Worker     union {
33*9190c2a8SAndroid Build Coastguard Worker         char data[16];
34*9190c2a8SAndroid Build Coastguard Worker         int64_t for_alignment;
35*9190c2a8SAndroid Build Coastguard Worker     };
36*9190c2a8SAndroid Build Coastguard Worker } IncFsFileId;
37*9190c2a8SAndroid Build Coastguard Worker 
38*9190c2a8SAndroid Build Coastguard Worker static const IncFsFileId kIncFsInvalidFileId = {
39*9190c2a8SAndroid Build Coastguard Worker         {{(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
40*9190c2a8SAndroid Build Coastguard Worker           (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1}}};
41*9190c2a8SAndroid Build Coastguard Worker 
42*9190c2a8SAndroid Build Coastguard Worker static const int kIncFsFileIdStringLength = sizeof(IncFsFileId) * 2;
43*9190c2a8SAndroid Build Coastguard Worker 
44*9190c2a8SAndroid Build Coastguard Worker typedef enum {
45*9190c2a8SAndroid Build Coastguard Worker     INCFS_FEATURE_NONE = 0,
46*9190c2a8SAndroid Build Coastguard Worker     INCFS_FEATURE_CORE = 1 << 0,
47*9190c2a8SAndroid Build Coastguard Worker     INCFS_FEATURE_V2 = 1 << 1,
48*9190c2a8SAndroid Build Coastguard Worker     INCFS_FEATURE_MAPPING_FILES_PROGRESS_FIXED = 1 << 2,
49*9190c2a8SAndroid Build Coastguard Worker 
50*9190c2a8SAndroid Build Coastguard Worker } IncFsFeatures;
51*9190c2a8SAndroid Build Coastguard Worker 
52*9190c2a8SAndroid Build Coastguard Worker typedef int IncFsErrorCode;
53*9190c2a8SAndroid Build Coastguard Worker typedef int64_t IncFsSize;
54*9190c2a8SAndroid Build Coastguard Worker typedef int32_t IncFsBlockIndex;
55*9190c2a8SAndroid Build Coastguard Worker typedef int IncFsFd;
56*9190c2a8SAndroid Build Coastguard Worker typedef struct IncFsControl IncFsControl;
57*9190c2a8SAndroid Build Coastguard Worker typedef int IncFsUid;
58*9190c2a8SAndroid Build Coastguard Worker 
59*9190c2a8SAndroid Build Coastguard Worker static const IncFsUid kIncFsNoUid = -1;
60*9190c2a8SAndroid Build Coastguard Worker 
61*9190c2a8SAndroid Build Coastguard Worker typedef struct {
62*9190c2a8SAndroid Build Coastguard Worker     const char* data;
63*9190c2a8SAndroid Build Coastguard Worker     IncFsSize size;
64*9190c2a8SAndroid Build Coastguard Worker } IncFsSpan;
65*9190c2a8SAndroid Build Coastguard Worker 
66*9190c2a8SAndroid Build Coastguard Worker typedef enum {
67*9190c2a8SAndroid Build Coastguard Worker     CMD,
68*9190c2a8SAndroid Build Coastguard Worker     PENDING_READS,
69*9190c2a8SAndroid Build Coastguard Worker     LOGS,
70*9190c2a8SAndroid Build Coastguard Worker     BLOCKS_WRITTEN,
71*9190c2a8SAndroid Build Coastguard Worker     FDS_COUNT,
72*9190c2a8SAndroid Build Coastguard Worker } IncFsFdType;
73*9190c2a8SAndroid Build Coastguard Worker 
74*9190c2a8SAndroid Build Coastguard Worker typedef enum {
75*9190c2a8SAndroid Build Coastguard Worker     INCFS_DEFAULT_READ_TIMEOUT_MS = 10000,
76*9190c2a8SAndroid Build Coastguard Worker     INCFS_DEFAULT_PENDING_READ_BUFFER_SIZE = 24,
77*9190c2a8SAndroid Build Coastguard Worker     INCFS_DEFAULT_PAGE_READ_BUFFER_PAGES = 4,
78*9190c2a8SAndroid Build Coastguard Worker } IncFsDefaults;
79*9190c2a8SAndroid Build Coastguard Worker 
80*9190c2a8SAndroid Build Coastguard Worker typedef enum {
81*9190c2a8SAndroid Build Coastguard Worker     INCFS_MOUNT_CREATE_ONLY = 1,
82*9190c2a8SAndroid Build Coastguard Worker     INCFS_MOUNT_TRUNCATE = 2,
83*9190c2a8SAndroid Build Coastguard Worker } IncFsMountFlags;
84*9190c2a8SAndroid Build Coastguard Worker 
85*9190c2a8SAndroid Build Coastguard Worker typedef enum {
86*9190c2a8SAndroid Build Coastguard Worker     INCFS_HASH_NONE,
87*9190c2a8SAndroid Build Coastguard Worker     INCFS_HASH_SHA256,
88*9190c2a8SAndroid Build Coastguard Worker } IncFsHashAlgortithm;
89*9190c2a8SAndroid Build Coastguard Worker 
90*9190c2a8SAndroid Build Coastguard Worker typedef struct {
91*9190c2a8SAndroid Build Coastguard Worker     IncFsMountFlags flags;
92*9190c2a8SAndroid Build Coastguard Worker     int32_t defaultReadTimeoutMs;
93*9190c2a8SAndroid Build Coastguard Worker     int32_t readLogBufferPages;
94*9190c2a8SAndroid Build Coastguard Worker     int32_t readLogDisableAfterTimeoutMs;
95*9190c2a8SAndroid Build Coastguard Worker     const char* sysfsName;
96*9190c2a8SAndroid Build Coastguard Worker } IncFsMountOptions;
97*9190c2a8SAndroid Build Coastguard Worker 
98*9190c2a8SAndroid Build Coastguard Worker typedef enum {
99*9190c2a8SAndroid Build Coastguard Worker     INCFS_COMPRESSION_KIND_NONE,
100*9190c2a8SAndroid Build Coastguard Worker     INCFS_COMPRESSION_KIND_LZ4,
101*9190c2a8SAndroid Build Coastguard Worker     INCFS_COMPRESSION_KIND_ZSTD,
102*9190c2a8SAndroid Build Coastguard Worker } IncFsCompressionKind;
103*9190c2a8SAndroid Build Coastguard Worker 
104*9190c2a8SAndroid Build Coastguard Worker typedef enum {
105*9190c2a8SAndroid Build Coastguard Worker     INCFS_BLOCK_KIND_DATA,
106*9190c2a8SAndroid Build Coastguard Worker     INCFS_BLOCK_KIND_HASH,
107*9190c2a8SAndroid Build Coastguard Worker } IncFsBlockKind;
108*9190c2a8SAndroid Build Coastguard Worker 
109*9190c2a8SAndroid Build Coastguard Worker typedef struct {
110*9190c2a8SAndroid Build Coastguard Worker     IncFsFd fileFd;
111*9190c2a8SAndroid Build Coastguard Worker     IncFsBlockIndex pageIndex;
112*9190c2a8SAndroid Build Coastguard Worker     IncFsCompressionKind compression;
113*9190c2a8SAndroid Build Coastguard Worker     IncFsBlockKind kind;
114*9190c2a8SAndroid Build Coastguard Worker     uint32_t dataSize;
115*9190c2a8SAndroid Build Coastguard Worker     const char* data;
116*9190c2a8SAndroid Build Coastguard Worker } IncFsDataBlock;
117*9190c2a8SAndroid Build Coastguard Worker 
118*9190c2a8SAndroid Build Coastguard Worker typedef struct {
119*9190c2a8SAndroid Build Coastguard Worker     IncFsSize size;
120*9190c2a8SAndroid Build Coastguard Worker     IncFsSpan metadata;
121*9190c2a8SAndroid Build Coastguard Worker     IncFsSpan signature;
122*9190c2a8SAndroid Build Coastguard Worker } IncFsNewFileParams;
123*9190c2a8SAndroid Build Coastguard Worker 
124*9190c2a8SAndroid Build Coastguard Worker typedef struct {
125*9190c2a8SAndroid Build Coastguard Worker     IncFsFileId sourceId;
126*9190c2a8SAndroid Build Coastguard Worker     IncFsSize sourceOffset;
127*9190c2a8SAndroid Build Coastguard Worker     IncFsSize size;
128*9190c2a8SAndroid Build Coastguard Worker } IncFsNewMappedFileParams;
129*9190c2a8SAndroid Build Coastguard Worker 
130*9190c2a8SAndroid Build Coastguard Worker typedef struct {
131*9190c2a8SAndroid Build Coastguard Worker     IncFsFileId id;
132*9190c2a8SAndroid Build Coastguard Worker     uint64_t bootClockTsUs;
133*9190c2a8SAndroid Build Coastguard Worker     IncFsBlockIndex block;
134*9190c2a8SAndroid Build Coastguard Worker     uint32_t serialNo;
135*9190c2a8SAndroid Build Coastguard Worker } IncFsReadInfo;
136*9190c2a8SAndroid Build Coastguard Worker 
137*9190c2a8SAndroid Build Coastguard Worker typedef struct {
138*9190c2a8SAndroid Build Coastguard Worker     IncFsFileId id;
139*9190c2a8SAndroid Build Coastguard Worker     uint64_t bootClockTsUs;
140*9190c2a8SAndroid Build Coastguard Worker     IncFsBlockIndex block;
141*9190c2a8SAndroid Build Coastguard Worker     uint32_t serialNo;
142*9190c2a8SAndroid Build Coastguard Worker     IncFsUid uid;
143*9190c2a8SAndroid Build Coastguard Worker } IncFsReadInfoWithUid;
144*9190c2a8SAndroid Build Coastguard Worker 
145*9190c2a8SAndroid Build Coastguard Worker typedef struct {
146*9190c2a8SAndroid Build Coastguard Worker     IncFsBlockIndex begin;
147*9190c2a8SAndroid Build Coastguard Worker     IncFsBlockIndex end;
148*9190c2a8SAndroid Build Coastguard Worker } IncFsBlockRange;
149*9190c2a8SAndroid Build Coastguard Worker 
150*9190c2a8SAndroid Build Coastguard Worker typedef struct {
151*9190c2a8SAndroid Build Coastguard Worker     IncFsBlockRange* dataRanges;
152*9190c2a8SAndroid Build Coastguard Worker     IncFsBlockRange* hashRanges;
153*9190c2a8SAndroid Build Coastguard Worker     int32_t dataRangesCount;
154*9190c2a8SAndroid Build Coastguard Worker     int32_t hashRangesCount;
155*9190c2a8SAndroid Build Coastguard Worker     IncFsBlockIndex endIndex;
156*9190c2a8SAndroid Build Coastguard Worker } IncFsFilledRanges;
157*9190c2a8SAndroid Build Coastguard Worker 
158*9190c2a8SAndroid Build Coastguard Worker typedef struct {
159*9190c2a8SAndroid Build Coastguard Worker     IncFsSize totalDataBlocks;
160*9190c2a8SAndroid Build Coastguard Worker     IncFsSize filledDataBlocks;
161*9190c2a8SAndroid Build Coastguard Worker     IncFsSize totalHashBlocks;
162*9190c2a8SAndroid Build Coastguard Worker     IncFsSize filledHashBlocks;
163*9190c2a8SAndroid Build Coastguard Worker } IncFsBlockCounts;
164*9190c2a8SAndroid Build Coastguard Worker 
165*9190c2a8SAndroid Build Coastguard Worker typedef struct {
166*9190c2a8SAndroid Build Coastguard Worker     IncFsUid uid;
167*9190c2a8SAndroid Build Coastguard Worker     uint32_t minTimeUs;
168*9190c2a8SAndroid Build Coastguard Worker     uint32_t minPendingTimeUs;
169*9190c2a8SAndroid Build Coastguard Worker     uint32_t maxPendingTimeUs;
170*9190c2a8SAndroid Build Coastguard Worker } IncFsUidReadTimeouts;
171*9190c2a8SAndroid Build Coastguard Worker 
172*9190c2a8SAndroid Build Coastguard Worker typedef struct {
173*9190c2a8SAndroid Build Coastguard Worker     uint32_t readsDelayedMin;
174*9190c2a8SAndroid Build Coastguard Worker     uint64_t readsDelayedMinUs;
175*9190c2a8SAndroid Build Coastguard Worker     uint32_t readsDelayedPending;
176*9190c2a8SAndroid Build Coastguard Worker     uint64_t readsDelayedPendingUs;
177*9190c2a8SAndroid Build Coastguard Worker     uint32_t readsFailedHashVerification;
178*9190c2a8SAndroid Build Coastguard Worker     uint32_t readsFailedOther;
179*9190c2a8SAndroid Build Coastguard Worker     uint32_t readsFailedTimedOut;
180*9190c2a8SAndroid Build Coastguard Worker     uint64_t reserved;
181*9190c2a8SAndroid Build Coastguard Worker     uint64_t reserved1;
182*9190c2a8SAndroid Build Coastguard Worker } IncFsMetrics;
183*9190c2a8SAndroid Build Coastguard Worker 
184*9190c2a8SAndroid Build Coastguard Worker typedef struct {
185*9190c2a8SAndroid Build Coastguard Worker     IncFsFileId id;
186*9190c2a8SAndroid Build Coastguard Worker     uint64_t timestampUs;
187*9190c2a8SAndroid Build Coastguard Worker     IncFsBlockIndex block;
188*9190c2a8SAndroid Build Coastguard Worker     uint32_t errorNo;
189*9190c2a8SAndroid Build Coastguard Worker     IncFsUid uid;
190*9190c2a8SAndroid Build Coastguard Worker } IncFsLastReadError;
191*9190c2a8SAndroid Build Coastguard Worker 
192*9190c2a8SAndroid Build Coastguard Worker // All functions return -errno in case of failure.
193*9190c2a8SAndroid Build Coastguard Worker // All IncFsFd functions return >=0 in case of success.
194*9190c2a8SAndroid Build Coastguard Worker // All IncFsFileId functions return invalid IncFsFileId on error.
195*9190c2a8SAndroid Build Coastguard Worker // All IncFsErrorCode functions return 0 in case of success.
196*9190c2a8SAndroid Build Coastguard Worker 
197*9190c2a8SAndroid Build Coastguard Worker bool IncFs_IsEnabled();
198*9190c2a8SAndroid Build Coastguard Worker IncFsFeatures IncFs_Features();
199*9190c2a8SAndroid Build Coastguard Worker 
200*9190c2a8SAndroid Build Coastguard Worker bool IncFs_IsIncFsFd(int fd);
201*9190c2a8SAndroid Build Coastguard Worker bool IncFs_IsIncFsPath(const char* path);
202*9190c2a8SAndroid Build Coastguard Worker 
IncFs_IsValidFileId(IncFsFileId fileId)203*9190c2a8SAndroid Build Coastguard Worker static inline bool IncFs_IsValidFileId(IncFsFileId fileId) {
204*9190c2a8SAndroid Build Coastguard Worker     return memcmp(&fileId, &kIncFsInvalidFileId, sizeof(fileId)) != 0;
205*9190c2a8SAndroid Build Coastguard Worker }
206*9190c2a8SAndroid Build Coastguard Worker 
207*9190c2a8SAndroid Build Coastguard Worker int IncFs_FileIdToString(IncFsFileId id, char* out);
208*9190c2a8SAndroid Build Coastguard Worker IncFsFileId IncFs_FileIdFromString(const char* in);
209*9190c2a8SAndroid Build Coastguard Worker 
210*9190c2a8SAndroid Build Coastguard Worker IncFsFileId IncFs_FileIdFromMetadata(IncFsSpan metadata);
211*9190c2a8SAndroid Build Coastguard Worker 
212*9190c2a8SAndroid Build Coastguard Worker IncFsControl* IncFs_Mount(const char* backingPath, const char* targetDir,
213*9190c2a8SAndroid Build Coastguard Worker                           IncFsMountOptions options);
214*9190c2a8SAndroid Build Coastguard Worker IncFsControl* IncFs_Open(const char* dir);
215*9190c2a8SAndroid Build Coastguard Worker IncFsControl* IncFs_CreateControl(IncFsFd cmd, IncFsFd pendingReads, IncFsFd logs,
216*9190c2a8SAndroid Build Coastguard Worker                                   IncFsFd blocksWritten);
217*9190c2a8SAndroid Build Coastguard Worker void IncFs_DeleteControl(IncFsControl* control);
218*9190c2a8SAndroid Build Coastguard Worker IncFsFd IncFs_GetControlFd(const IncFsControl* control, IncFsFdType type);
219*9190c2a8SAndroid Build Coastguard Worker IncFsSize IncFs_ReleaseControlFds(IncFsControl* control, IncFsFd out[], IncFsSize outSize);
220*9190c2a8SAndroid Build Coastguard Worker 
221*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_SetOptions(const IncFsControl* control, IncFsMountOptions options);
222*9190c2a8SAndroid Build Coastguard Worker 
223*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_BindMount(const char* sourceDir, const char* targetDir);
224*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_Unmount(const char* dir);
225*9190c2a8SAndroid Build Coastguard Worker 
226*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_Root(const IncFsControl* control, char buffer[], size_t* bufferSize);
227*9190c2a8SAndroid Build Coastguard Worker 
228*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_MakeFile(const IncFsControl* control, const char* path, int32_t mode,
229*9190c2a8SAndroid Build Coastguard Worker                               IncFsFileId id, IncFsNewFileParams params);
230*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_MakeMappedFile(const IncFsControl* control, const char* path, int32_t mode,
231*9190c2a8SAndroid Build Coastguard Worker                                     IncFsNewMappedFileParams params);
232*9190c2a8SAndroid Build Coastguard Worker 
233*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_MakeDir(const IncFsControl* control, const char* path, int32_t mode);
234*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_MakeDirs(const IncFsControl* control, const char* path, int32_t mode);
235*9190c2a8SAndroid Build Coastguard Worker 
236*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_GetMetadataById(const IncFsControl* control, IncFsFileId id, char buffer[],
237*9190c2a8SAndroid Build Coastguard Worker                                      size_t* bufferSize);
238*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_GetMetadataByPath(const IncFsControl* control, const char* path, char buffer[],
239*9190c2a8SAndroid Build Coastguard Worker                                        size_t* bufferSize);
240*9190c2a8SAndroid Build Coastguard Worker 
241*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_GetSignatureById(const IncFsControl* control, IncFsFileId id, char buffer[],
242*9190c2a8SAndroid Build Coastguard Worker                                       size_t* bufferSize);
243*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_GetSignatureByPath(const IncFsControl* control, const char* path,
244*9190c2a8SAndroid Build Coastguard Worker                                         char buffer[], size_t* bufferSize);
245*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_UnsafeGetSignatureByPath(const char* path, char buffer[], size_t* bufferSize);
246*9190c2a8SAndroid Build Coastguard Worker 
247*9190c2a8SAndroid Build Coastguard Worker IncFsFileId IncFs_GetId(const IncFsControl* control, const char* path);
248*9190c2a8SAndroid Build Coastguard Worker 
249*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_Link(const IncFsControl* control, const char* sourcePath,
250*9190c2a8SAndroid Build Coastguard Worker                           const char* targetPath);
251*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_Unlink(const IncFsControl* control, const char* path);
252*9190c2a8SAndroid Build Coastguard Worker 
253*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_WaitForPendingReads(const IncFsControl* control, int32_t timeoutMs,
254*9190c2a8SAndroid Build Coastguard Worker                                          IncFsReadInfo buffer[], size_t* bufferSize);
255*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_WaitForPageReads(const IncFsControl* control, int32_t timeoutMs,
256*9190c2a8SAndroid Build Coastguard Worker                                       IncFsReadInfo buffer[], size_t* bufferSize);
257*9190c2a8SAndroid Build Coastguard Worker 
258*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_WaitForPendingReadsWithUid(const IncFsControl* control, int32_t timeoutMs,
259*9190c2a8SAndroid Build Coastguard Worker                                                 IncFsReadInfoWithUid buffer[], size_t* bufferSize);
260*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_WaitForPageReadsWithUid(const IncFsControl* control, int32_t timeoutMs,
261*9190c2a8SAndroid Build Coastguard Worker                                              IncFsReadInfoWithUid buffer[], size_t* bufferSize);
262*9190c2a8SAndroid Build Coastguard Worker 
263*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_WaitForFsWrittenBlocksChange(const IncFsControl* control, int32_t timeoutMs,
264*9190c2a8SAndroid Build Coastguard Worker                                                   IncFsSize* count);
265*9190c2a8SAndroid Build Coastguard Worker 
266*9190c2a8SAndroid Build Coastguard Worker IncFsFd IncFs_OpenForSpecialOpsByPath(const IncFsControl* control, const char* path);
267*9190c2a8SAndroid Build Coastguard Worker IncFsFd IncFs_OpenForSpecialOpsById(const IncFsControl* control, IncFsFileId id);
268*9190c2a8SAndroid Build Coastguard Worker 
269*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_WriteBlocks(const IncFsDataBlock blocks[], size_t blocksCount);
270*9190c2a8SAndroid Build Coastguard Worker 
271*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_SetUidReadTimeouts(const IncFsControl* control,
272*9190c2a8SAndroid Build Coastguard Worker                                         const IncFsUidReadTimeouts timeouts[], size_t count);
273*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_GetUidReadTimeouts(const IncFsControl* control,
274*9190c2a8SAndroid Build Coastguard Worker                                         IncFsUidReadTimeouts timeoutsBuffer[], size_t* bufferSize);
275*9190c2a8SAndroid Build Coastguard Worker 
276*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_GetFileBlockCountByPath(const IncFsControl* control, const char* path,
277*9190c2a8SAndroid Build Coastguard Worker                                              IncFsBlockCounts* blockCount);
278*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_GetFileBlockCountById(const IncFsControl* control, IncFsFileId id,
279*9190c2a8SAndroid Build Coastguard Worker                                            IncFsBlockCounts* blockCount);
280*9190c2a8SAndroid Build Coastguard Worker 
281*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_ListIncompleteFiles(const IncFsControl* control, IncFsFileId ids[],
282*9190c2a8SAndroid Build Coastguard Worker                                          size_t* bufferSize);
283*9190c2a8SAndroid Build Coastguard Worker 
284*9190c2a8SAndroid Build Coastguard Worker // Calls a passed callback for each file on the mounted filesystem, or, in the second case,
285*9190c2a8SAndroid Build Coastguard Worker // for each incomplete file (only for v2 IncFS).
286*9190c2a8SAndroid Build Coastguard Worker // Callback can stop the iteration early by returning |false|.
287*9190c2a8SAndroid Build Coastguard Worker // Return codes:
288*9190c2a8SAndroid Build Coastguard Worker // >=0      - number of files iterated,
289*9190c2a8SAndroid Build Coastguard Worker // <0       - -errno
290*9190c2a8SAndroid Build Coastguard Worker typedef bool (*FileCallback)(void* context, const IncFsControl* control, IncFsFileId fileId);
291*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_ForEachFile(const IncFsControl* control, void* context, FileCallback cb);
292*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_ForEachIncompleteFile(const IncFsControl* control, void* context,
293*9190c2a8SAndroid Build Coastguard Worker                                            FileCallback cb);
294*9190c2a8SAndroid Build Coastguard Worker 
295*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_WaitForLoadingComplete(const IncFsControl* control, int32_t timeoutMs);
296*9190c2a8SAndroid Build Coastguard Worker 
297*9190c2a8SAndroid Build Coastguard Worker // Gets a collection of filled ranges in the file from IncFS. Uses the |outBuffer| memory, it has
298*9190c2a8SAndroid Build Coastguard Worker // to be big enough to fit all the ranges the caller is expecting.
299*9190c2a8SAndroid Build Coastguard Worker // Return codes:
300*9190c2a8SAndroid Build Coastguard Worker //  0       - success,
301*9190c2a8SAndroid Build Coastguard Worker //  -ERANGE - input buffer is too small. filledRanges are still valid up to the outBuffer.size,
302*9190c2a8SAndroid Build Coastguard Worker //            but there are more,
303*9190c2a8SAndroid Build Coastguard Worker //  <0      - error, |filledRanges| is not valid.
304*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_GetFilledRanges(int fd, IncFsSpan outBuffer, IncFsFilledRanges* filledRanges);
305*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_GetFilledRangesStartingFrom(int fd, int startBlockIndex, IncFsSpan outBuffer,
306*9190c2a8SAndroid Build Coastguard Worker                                                  IncFsFilledRanges* filledRanges);
307*9190c2a8SAndroid Build Coastguard Worker // Check if the file is fully loaded. Return codes:
308*9190c2a8SAndroid Build Coastguard Worker //  0        - fully loaded,
309*9190c2a8SAndroid Build Coastguard Worker //  -ENODATA - some blocks are missing,
310*9190c2a8SAndroid Build Coastguard Worker //  <0       - error from the syscall.
311*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_IsFullyLoaded(int fd);
312*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_IsFullyLoadedByPath(const IncFsControl* control, const char* path);
313*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_IsFullyLoadedById(const IncFsControl* control, IncFsFileId fileId);
314*9190c2a8SAndroid Build Coastguard Worker 
315*9190c2a8SAndroid Build Coastguard Worker // Check if all files on the mount are fully loaded. Return codes:
316*9190c2a8SAndroid Build Coastguard Worker //  0        - fully loaded,
317*9190c2a8SAndroid Build Coastguard Worker //  -ENODATA - some blocks are missing,
318*9190c2a8SAndroid Build Coastguard Worker //  <0       - error from the syscall.
319*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_IsEverythingFullyLoaded(const IncFsControl* control);
320*9190c2a8SAndroid Build Coastguard Worker 
321*9190c2a8SAndroid Build Coastguard Worker // Reserve |size| bytes for the file. Trims reserved space to the current file size when |size = -1|
322*9190c2a8SAndroid Build Coastguard Worker static const IncFsSize kIncFsTrimReservedSpace = -1;
323*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_ReserveSpaceByPath(const IncFsControl* control, const char* path,
324*9190c2a8SAndroid Build Coastguard Worker                                         IncFsSize size);
325*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_ReserveSpaceById(const IncFsControl* control, IncFsFileId id, IncFsSize size);
326*9190c2a8SAndroid Build Coastguard Worker 
327*9190c2a8SAndroid Build Coastguard Worker // Gets the metrics of a mount by specifying the corresponding sysfs subpath.
328*9190c2a8SAndroid Build Coastguard Worker // Return codes:
329*9190c2a8SAndroid Build Coastguard Worker // =0       - success
330*9190c2a8SAndroid Build Coastguard Worker // <0       - -errno
331*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_GetMetrics(const char* sysfsName, IncFsMetrics* metrics);
332*9190c2a8SAndroid Build Coastguard Worker 
333*9190c2a8SAndroid Build Coastguard Worker // Gets information about the last read error of a mount.
334*9190c2a8SAndroid Build Coastguard Worker // Return codes:
335*9190c2a8SAndroid Build Coastguard Worker // =0       - success
336*9190c2a8SAndroid Build Coastguard Worker // <0       - -errno
337*9190c2a8SAndroid Build Coastguard Worker // When there is no read error, still returns success. Fields in IncFsLastReadError will be all 0.
338*9190c2a8SAndroid Build Coastguard Worker // Possible values of IncFsLastReadError.errorNo:
339*9190c2a8SAndroid Build Coastguard Worker //   -ETIME for read timeout;
340*9190c2a8SAndroid Build Coastguard Worker //   -EBADMSG for hash verification failure;
341*9190c2a8SAndroid Build Coastguard Worker //   Other negative values for other types of errors.
342*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_GetLastReadError(const IncFsControl* control,
343*9190c2a8SAndroid Build Coastguard Worker                                       IncFsLastReadError* lastReadError);
344*9190c2a8SAndroid Build Coastguard Worker 
345*9190c2a8SAndroid Build Coastguard Worker __END_DECLS
346*9190c2a8SAndroid Build Coastguard Worker 
347*9190c2a8SAndroid Build Coastguard Worker #endif // ANDROID_INCREMENTAL_FILE_SYSTEM_NDK_H
348