update: better error handling for pool list loading

This commit is contained in:
ngn
2024-08-25 14:30:50 +03:00
parent 1160b4b6a9
commit 3c16d2c5ec
9 changed files with 194 additions and 148 deletions

View File

@ -25,7 +25,7 @@ bool __lm_ctx_sync_callback(char *path, size_t current, size_t total, void *data
return cbdata->callback(cbdata->ctx, cbdata->pool, cbdata->state, current, total, data);
}
size_t lm_ctx_sync(lm_ctx_t *ctx, bool do_update, lm_ctx_sync_callback_t callback, void *data){
ssize_t lm_ctx_sync(lm_ctx_t *ctx, bool do_update, lm_ctx_sync_callback_t callback, void *data){
if(NULL == ctx) {
lm_error_set(LM_ERR_ArgNULL);
return -1;

View File

@ -73,10 +73,14 @@ void lm_error_set(lm_error_t code, ...) {
{.code = LM_ERR_ArcNextHeaderFail, .desc = _("failed to read the next header of the archive") },
{.code = LM_ERR_GetCwdFail, .desc = _("failed to obtain current working directory") },
{.code = LM_ERR_PoolListDirFail, .desc = _("failed to open extracted pool list directory") },
{.code = LM_ERR_PoolListDataFail, .desc = _("failed to load \"%s\" data: %s") },
{.code = LM_ERR_PoolListAddFail, .desc = _("failed add \"%s\" to the pool list: %s") },
{.code = LM_ERR_PoolListCantRead, .desc = _("failed to read access the pool list file") },
{.code = LM_ERR_PoolInfoCantRead, .desc = _("failed to read access the pool info file") },
{.code = LM_ERR_PkgDataBad, .desc = _("failed to parse package data") },
{.code = LM_ERR_PkgBadName, .desc = _("package name is invalid") },
{.code = LM_ERR_PkgBadVersion, .desc = _("package version is invalid") },
{.code = LM_ERR_PkgDataMissing, .desc = _("package data has missing field: %s") },
{.code = LM_ERR_CtxDataNULL, .desc = _("data path is not set with in the ctx") },
{.code = LM_ERR_CtxTempNULL, .desc = _("temp path is not set with in the ctx") },
{.code = LM_ERR_CtxRootNULL, .desc = _("root path is not set with in the ctx") },

View File

@ -12,8 +12,10 @@ int lm_package_data_handler(void *_data, const char *_section, const char *_key,
lm_pkg_data_t *data = _data;
if(NULL == data->name){
if(!package_name_valid(section))
if(!package_name_valid(section)){
lm_error_set(LM_ERR_PkgBadName);
return 0;
}
data->name = strdup(section);
}
@ -24,8 +26,10 @@ int lm_package_data_handler(void *_data, const char *_section, const char *_key,
data->desc = strdup(value);
else if(eq(key, PKG_DATA_VERSION)){
if(!package_version_valid(value))
if(!package_version_valid(value)){
lm_error_set(LM_ERR_PkgBadVersion);
return 0;
}
data->version = strdup(value);
}
@ -47,13 +51,26 @@ int lm_package_data_handler(void *_data, const char *_section, const char *_key,
bool lm_package_data_load(lm_pkg_data_t *data, char *file){
lm_package_data_free(data);
lm_error_clear();
if (ini_parse(file, lm_package_data_handler, data) < 0) {
lm_error_set(LM_ERR_PkgDataBad);
return false;
}
return true;
if(LM_ERR_NoError != lm_error())
return false;
if(NULL == data->name)
lm_error_set(LM_ERR_PkgDataMissing, "name");
else if(NULL == data->desc)
lm_error_set(LM_ERR_PkgDataMissing, "desc");
else if(NULL == data->version)
lm_error_set(LM_ERR_PkgDataMissing, "version");
else if(0 == data->size)
lm_error_set(LM_ERR_PkgDataMissing, "size");
return LM_ERR_NoError == lm_error();
}
void lm_package_data_free(lm_pkg_data_t *data){
@ -62,5 +79,5 @@ void lm_package_data_free(lm_pkg_data_t *data){
free(data->version);
lm_package_data_depend_free(data);
lm_package_data_keep_free(data);
bzero(&data, sizeof(lm_pkg_data_t));
bzero(data, sizeof(lm_pkg_data_t));
}

View File

@ -15,7 +15,7 @@ bool lm_pool_list_load(lm_pool_t *pool, char *dir){
lm_error_set(LM_ERR_ArgNULL);
return false;
}
lm_pool_list_free(pool);
if(lm_pool_path_is_empty(pool)){
@ -52,7 +52,7 @@ bool lm_pool_list_load(lm_pool_t *pool, char *dir){
lm_error_set(LM_ERR_PoolListDirFail);
goto end;
}
while((ent = readdir(dirfd)) != NULL){
if(eq(ent->d_name, "..") || eq(ent->d_name, "."))
continue;
@ -60,21 +60,29 @@ bool lm_pool_list_load(lm_pool_t *pool, char *dir){
ent_len = strlen(ent->d_name);
char datap[ent_len+list_dir_len+10];
join_multiple(datap, dir, ent->d_name, "DATA");
lm_pkg_t *pkg = lm_package_new();
if(!lm_package_data_load(&pkg->data, datap)){
pdebug(__func__, "(%s) failed to load new package from %s", pool->name, datap);
pdebug(__func__, "(%s) failed to load new package from %s: %s", pool->name, datap, lm_strerror());
if(NULL != pkg->data.name){
char *suberr = lm_strerror_dup();
lm_error_set(LM_ERR_PoolListDataFail, pkg->data.name, suberr);
free(suberr);
}
lm_package_free(pkg);
continue;
goto end;
}
if(!lm_pool_package_add(pool, pkg)){
pdebug(__func__, "(%s) failed to add new package: %s", pool->name, pkg->data.name);
pdebug(__func__, "(%s) failed to add package %s: %s", pool->name, pkg->data.name, lm_strerror());
char *suberr = lm_strerror_dup();
lm_error_set(LM_ERR_PoolListAddFail, pkg->data.name, suberr);
free(suberr);
lm_package_free(pkg);
continue;
goto end;
}
pdebug(__func__, "(%s) added new package: %s", pool->name, pkg->data.name);
}
@ -127,7 +135,7 @@ bool lm_pool_list_download(lm_pool_t *pool, char *dir, lm_mptp_transfer_callback
pdebug(__func__, "list file request failed for %s: %s", pool->name, lm_strerror());
goto end;
}
if(!lm_mptp_recvfile(sock, pool->list_file, callback, data)){
pdebug(__func__, "recvfile failed for %s: %s", pool->name, lm_strerror());
goto end;

View File

@ -282,16 +282,8 @@ bool mkdir_ifnot(char *path, int mode) {
return !(mkdir(path, mode) < 0 && errno != EEXIST);
}
bool package_name_valid(char *name) {
for (char *c = name; *c != 0; c++) {
if (!is_digit(*c) && !is_letter(*c) && *c != '-' && *c != '.')
return false;
}
return true;
}
bool package_version_valid(char *version) {
for (char *c = version; *c != 0; c++) {
bool __package_field_valid(char *field) {
for (char *c = field; *c != 0; c++) {
if (!is_digit(*c) && !is_letter(*c) && *c != '-' && *c != '+' && *c != '.')
return false;
}