/* Примитивы диска для storage и клиентского worker. На POSIX пути разрешаются * относительно открытого каталога через *at/O_NOFOLLOW. Windows удерживает каталоги * без FILE_SHARE_DELETE и отвергает reparse points; имена преобразуются UTF-8→UTF-16. * fd принадлежит вызывающему; read/write работают по 64-битному смещению. */ #ifndef MEMBER_FILES_DISK_H #define MEMBER_FILES_DISK_H #include "protocol.h" #include "../../lib/platform_compat.h" struct mf_disk_info { uint64_t size, mtime, identity[6]; uint8_t type; }; struct mf_disk_root { char path[2048]; #ifdef _WIN32 HANDLE handle; #else int fd; #endif }; int mf_disk_root_open(struct mf_disk_root* root, const char* path); void mf_disk_root_close(struct mf_disk_root* root); int mf_disk_open(struct mf_disk_root* root, const char* path, int create, int writable, int* fd); int mf_disk_stat(struct mf_disk_root* root, const char* path, struct mf_disk_info* info); int mf_disk_info(int fd, struct mf_disk_info* info); /* created, если не NULL, показывает факт создания даже при последующей ошибке sync. */ int mf_disk_mkdir(struct mf_disk_root* root, const char* path, int* created); int mf_disk_remove(struct mf_disk_root* root, const char* path, int directory); int mf_disk_rename(struct mf_disk_root* root, const char* from, const char* to); typedef int (*mf_disk_entry_fn)(void* arg, const char* name, const struct mf_disk_info* info); int mf_disk_list(struct mf_disk_root* root, const char* path, mf_disk_entry_fn cb, void* arg); int mf_disk_read(int fd, uint64_t offset, void* data, size_t size); int mf_disk_write(int fd, uint64_t offset, const void* data, size_t size); int mf_disk_resize(int fd, uint64_t size); int mf_disk_sync(int fd); int mf_disk_close(int fd); int mf_disk_local_open(const char* path, int create, int* fd); int mf_disk_local_publish(const char* from, const char* to); int mf_disk_local_remove(const char* path); int mf_disk_hash(int fd, uint64_t size, uint8_t hash[32]); #endif