update: recvfile and sendfile callbacks and more ctx function implementations

This commit is contained in:
ngn
2024-07-05 16:27:11 +03:00
parent 6045f73478
commit 98e5c861df
21 changed files with 1359 additions and 429 deletions

@ -26,15 +26,26 @@ typedef struct lm_ctx_update_list {
size_t index;
} lm_ctx_update_list_t;
typedef enum lm_ctx_sync_state {
SYNC_DOWNLOADING_INFO = 0,
SYNC_INFO_SUCCESS = 1,
SYNC_INFO_FAIL = 2,
SYNC_DOWNLOADING_LIST = 3,
SYNC_LIST_SUCCESS = 4,
SYNC_LIST_FAIL = 5,
} lm_ctx_sync_state_t;
/* ###################
## ctx callbacks ##
################### */
typedef bool (*lm_ctx_database_callback_t)(lm_ctx_t *ctx, lm_pkg_t *pkg, void *data);
typedef bool (*lm_ctx_download_callback_t)(lm_ctx_t *ctx, lm_pkg_t *pkg, size_t current, size_t total, void *data);
typedef bool (*lm_ctx_download_callback_t)(
lm_ctx_t *ctx, lm_pkg_t *pkg, bool is_archive, size_t current, size_t total, void *data);
typedef bool (*lm_ctx_install_callback_t)(
lm_ctx_t *ctx, lm_pkg_t *pkg, char *file, size_t current, size_t total, void *data);
typedef bool (*lm_ctx_sync_callback_t)(
lm_ctx_t *ctx, lm_pool_t *pool, bool status, size_t current, size_t total, void *data);
lm_ctx_t *ctx, lm_pool_t *pool, lm_ctx_sync_state_t state, size_t current, size_t total, void *data);
typedef bool (*lm_ctx_ping_callback_t)(lm_ctx_t *ctx, lm_pool_t *pool, bool status, void *data);
typedef lm_ctx_install_callback_t lm_ctx_remove_callback_t;
typedef lm_ctx_install_callback_t lm_ctx_check_callback_t;
@ -63,7 +74,7 @@ lm_pkg_t *lm_ctx_update_next(lm_ctx_t *ctx, lm_ctx_update_list_t *list); // retu
void lm_ctx_update_free(lm_ctx_t *ctx, lm_ctx_update_list_t *list); // frees the update list returned by lm_ctx_update
bool lm_ctx_download(lm_ctx_t *ctx, lm_pkg_t *pkg, lm_ctx_download_callback_t callback,
void *data); // downloads a single package if its not already downloaded
void *data); // downloads a single package
bool lm_ctx_install(
lm_ctx_t *ctx, lm_pkg_t *pkg, lm_ctx_install_callback_t callback, void *data); // installs/updates a single package
bool lm_ctx_remove(
@ -71,21 +82,16 @@ bool lm_ctx_remove(
bool lm_ctx_check(
lm_ctx_t *ctx, lm_pkg_t *pkg, lm_ctx_check_callback_t callback, void *data); // checks a single package
bool lm_ctx_sync(lm_ctx_t *ctx, bool do_update, lm_ctx_sync_callback_t callback, void *data); // syncs all the pools
bool lm_ctx_serve(lm_ctx_t *ctx, char *add, uint8_t threads); // serves all the pools
void lm_ctx_ping(lm_ctx_t *ctx, lm_ctx_ping_callback_t callback, void *data); // pings all the pools
bool lm_ctx_serve(lm_ctx_t *ctx, char *addr, uint8_t threads); // serves all the pools
/* ####################
## pool fucntions ##
#################### */
lm_pool_t *lm_ctx_pool_add(lm_ctx_t *ctx, char *name, char *url); // add a pool to the ctx pool list
bool lm_ctx_pool_del(lm_ctx_t *ctx, char *name); // remove a pool from the ctx pool list
void lm_ctx_pool_clear(lm_ctx_t *ctx); // clear all the pools in the ctx pool list
bool lm_ctx_pool_serve(
lm_ctx_t *ctx, char *addr, uint8_t threads); // serve all the pools on a MPTP server hosted at the given address
void lm_ctx_pool_test(lm_ctx_t *ctx); // test (ping) all the pool connetions
void lm_ctx_pool_get_info(lm_ctx_t *ctx, bool do_update, lm_ctx_sync_callback_t callback,
void *data); // get pool info of all the pools in the ctx list
void lm_ctx_pool_get_list(lm_ctx_t *ctx, bool do_update, lm_ctx_sync_callback_t callback,
void *data); // get pool list of all the pools in the ctx list
lm_pool_t *lm_ctx_pool_add(lm_ctx_t *ctx, char *name, char *url); // add a pool to the ctx pool list
bool lm_ctx_pool_del(lm_ctx_t *ctx, char *name); // remove a pool from the ctx pool list
void lm_ctx_pool_clear(lm_ctx_t *ctx); // clear all the pools in the ctx pool list
lm_pool_t *lm_ctx_pool_by_url(lm_ctx_t *ctx, char *host, char *path); // find pool by URL
/* ########################
## database fucntions ##

@ -98,6 +98,23 @@ typedef enum lm_error {
LM_ERR_InstallDownloadFail = 90,
LM_ERR_PkgNotDownloaded = 91,
LM_ERR_PkgRemoveDownloadFail = 92,
LM_ERR_CtxTempNULL = 93,
LM_ERR_CtxRootNULL = 94,
LM_ERR_DstOpenFail = 95,
LM_ERR_SrcOpenFail = 96,
LM_ERR_DstWriteFail = 97,
LM_ERR_CtxTempFailMkdir = 98,
LM_ERR_PkgBadArchive = 99,
LM_ERR_PkgDataNotMatch = 100,
LM_ERR_PkgChangesUpdateFail = 101,
LM_ERR_PkgHashesOpenFail = 102,
LM_ERR_PkgNoPool = 103,
LM_ERR_DbChangesUnlinkFail = 104,
LM_ERR_SendStatFail = 105,
LM_ERR_SendSnprintfFail = 106,
LM_ERR_SendReadFail = 107,
LM_ERR_RecvBadSize = 108,
LM_ERR_RecvNotCompleted = 109,
} lm_error_t;
typedef struct lm_error_desc {

@ -114,6 +114,8 @@ typedef struct lm_mptp {
char data[MPTP_DATA_MAX];
} lm_mptp_t;
typedef bool (*lm_mptp_transfer_callback_t)(char *path, size_t current, size_t total, void *data);
#define MPTP_FLAGS_VERSION(m) (((m)->header.flags & 0xFF00) >> 8)
#define MPTP_FLAGS_TYPE(m) (((m)->header.flags & 0x0080) >> 1)
#define MPTP_FLAGS_CODE(m) (((m)->header.flags & 0x0070) >> 4)
@ -142,5 +144,5 @@ bool lm_mptp_server_verify(lm_mptp_t *packet);
bool lm_mptp_server_recv(int sock, lm_mptp_t *packet, struct sockaddr *addr);
bool lm_mptp_server_send(int sock, lm_mptp_t *packet, struct sockaddr *addr);
bool lm_mptp_sendfile(int sock, struct sockaddr *addr, char *path);
bool lm_mptp_recvfile(int sock, char *path);
bool lm_mptp_sendfile(int sock, struct sockaddr *addr, char *path, lm_mptp_transfer_callback_t callback, void *data);
bool lm_mptp_recvfile(int sock, char *path, lm_mptp_transfer_callback_t callback, void *data);

@ -21,20 +21,16 @@ void lm_pool_test(lm_pool_t *pool);
void lm_pool_free(lm_pool_t *pool);
lm_pkg_t *lm_pool_package_find(lm_pool_t *pool, char *name, char *version);
bool lm_pool_package_download(lm_pool_t *pool, lm_pkg_t *pkg);
bool lm_pool_package_add(lm_pool_t *pool, lm_pkg_t *pkg);
bool lm_pool_path_set_dir(lm_pool_t *pool, char *dir);
bool lm_pool_path_is_empty(lm_pool_t *pool);
void lm_pool_path_free(lm_pool_t *pool);
bool lm_pool_info_download(lm_pool_t *pool, lm_mptp_transfer_callback_t callback, void *data);
bool lm_pool_info_load(lm_pool_t *pool);
bool lm_pool_info_download(lm_pool_t *pool);
void lm_pool_info_free(lm_pool_t *pool);
bool lm_pool_list_download(lm_pool_t *pool, lm_mptp_transfer_callback_t callback, void *data);
bool lm_pool_list_load(lm_pool_t *pool);
bool lm_pool_list_download(lm_pool_t *pool);
void lm_pool_list_free(lm_pool_t *pool);
void lm_pool_serve(lm_pool_t *pool, lm_mptp_t *packet, int sock, struct sockaddr *addr);
void lm_pool_serve_thread(void *arg);