/* * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include #include #include #include "client_session.h" #include "file.h" /** * struct storage_op_flags - Flags shared by all storage operations * @allow_repaired: If true, encountering a repaired filesystem will _not_ * result in an error. * @complete_transaction: If true, complete the currently active transaction * after performing this operation. * @update_checkpoint: If true, update the checkpoint with the post-operation * filesystem state. */ struct storage_op_flags { bool allow_repaired; bool complete_transaction; bool update_checkpoint; }; __BEGIN_CDECLS /** * storage_client_session_init() - Initialize a new &struct * storage_client_session. * @session: The session to be initialized. * @fs: The filesystem this session will modify. * @peer: Id of the peer this session was created for. */ void storage_client_session_init(struct storage_client_session* session, struct fs* fs, const uuid_t* peer); /** * storage_client_session_destroy() - Destroy a &struct storage_client_session. * @session: The session to be destroyed. */ void storage_client_session_destroy(struct storage_client_session* session); /** * storage_transaction_end() - End the currently active transaction and start a * new one. If @flags.complete_transaction is true, try to complete the current * transaction. Otherwise, abandon it. * @session: The session to perform the operation. * @flags: Flags for performing this operation. @flags.complete_transaction * controls whether the transaction will be completed or abandoned; see above. * See &struct storage_op_flags for further details. */ enum storage_err storage_transaction_end(struct storage_client_session* session, struct storage_op_flags flags); /** * storage_file_delete() - Delete a file. * @session: The session to perform the operation. * @fname: The string containing the name of the file to be deleted. * @fname_len: The length of the name of the file to be deleted. * @flags: Flags for performing this operation. See &struct storage_op_flags for * details. */ enum storage_err storage_file_delete(struct storage_client_session* session, const char* fname, size_t fname_len, struct storage_op_flags flags); /** * storage_file_move() - Move a file from ``src`` to location ``dst``. * @session: The session to perform the operation. * @handle: The opened file handle for the ``src`` file. Ignored if * @src_already_opened is false. * @src_already_opened: True if the ``src`` file is already opened and @handle * conatins its file handle. * @src_name: The string containing the name of the ``src`` file. If * @src_already_opened is true, this must match the name of the file @handle * points to or be null. * @src_name_len: The length of the @src_name. * @dst_name: The string containing the name of the file's destination. * @dst_name_len: The length of @dst_name. * @dst_file_create_mode: Creation behavior for the ``dst`` file. * @flags: Flags for performing this operation. See &struct storage_op_flags for * details. */ enum storage_err storage_file_move(struct storage_client_session* session, uint32_t handle, bool src_already_opened, const char* src_name, size_t src_name_len, const char* dst_name, size_t dst_name_len, enum file_create_mode dst_file_create_mode, struct storage_op_flags flags); /** * storage_file_open() - Open a file and provide a handle to it. * @session: The session to perform the operation. * @fname: The string containing the name of the file to open. * @fname_len: The length of the name of the file to open. * @file_create_mode: Creation behavior for the file. * @truncate: If true, clear the file's contents while opening it. * @flags: Flags for performing this operation. See &struct storage_op_flags for * details. * @handle: Out-param that will contain the opened file's handle. Only populated * on success. */ enum storage_err storage_file_open(struct storage_client_session* session, const char* fname, size_t fname_len, enum file_create_mode file_create_mode, bool truncate, struct storage_op_flags flags, uint32_t* handle); /** * storage_file_close() - Close a previously opened file. * @session: The session to perform the operation. * @handle: The file handle previously created by storage_file_open(). * @flags: Flags for performing this operation. See &struct storage_op_flags for * details. */ enum storage_err storage_file_close(struct storage_client_session* session, uint32_t handle, struct storage_op_flags flags); /** * storage_file_read() - Read a sequence of bytes from an open file. * @session: The session to perform the operation. * @handle: The file handle previously created by storage_file_open(). * @size: The size of the byte sequence to read. * @offset: The offset from the beginning of the file at which to start reading. * The bytes read will be ``file[offset..offset + size]``. * @flags: Flags for performing this operation. See &struct storage_op_flags for * details. * @resp: Out-param. The buffer into which the read bytes will be written. * @resp_len: Before the calling ``*resp_len`` should contain the length of the * &resp buffer. After a successful call returns, ``*resp_len`` will contain the * total number of bytes written to &resp. */ enum storage_err storage_file_read(struct storage_client_session* session, uint32_t handle, uint32_t size, uint64_t offset, struct storage_op_flags flags, uint8_t* resp, size_t* resp_len); /** * storage_file_write() - Write a sequence of bytes to an open file. * @session: The session to perform the operation. * @handle: The file handle previously created by storage_file_open(). * @offset: The offset from the beginning of the file at which to start writing. * The bytes will be written to ``file[offset..offset + data.len]``. * @data: Buffer containing the data to write. * @data_len: Length of the data to write, in bytes. * @flags: Flags for performing this operation. See &struct storage_op_flags for * details. */ enum storage_err storage_file_write(struct storage_client_session* session, uint32_t handle, uint64_t offset, const uint8_t* data, size_t data_len, struct storage_op_flags flags); /** * storage_file_list() - Lists the names of files. * @session: The session to perform the operation. * @max_count: The maximum number of file path entries to be recorded with * @record_path. * @last_state: Either %STORAGE_FILE_LIST_START or the @flags arg of the last * call to @record_path during the previous call to storage_file_list(). * @last_fname: Ignored if @last_state is %STORAGE_FILE_LIST_START. Otherwise, * @last_fname should contain the @path arg of the last call to @record_path * during the previous call to storage_file_list(). * @last_fname_len: The length of @last_fname if @last_fname is present. Ignored * otherwise. * @flags: Flags for performing this operation. See &struct storage_op_flags for * details. * @can_record_path: Checks whether a path (with a length less than or equal to * @can_record_path.max_path_len) can be recorded using the @record_path * callback. * @record_path: Records a @record_path.path that is @record_path.path_len bytes * long. @record_path.path may be null if @record_path.flags is * %STORAGE_FILE_LIST_END. * @callback_data: Will be passed as the first argument to calls to * @can_record_path and @record_path. */ enum storage_err storage_file_list( struct storage_client_session* session, uint8_t max_count, enum storage_file_list_flag last_state, const char* last_fname, size_t last_fname_len, struct storage_op_flags flags, bool (*can_record_path)(void* callback_data, size_t max_path_len), void (*record_path)(void* callback_data, enum storage_file_list_flag flags, const char* path, size_t path_len), void* callback_data); /** * storage_file_get_size() - Gets the size of a file. * @session: The session to perform the operation. * @handle: The file handle previously created by storage_file_open(). * @flags: Flags for performing this operation. See &struct storage_op_flags for * details. * @size: Out-param. After a successful call, contains the file's size. */ enum storage_err storage_file_get_size(struct storage_client_session* session, uint32_t handle, struct storage_op_flags flags, uint64_t* size); /** * storage_file_set_size() - Sets the size of a file. Truncates if the file is * larger than @new_size. * @session: The session to perform the operation. * @handle: The file handle previously created by storage_file_open(). * @new_size: The file's target size. * @flags: Flags for performing this operation. See &struct storage_op_flags for * details. */ enum storage_err storage_file_set_size(struct storage_client_session* session, uint32_t handle, uint64_t new_size, struct storage_op_flags flags); __END_CDECLS