52 lines
4.5 KiB
C
52 lines
4.5 KiB
C
/* file_transfer — передача неизменяемого файла между явно заданными узлами.
|
|
* Не знает о чатах, ключах содержимого, custody или БД. lookup авторизует запрос
|
|
* и возвращает путь; получатель проверяет содержимое в своём done.
|
|
* Каждая операция владеет CM handle до завершения/отмены, включая DOWN/TIMEOUT.
|
|
* Все API/callbacks в uasync; destroy вызывается вне callbacks, до удаления групп.
|
|
* До 16 входящих/исходящих операций суммарно. DATA до 8192 байт; router-пакеты подписаны,
|
|
* uint64 wire-поля имеют native byte order. Простой 30с завершает операцию ошибкой;
|
|
* при восстановлении пути/простое приём повторяет REQUEST с непрерывного полученного offset.
|
|
* Собственное временное назначение передаёт вызывающий: файл открывается с усечением,
|
|
* в том числе до возможного отказа запуска. При ошибке/cancel файл не удаляется и отбрасывается caller.
|
|
*/
|
|
#ifndef FILE_TRANSFER_H
|
|
#define FILE_TRANSFER_H
|
|
|
|
#include <stdint.h>
|
|
#include <stddef.h>
|
|
|
|
struct UTUN_INSTANCE;
|
|
struct file_transfer;
|
|
struct file_transfer_op;
|
|
|
|
/* Вызывается для каждого REQUEST, включая повторы: проверить права group/peer/object/size.
|
|
* 0 — записан NUL-терминированный путь (<cap байт) неизменяемого файла; иначе отказ.
|
|
* Файл сохранять доступным до завершения выдачи; перед отзывом отменить операции объекта. */
|
|
typedef int (*file_transfer_lookup_fn)(void* arg, uint64_t group, uint64_t peer,
|
|
const uint8_t object[16], uint64_t size, char* path, size_t cap);
|
|
typedef void (*file_transfer_done_fn)(void* arg, int error);
|
|
|
|
/* Один ft на instance; inst/его ua/router/группы живут дольше ft. lookup обязателен, arg заимствован.
|
|
* Создаёт router binding; возвращает owner либо NULL при ошибке. */
|
|
struct file_transfer* file_transfer_create(struct UTUN_INSTANCE* inst, file_transfer_lookup_fn lookup, void* arg);
|
|
/* Снимает binding и синхронно завершает активные pull как cancel; NULL допустим. */
|
|
void file_transfer_destroy(struct file_transfer* ft);
|
|
|
|
/* 0 в done означает точный приём size байт и закрытие файла, а не custody ACK.
|
|
* group/peer ненулевые, object указывает на 16 байт, size=1..INT64_MAX; done обязателен.
|
|
* destination — собственный временный путь; строка не сохраняется, файл открывается до возврата.
|
|
* Возвращает handle операции; done/arg заимствованы до завершения/отмены.
|
|
* Возврат NULL означает отказ запуска, done не вызывается.
|
|
* Ошибка приёма/таймаут даёт done(-1); успешный приём не включает fsync или проверку хеша.
|
|
* Handle перестаёт существовать перед вызовом done, его нужно обнулить в callback. */
|
|
struct file_transfer_op* file_transfer_pull(struct file_transfer* ft, uint64_t group, uint64_t peer,
|
|
const uint8_t object[16], uint64_t size, const char* destination,
|
|
file_transfer_done_fn done, void* arg);
|
|
/* Синхронный done(-2), ошибка fclose заменяет результат на -1. NULL допустим; прежний handle больше не использовать. */
|
|
void file_transfer_cancel(struct file_transfer_op* op);
|
|
/* Отозвать все операции объекта во всех группах (TTL/delete); ft=NULL допустим, object обязателен.
|
|
* callbacks приёма вызываются синхронно с -2, при ошибке fclose — с -1. */
|
|
void file_transfer_cancel_object(struct file_transfer* ft, const uint8_t object[16]);
|
|
|
|
#endif
|