update: redesigning ctx functions and structure
This commit is contained in:
@ -28,3 +28,4 @@
|
||||
#include "error.h"
|
||||
#include "pool.h"
|
||||
#include "types.h"
|
||||
#include "util.h"
|
||||
|
107
include/ctx.h
107
include/ctx.h
@ -1,46 +1,97 @@
|
||||
#pragma once
|
||||
#include "database.h"
|
||||
#include "types.h"
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
typedef struct lm_ctx {
|
||||
lm_pool_t *pools; // pool list
|
||||
char *root; // root path for package installtion
|
||||
char *temp; // temp path
|
||||
char *data; // package database path
|
||||
const char *version; // libmp version (read-only)
|
||||
lm_database_t *db; // package database
|
||||
lm_pool_t *pools; // pool list
|
||||
char *root; // root path for package installtion
|
||||
char *temp; // temp path
|
||||
char *data; // package database path
|
||||
const char *version; // libmp version (read-only)
|
||||
} lm_ctx_t;
|
||||
|
||||
typedef bool (*lm_ctx_pool_callback_t)(lm_ctx_t *ctx, lm_pool_t *pool, bool status, void *data);
|
||||
typedef bool (*lm_ctx_database_callback_t)(lm_ctx_t *ctx, lm_pkg_t *pkg, void *data);
|
||||
typedef struct lm_ctx_resolve_list {
|
||||
lm_pkg_t *resolving;
|
||||
lm_pkg_t *packages;
|
||||
lm_pkg_t *cur;
|
||||
size_t count;
|
||||
} lm_ctx_resolve_list_t;
|
||||
|
||||
typedef struct lm_ctx_update_list {
|
||||
lm_pkg_t **packages;
|
||||
size_t count;
|
||||
size_t index;
|
||||
} lm_ctx_update_list_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_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);
|
||||
typedef lm_ctx_install_callback_t lm_ctx_remove_callback_t;
|
||||
typedef lm_ctx_install_callback_t lm_ctx_check_callback_t;
|
||||
|
||||
/* ###############
|
||||
## ctx stuff ##
|
||||
############### */
|
||||
void lm_ctx_init(lm_ctx_t *ctx);
|
||||
bool lm_ctx_set_data(lm_ctx_t *ctx, char *dir);
|
||||
bool lm_ctx_set_root(lm_ctx_t *ctx, char *dir);
|
||||
bool lm_ctx_set_temp(lm_ctx_t *ctx, char *dir);
|
||||
void lm_ctx_free(lm_ctx_t *ctx);
|
||||
|
||||
lm_pkg_t *lm_ctx_find(lm_ctx_t *ctx, char *name, char *version);
|
||||
bool lm_ctx_install(lm_ctx_t *ctx, char *package);
|
||||
bool lm_ctx_remove(lm_ctx_t *ctx, char *package);
|
||||
bool lm_ctx_verify(lm_ctx_t *ctx, char *package);
|
||||
bool lm_ctx_update(lm_ctx_t *ctx);
|
||||
/* ####################
|
||||
## main fucntions ##
|
||||
#################### */
|
||||
lm_pkg_t *lm_ctx_find(lm_ctx_t *ctx, char *name, char *version); // find package by name (and version)
|
||||
|
||||
lm_pool_t *lm_ctx_pool_add(lm_ctx_t *ctx, char *name, char *url);
|
||||
bool lm_ctx_pool_del(lm_ctx_t *ctx, char *name);
|
||||
void lm_ctx_pool_clear(lm_ctx_t *ctx);
|
||||
bool lm_ctx_pool_serve(lm_ctx_t *ctx, char *addr, uint8_t threads);
|
||||
void lm_ctx_pool_test(lm_ctx_t *ctx, lm_ctx_pool_callback_t callback, void *data);
|
||||
void lm_ctx_pool_get_info(
|
||||
lm_ctx_t *ctx, bool allow_update, bool force_update, lm_ctx_pool_callback_t callback, void *data);
|
||||
void lm_ctx_pool_get_list(
|
||||
lm_ctx_t *ctx, bool allow_update, bool force_update, lm_ctx_pool_callback_t callback, void *data);
|
||||
lm_ctx_resolve_list_t *lm_ctx_resolve(
|
||||
lm_ctx_t *ctx, lm_pkg_t *pkg); // resolves a package and returns a list of packages to install
|
||||
lm_pkg_t *lm_ctx_resolve_next(lm_ctx_t *ctx, lm_ctx_resolve_list_t *list); // returns the next package in the list
|
||||
void lm_ctx_resolve_free(
|
||||
lm_ctx_t *ctx, lm_ctx_resolve_list_t *list); // frees the resolved list returned by lm_ctx_resolve
|
||||
|
||||
bool lm_ctx_package_install(lm_ctx_t *ctx, lm_pkg_t *pkg);
|
||||
bool lm_ctx_package_remove(lm_ctx_t *ctx, lm_pkg_t *pkg);
|
||||
bool lm_ctx_package_verify(lm_ctx_t *ctx, lm_pkg_t *pkg);
|
||||
lm_ctx_update_list_t *lm_ctx_update(lm_ctx_t *ctx); // returns a list of packages to update
|
||||
lm_pkg_t *lm_ctx_update_next(lm_ctx_t *ctx, lm_ctx_update_list_t *list); // returns the next package in the list
|
||||
void lm_ctx_update_free(lm_ctx_t *ctx, lm_ctx_update_list_t *list); // frees the update list returned by lm_ctx_update
|
||||
|
||||
lm_database_t *lm_ctx_database_new(lm_ctx_t *ctx);
|
||||
bool lm_ctx_database_is_installed(lm_ctx_t *ctx, lm_pkg_t *pkg, bool check_version);
|
||||
bool lm_ctx_database_find(lm_ctx_t *ctx, lm_pkg_t *pkg, char *name);
|
||||
bool lm_ctx_database_foreach(lm_ctx_t *ctx, lm_ctx_database_callback_t callback, void *data);
|
||||
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
|
||||
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(
|
||||
lm_ctx_t *ctx, lm_pkg_t *pkg, lm_ctx_remove_callback_t callback, void *data); // removes a single package
|
||||
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
|
||||
|
||||
/* ####################
|
||||
## 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
|
||||
|
||||
/* ########################
|
||||
## database fucntions ##
|
||||
######################## */
|
||||
bool lm_ctx_database_init(lm_ctx_t *ctx); // init ctx database (if not already present)
|
||||
bool lm_ctx_database_is_installed(lm_ctx_t *ctx, lm_pkg_t *pkg, bool check_version); // check if a package is installed
|
||||
bool lm_ctx_database_find(lm_ctx_t *ctx, lm_pkg_t *pkg, char *name); // find a package by name
|
||||
bool lm_ctx_database_foreach(
|
||||
lm_ctx_t *ctx, lm_ctx_database_callback_t callback, void *data); // loop for each package in the database
|
||||
|
@ -42,3 +42,7 @@ bool lm_database_keeps_foreach(lm_database_t *db, lm_pkg_t *pkg, lm_database_kee
|
||||
bool lm_database_keeps_load(lm_database_t *db, lm_pkg_t *pkg);
|
||||
bool lm_database_keeps_save(lm_database_t *db, lm_pkg_t *pkg);
|
||||
bool lm_database_keeps_del(lm_database_t *db, lm_pkg_t *pkg);
|
||||
|
||||
bool lm_database_changes_update(lm_database_t *db, lm_pkg_t *pkg, char *file);
|
||||
char *lm_database_changes_get(lm_database_t *db, lm_pkg_t *pkg);
|
||||
bool lm_database_changes_del(lm_database_t *db, lm_pkg_t *pkg);
|
||||
|
189
include/error.h
189
include/error.h
@ -1,99 +1,102 @@
|
||||
#pragma once
|
||||
|
||||
#define lm_strerror_dup() \
|
||||
{ strdup(lm_strerror()) }
|
||||
|
||||
typedef enum lm_error {
|
||||
LM_ERR_NoError = 0,
|
||||
LM_ERR_URLBadChar = 1,
|
||||
LM_ERR_URLBadProtocol = 2,
|
||||
LM_ERR_URLTooLarge = 3,
|
||||
LM_ERR_URLHostLarge = 4,
|
||||
LM_ERR_URLPathLarge = 5,
|
||||
LM_ERR_URLBadHost = 6,
|
||||
LM_ERR_URLBadPort = 7,
|
||||
LM_ERR_URLBadPath = 8,
|
||||
LM_ERR_URLPortUnknown = 9,
|
||||
LM_ERR_BadPort = 10,
|
||||
LM_ERR_BadHost = 11,
|
||||
LM_ERR_PoolNoSupport = 12,
|
||||
LM_ERR_URLEnd = 13,
|
||||
LM_ERR_MPTPBadVersion = 14,
|
||||
LM_ERR_MPTPBadCode = 15,
|
||||
LM_ERR_MPTPBadUrl = 16,
|
||||
LM_ERR_MPTPHostFail = 17,
|
||||
LM_ERR_MPTPSocketFail = 18,
|
||||
LM_ERR_MPTPConnectFail = 19,
|
||||
LM_ERR_MPTPRecvFail = 20,
|
||||
LM_ERR_MPTPSendFail = 21,
|
||||
LM_ERR_MPTPBadData = 22,
|
||||
LM_ERR_MPTPBadHost = 23,
|
||||
LM_ERR_MPTPSetsockopt = 24,
|
||||
LM_ERR_MPTPTimeout = 25,
|
||||
LM_ERR_MPTPBindFail = 26,
|
||||
LM_ERR_ArgNULL = 27,
|
||||
LM_ERR_MPTPNotResponse = 28,
|
||||
LM_ERR_MPTPNotRequest = 29,
|
||||
LM_ERR_MPTPNotLast = 30,
|
||||
LM_ERR_NoPort = 31,
|
||||
LM_ERR_PoolInfoBad = 32,
|
||||
LM_ERR_ArcWBlockFail = 33,
|
||||
LM_ERR_ArcRBlockFail = 34,
|
||||
LM_ERR_ArcOpenFail = 35,
|
||||
LM_ERR_ArcWHeaderFail = 36,
|
||||
LM_ERR_ArcWEntryFail = 37,
|
||||
LM_ERR_ArcNewFail = 38,
|
||||
LM_ERR_ArcNextHeaderFail = 39,
|
||||
LM_ERR_GetCwdFail = 39,
|
||||
LM_ERR_PoolListDirFail = 40,
|
||||
LM_ERR_PoolListCantRead = 41,
|
||||
LM_ERR_PoolInfoCantRead = 42,
|
||||
LM_ERR_PkgBadName = 43,
|
||||
LM_ERR_PkgDataBad = 44,
|
||||
LM_ERR_CtxDataNULL = 45,
|
||||
LM_ERR_CtxTempFail = 46,
|
||||
LM_ERR_CtxTempNotDir = 47,
|
||||
LM_ERR_CtxTempNoWrite = 48,
|
||||
LM_ERR_CtxRootFail = 49,
|
||||
LM_ERR_CtxRootNotDir = 50,
|
||||
LM_ERR_CtxRootNoWrite = 51,
|
||||
LM_ERR_CtxDataNotDir = 52,
|
||||
LM_ERR_CtxDataNoWrite = 53,
|
||||
LM_ERR_CtxDataFailMkdir = 54,
|
||||
LM_ERR_ArcRealpathFail = 55,
|
||||
LM_ERR_PoolTestNotPong = 56,
|
||||
LM_ERR_PkgPathsEmpty = 57,
|
||||
LM_ERR_SendOpenFail = 58,
|
||||
LM_ERR_RecvDelFail = 59,
|
||||
LM_ERR_RecvOpenFail = 60,
|
||||
LM_ERR_RecvBadCode = 61,
|
||||
LM_ERR_RecvWriteFail = 62,
|
||||
LM_ERR_PkgNotFound = 63,
|
||||
LM_ERR_DbCantAccess = 64,
|
||||
LM_ERR_DbSqlOpenFail = 65,
|
||||
LM_ERR_DbSqlCreateFail = 66,
|
||||
LM_ERR_DbSqlPrepareFail = 67,
|
||||
LM_ERR_DbSqlInsertFail = 68,
|
||||
LM_ERR_PkgGPGFail = 69,
|
||||
LM_ERR_PkgGPGSigFail = 70,
|
||||
LM_ERR_PkgGPGArchiveFail = 71,
|
||||
LM_ERR_PkgSigNoMatch = 72,
|
||||
LM_ERR_PkgSigNoResult = 73,
|
||||
LM_ERR_PoolPathsEmpty = 74,
|
||||
LM_ERR_PoolNotAvailable = 75,
|
||||
LM_ERR_PoolUrlEmpty = 76,
|
||||
LM_ERR_PoolBadDir = 77,
|
||||
LM_ERR_PoolBadPaths = 78,
|
||||
LM_ERR_DbFilesNotFound = 79,
|
||||
LM_ERR_DbFilesOpenFail = 80,
|
||||
LM_ERR_DbFilesDirFail = 81,
|
||||
LM_ERR_DbFilesUnlinkFail = 82,
|
||||
LM_ERR_DbFilesWriteFail = 83,
|
||||
LM_ERR_DbKeepsNotFound = 84,
|
||||
LM_ERR_DbKeepsOpenFail = 85,
|
||||
LM_ERR_DbKeepsDirFail = 86,
|
||||
LM_ERR_DbKeepsUnlinkFail = 87,
|
||||
LM_ERR_DbSqlNotFound = 88,
|
||||
LM_ERR_DependNotFound = 89,
|
||||
LM_ERR_InstallDownloadFail = 90,
|
||||
LM_ERR_PkgNotDownloaded = 91,
|
||||
LM_ERR_NoError = 0,
|
||||
LM_ERR_URLBadChar = 1,
|
||||
LM_ERR_URLBadProtocol = 2,
|
||||
LM_ERR_URLTooLarge = 3,
|
||||
LM_ERR_URLHostLarge = 4,
|
||||
LM_ERR_URLPathLarge = 5,
|
||||
LM_ERR_URLBadHost = 6,
|
||||
LM_ERR_URLBadPort = 7,
|
||||
LM_ERR_URLBadPath = 8,
|
||||
LM_ERR_URLPortUnknown = 9,
|
||||
LM_ERR_BadPort = 10,
|
||||
LM_ERR_BadHost = 11,
|
||||
LM_ERR_PoolNoSupport = 12,
|
||||
LM_ERR_URLEnd = 13,
|
||||
LM_ERR_MPTPBadVersion = 14,
|
||||
LM_ERR_MPTPBadCode = 15,
|
||||
LM_ERR_MPTPBadUrl = 16,
|
||||
LM_ERR_MPTPHostFail = 17,
|
||||
LM_ERR_MPTPSocketFail = 18,
|
||||
LM_ERR_MPTPConnectFail = 19,
|
||||
LM_ERR_MPTPRecvFail = 20,
|
||||
LM_ERR_MPTPSendFail = 21,
|
||||
LM_ERR_MPTPBadData = 22,
|
||||
LM_ERR_MPTPBadHost = 23,
|
||||
LM_ERR_MPTPSetsockopt = 24,
|
||||
LM_ERR_MPTPTimeout = 25,
|
||||
LM_ERR_MPTPBindFail = 26,
|
||||
LM_ERR_ArgNULL = 27,
|
||||
LM_ERR_MPTPNotResponse = 28,
|
||||
LM_ERR_MPTPNotRequest = 29,
|
||||
LM_ERR_MPTPNotLast = 30,
|
||||
LM_ERR_NoPort = 31,
|
||||
LM_ERR_PoolInfoBad = 32,
|
||||
LM_ERR_ArcWBlockFail = 33,
|
||||
LM_ERR_ArcRBlockFail = 34,
|
||||
LM_ERR_ArcOpenFail = 35,
|
||||
LM_ERR_ArcWHeaderFail = 36,
|
||||
LM_ERR_ArcWEntryFail = 37,
|
||||
LM_ERR_ArcNewFail = 38,
|
||||
LM_ERR_ArcNextHeaderFail = 39,
|
||||
LM_ERR_GetCwdFail = 39,
|
||||
LM_ERR_PoolListDirFail = 40,
|
||||
LM_ERR_PoolListCantRead = 41,
|
||||
LM_ERR_PoolInfoCantRead = 42,
|
||||
LM_ERR_PkgBadName = 43,
|
||||
LM_ERR_PkgDataBad = 44,
|
||||
LM_ERR_CtxDataNULL = 45,
|
||||
LM_ERR_CtxTempFail = 46,
|
||||
LM_ERR_CtxTempNotDir = 47,
|
||||
LM_ERR_CtxTempNoWrite = 48,
|
||||
LM_ERR_CtxRootFail = 49,
|
||||
LM_ERR_CtxRootNotDir = 50,
|
||||
LM_ERR_CtxRootNoWrite = 51,
|
||||
LM_ERR_CtxDataNotDir = 52,
|
||||
LM_ERR_CtxDataNoWrite = 53,
|
||||
LM_ERR_CtxDataFailMkdir = 54,
|
||||
LM_ERR_ArcRealpathFail = 55,
|
||||
LM_ERR_PoolTestNotPong = 56,
|
||||
LM_ERR_PkgPathsEmpty = 57,
|
||||
LM_ERR_SendOpenFail = 58,
|
||||
LM_ERR_RecvDelFail = 59,
|
||||
LM_ERR_RecvOpenFail = 60,
|
||||
LM_ERR_RecvBadCode = 61,
|
||||
LM_ERR_RecvWriteFail = 62,
|
||||
LM_ERR_PkgNotFound = 63,
|
||||
LM_ERR_DbCantAccess = 64,
|
||||
LM_ERR_DbSqlOpenFail = 65,
|
||||
LM_ERR_DbSqlCreateFail = 66,
|
||||
LM_ERR_DbSqlPrepareFail = 67,
|
||||
LM_ERR_DbSqlInsertFail = 68,
|
||||
LM_ERR_PkgGPGFail = 69,
|
||||
LM_ERR_PkgGPGSigFail = 70,
|
||||
LM_ERR_PkgGPGArchiveFail = 71,
|
||||
LM_ERR_PkgSigNoMatch = 72,
|
||||
LM_ERR_PkgSigNoResult = 73,
|
||||
LM_ERR_PoolPathsEmpty = 74,
|
||||
LM_ERR_PoolNotAvailable = 75,
|
||||
LM_ERR_PoolUrlEmpty = 76,
|
||||
LM_ERR_PoolBadDir = 77,
|
||||
LM_ERR_PoolBadPaths = 78,
|
||||
LM_ERR_DbFilesNotFound = 79,
|
||||
LM_ERR_DbFilesOpenFail = 80,
|
||||
LM_ERR_DbFilesDirFail = 81,
|
||||
LM_ERR_DbFilesUnlinkFail = 82,
|
||||
LM_ERR_DbFilesWriteFail = 83,
|
||||
LM_ERR_DbKeepsNotFound = 84,
|
||||
LM_ERR_DbKeepsOpenFail = 85,
|
||||
LM_ERR_DbKeepsDirFail = 86,
|
||||
LM_ERR_DbKeepsUnlinkFail = 87,
|
||||
LM_ERR_DbSqlNotFound = 88,
|
||||
LM_ERR_DependNotFound = 89,
|
||||
LM_ERR_InstallDownloadFail = 90,
|
||||
LM_ERR_PkgNotDownloaded = 91,
|
||||
LM_ERR_PkgRemoveDownloadFail = 92,
|
||||
} lm_error_t;
|
||||
|
||||
|
@ -33,3 +33,4 @@ bool lm_package_path_set_signature(lm_pkg_t *pkg, char *signature_path);
|
||||
bool lm_package_path_set_archive(lm_pkg_t *pkg, char *archive_path);
|
||||
bool lm_package_path_is_empty(lm_pkg_t *pkg);
|
||||
void lm_package_path_free(lm_pkg_t *pkg);
|
||||
bool lm_package_is_same(lm_pkg_t *one, lm_pkg_t *two);
|
||||
|
@ -15,6 +15,7 @@ bool is_digit(char c);
|
||||
bool copy_from_buffer(void *dst, void *buffer, size_t size, ssize_t *total, ssize_t *used);
|
||||
bool copy_to_buffer(void *buffer, void *src, size_t size, ssize_t *total, ssize_t *used);
|
||||
|
||||
bool copy_file(char *dst, char *src);
|
||||
bool can_write(char *path);
|
||||
bool can_read(char *path);
|
||||
bool is_file(char *path);
|
||||
|
Reference in New Issue
Block a user