/* Серверное хранилище. Вызывать execute/sweep/destroy последовательно, только без * одновременно работающего worker. create не обращается к диску; initialize выполняет * стартовый обход в worker до запросов. ACL проверяет member_files.c перед каждой работой. Файлы временных загрузок * закрываются после 10 секунд простоя, удаляются после upload_ttl; restart отменяет их. * Открытые regular-файлы кешируются, максимум 64. Родительские пути не следуют ссылкам. */ #ifndef MEMBER_FILES_STORAGE_H #define MEMBER_FILES_STORAGE_H #include "protocol.h" struct mf_storage; struct mf_storage* mf_storage_create(const char* root, uint64_t quota, uint64_t upload_ttl_tb); /* Однократный стартовый обход. До его завершения execute возвращает BUSY, после ошибки — её код. */ int mf_storage_initialize(struct mf_storage* storage); void mf_storage_destroy(struct mf_storage* storage); void mf_storage_sweep(struct mf_storage* storage, uint64_t now); void mf_storage_execute(struct mf_storage* storage, uint64_t group, uint64_t peer, const struct mf_message* request, struct mf_message* response); /* Диагностика/тест: число файловых дескрипторов, исключая каталог корня. */ unsigned mf_storage_open_count(const struct mf_storage* storage); #endif