Files
dat-thang/extra/dat-dpi/inc/dat.h
T
divorce b735900f2e 0.0.002
ddat interop with dat js
cable interop with cabal js
ddat's frontend = dat-thang
cable fe = cable-thang
dillo support based on cel's dillo-dat
bootstrap node
xplatform support

Signed-off-by: divo <418@cryspace.space>
2026-10-19 00:17:02 -04:00

115 lines
4.9 KiB
C

#ifndef DAT_H
#define DAT_H
#include <stdint.h>
#include <stddef.h>
#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 */