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>
115 lines
4.9 KiB
C
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 */
|