#ifndef DAT_H #define DAT_H #include #include #include "keys.h" #include "sleep_proto.h" #define DAT_KEY_BYTES 32u #define DAT_BLOCK_BYTES (64u * 1024u) #define DAT_URL_BYTES 71u #define DAT_LINK_BYTES 4096u typedef struct dat_archive { char dat_path[1024]; uint8_t metadata_key[DAT_KEY_BYTES]; uint8_t content_key[DAT_KEY_BYTES]; sleep_keypair_t metadata_keys; sleep_keypair_t content_keys; } dat_archive_t; typedef struct dat_link { uint8_t key[DAT_KEY_BYTES]; uint64_t version; int has_version; char path[2048]; } dat_link_t; typedef struct dat_checkout { const dat_archive_t *archive; uint64_t version; } dat_checkout_t; typedef struct dat_url { char host[256]; char path[2048]; uint64_t version; int has_version; int wants_stat; int force_directory_listing; } dat_url_t; typedef struct dat_path_info { sleep_metadata_entry_t entry; int exists; int is_directory; } dat_path_info_t; typedef int (*dat_archive_change_fn)(const sleep_metadata_entry_t *entry, uint64_t version, void *context); typedef int (*dat_archive_readdir_fn)(const sleep_metadata_entry_t *entry, const char *name, void *context); /* Creates a new two-feed legacy-style archive skeleton under root/.dat. */ int dat_archive_create(dat_archive_t *archive, const char *root); int dat_archive_open(dat_archive_t *archive, const char *root); int dat_archive_open_writable(dat_archive_t *archive, const char *root, const char *secret_directory); int dat_archive_save_secrets(const dat_archive_t *archive, const char *secret_directory); void dat_archive_close(dat_archive_t *archive); size_t dat_archive_entry_count(const dat_archive_t *archive); uint64_t dat_archive_version(const dat_archive_t *archive); int dat_archive_append_file(dat_archive_t *archive, const char *path, const uint8_t *data, size_t length, uint32_t mode, uint64_t mtime); int dat_archive_append_directory(dat_archive_t *archive, const char *path, uint32_t mode, uint64_t mtime); int dat_archive_append_symlink(dat_archive_t *archive, const char *path, const char *target, uint64_t mtime); int dat_archive_delete(dat_archive_t *archive, const char *path, uint64_t mtime); int dat_archive_read_entry(const dat_archive_t *archive, size_t index, sleep_metadata_entry_t *entry); int dat_archive_read_file(const dat_archive_t *archive, const sleep_metadata_entry_t *entry, uint8_t **data, size_t *length); int dat_archive_find(const dat_archive_t *archive, const char *path, sleep_metadata_entry_t *entry); int dat_archive_find_at(const dat_archive_t *archive, const char *path, uint64_t version, sleep_metadata_entry_t *entry); int dat_checkout_init(dat_checkout_t *checkout, const dat_archive_t *archive, uint64_t version); int dat_checkout_find(const dat_checkout_t *checkout, const char *path, sleep_metadata_entry_t *entry); int dat_checkout_read(const dat_checkout_t *checkout, const sleep_metadata_entry_t *entry, uint8_t **data, size_t *length); int dat_checkout_export(const dat_checkout_t *checkout, const char *archive_path, const char *filesystem_path); int dat_archive_changes(const dat_archive_t *archive, uint64_t from_version, uint64_t to_version, dat_archive_change_fn callback, void *context); int dat_archive_stat_at(const dat_archive_t *archive, uint64_t version, const char *path, dat_path_info_t *info); int dat_archive_readdir_at(const dat_archive_t *archive, uint64_t version, const char *path, dat_archive_readdir_fn callback, void *context); int dat_archive_resolve_at(const dat_archive_t *archive, uint64_t version, const char *path, int force_directory_listing, dat_path_info_t *info, int *serve_directory_listing); const char *dat_content_type(const char *path); int dat_url_parse(const char *text, dat_url_t *url); int dat_archive_import_path(dat_archive_t *archive, const char *filesystem_path, const char *archive_path); /* Imports only changed paths and records tombstones for paths removed locally. */ int dat_archive_sync_path(dat_archive_t *archive, const char *filesystem_path, const char *archive_path); int dat_archive_export_path(const dat_archive_t *archive, const char *archive_path, const char *filesystem_path); int dat_archive_export_at(const dat_archive_t *archive, uint64_t version, const char *archive_path, const char *filesystem_path); int dat_key_to_url(const uint8_t key[DAT_KEY_BYTES], char url[DAT_URL_BYTES]); int dat_key_to_compact_url(const uint8_t key[DAT_KEY_BYTES], char url[DAT_URL_BYTES]); int dat_key_to_hex(const uint8_t key[DAT_KEY_BYTES], char hex[65]); int dat_url_to_key(const char *url, uint8_t key[DAT_KEY_BYTES]); int dat_link_format(const dat_link_t *link, char *out, size_t capacity); int dat_link_format_compact(const dat_link_t *link, char *out, size_t capacity); int dat_link_parse(const char *text, dat_link_t *link); #endif /* DAT_H */