From df5898083dcd28b33ec3ace15cd942ce546c137b Mon Sep 17 00:00:00 2001 From: obarun <eric@obarun.org> Date: Sat, 4 Dec 2021 20:52:38 +1100 Subject: [PATCH] implement resolve API for a tree --- src/include/66/tree.h | 51 +++++++++++-- src/lib66/tree_resolve.c | 159 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 205 insertions(+), 5 deletions(-) create mode 100644 src/lib66/tree_resolve.c diff --git a/src/include/66/tree.h b/src/include/66/tree.h index e415f14a..e2398bab 100644 --- a/src/include/66/tree.h +++ b/src/include/66/tree.h @@ -18,12 +18,38 @@ #include <sys/types.h> #include <skalibs/stralloc.h> +#include <skalibs/cdb.h> +#include <skalibs/cdbmake.h> + #include <66/ssexec.h> +#define TREE_STRUCT 1 + +typedef struct resolve_tree_s resolve_tree_t, *resolve_tree_t_ref ; +struct resolve_tree_s +{ + uint32_t salen ; + stralloc sa ; + + uint32_t name ; + uint32_t depends ; + uint32_t requiredby ; + uint32_t allow ; + uint32_t contents ; + + uint32_t ndepends ; + uint32_t nrequiredby ; + uint32_t ncontents ; + uint32_t current ;//no->0, yes->1 + uint32_t init ;//not initialized->0, initialized->1 + uint32_t disen ;//disable->0, enable->1 +} ; +#define RESOLVE_TREE_ZERO { 0,STRALLOC_ZERO,0,0,0,0,0,0,0,0,0,0,0 } + extern stralloc saseed ; -typedef struct ss_tree_seed_s ss_tree_seed_t, ss_tree_seed_t_ref ; -struct ss_tree_seed_s +typedef struct tree_seed_s tree_seed_t, tree_seed_t_ref ; +struct tree_seed_s { int name ; int depends ; @@ -37,7 +63,6 @@ struct ss_tree_seed_s uint8_t nopts ; } ; - #define TREE_SEED_ZERO { -1, -1, -1, 0, -1, -1, 0, -1, -1, 0 } extern int tree_cmd_state(unsigned int verbosity,char const *cmd,char const *tree) ; @@ -65,8 +90,24 @@ extern int tree_switch_current(char const *base, char const *tree) ; extern int tree_isvalid(ssexec_t *info) ; -// seed +/** + * + * Resolve API + * + * */ + +extern int tree_read_cdb(cdb *c, resolve_tree_t *tres) ; +extern int tree_write_cdb(cdbmaker *c, resolve_tree_t *tres) ; +extern int tree_resolve_copy(resolve_tree_t *dst, resolve_tree_t *tres) ; + +/** + * + * Seed API + * + * */ + extern void tree_seed_free(void) ; -extern int tree_seed_setseed(ss_tree_seed_t *seed, char const *treename, uint8_t check_service) ; +extern int tree_seed_setseed(tree_seed_t *seed, char const *treename, uint8_t check_service) ; extern int tree_seed_isvalid(char const *seed) ; + #endif diff --git a/src/lib66/tree_resolve.c b/src/lib66/tree_resolve.c new file mode 100644 index 00000000..81ebe9ad --- /dev/null +++ b/src/lib66/tree_resolve.c @@ -0,0 +1,159 @@ +/* + * tree_resolve.c + * + * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org> + * + * All rights reserved. + * + * This file is part of Obarun. It is subject to the license terms in + * the LICENSE file found in the top-level directory of this + * distribution. + * This file may not be copied, modified, propagated, or distributed + * except according to the terms contained in the LICENSE file./ + */ + +#include <stdint.h> +#include <stddef.h> +#include <stdlib.h>//free + +#include <oblibs/log.h> + +#include <skalibs/stralloc.h> +#include <skalibs/cdbmake.h> +#include <skalibs/cdb.h> + +#include <66/tree.h> +#include <66/resolve.h> + +int tree_read_cdb(cdb *c, resolve_tree_t *tres) +{ + log_flow() ; + + stralloc tmp = STRALLOC_ZERO ; + resolve_wrapper_t_ref wres ; + uint32_t x ; + + wres = resolve_set_struct(SERVICE_STRUCT, tres) ; + + resolve_init(wres) ; + + /* name */ + resolve_find_cdb(&tmp,c,"name") ; + tres->name = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ; + + /* depends */ + resolve_find_cdb(&tmp,c,"depends") ; + tres->depends = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ; + + /* requiredby */ + resolve_find_cdb(&tmp,c,"requiredby") ; + tres->requiredby = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ; + + /* allow */ + resolve_find_cdb(&tmp,c,"allow") ; + tres->allow = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ; + + /* contents */ + resolve_find_cdb(&tmp,c,"contents") ; + tres->contents = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ; + + /* ndepends */ + x = resolve_find_cdb(&tmp,c,"ndepends") ; + tres->ndepends = x ; + + /* nrequiredby */ + x = resolve_find_cdb(&tmp,c,"nrequiredby") ; + tres->nrequiredby = x ; + + /* ncontents */ + x = resolve_find_cdb(&tmp,c,"ncontents") ; + tres->ncontents = x ; + + /* current */ + x = resolve_find_cdb(&tmp,c,"current") ; + tres->current = x ; + + /* init */ + x = resolve_find_cdb(&tmp,c,"init") ; + tres->init = x ; + + /* disen */ + x = resolve_find_cdb(&tmp,c,"disen") ; + tres->disen = x ; + + free(wres) ; + stralloc_free(&tmp) ; + + return 1 ; +} + +int tree_write_cdb(cdbmaker *c, resolve_tree_t *tres) +{ + log_flow() ; + + char *str = tres->sa.s ; + + /* name */ + if (!resolve_add_cdb(c,"name",str + tres->name) || + + /* depends */ + !resolve_add_cdb(c,"depends",str + tres->depends) || + + /* requiredby */ + !resolve_add_cdb(c,"requiredby",str + tres->requiredby) || + + /* allow */ + !resolve_add_cdb(c,"allow",str + tres->allow) || + + /* contents */ + !resolve_add_cdb(c,"contents",str + tres->contents) || + + /* ndepends */ + !resolve_add_cdb_uint(c,"ndepends",tres->ndepends) || + + /* nrequiredby */ + !resolve_add_cdb_uint(c,"nrequiredby",tres->nrequiredby) || + + /* ncontents */ + !resolve_add_cdb_uint(c,"ncontents",tres->ncontents) || + + /* current */ + !resolve_add_cdb_uint(c,"current",tres->current) || + + /* init */ + !resolve_add_cdb_uint(c,"init",tres->init) || + + /* disen */ + !resolve_add_cdb_uint(c,"disen",tres->disen)) return 0 ; + + return 1 ; +} + +int tree_resolve_copy(resolve_tree_t *dst, resolve_tree_t *tres) +{ + log_flow() ; + + stralloc_free(&dst->sa) ; + + size_t len = tres->sa.len - 1 ; + dst->salen = tres->salen ; + + if (!stralloc_catb(&dst->sa,tres->sa.s,len) || + !stralloc_0(&dst->sa)) + return 0 ; + + dst->name = tres->name ; + dst->depends = tres->depends ; + dst->requiredby = tres->requiredby ; + dst->allow = tres->allow ; + dst->contents = tres->contents ; + dst->ndepends = tres->ndepends ; + dst->nrequiredby = tres->nrequiredby ; + dst->ncontents = tres->ncontents ; + dst->current = tres->current ; + dst->init = tres->init ; + dst->disen = tres->disen ; + + return 1 ; + +} -- GitLab