From c8862abe23a59d5a34f1996e4113517c7ebcfa85 Mon Sep 17 00:00:00 2001 From: obarun <eric@obarun.org> Date: Wed, 12 Jan 2022 19:09:54 +1100 Subject: [PATCH] split tree Master resolve file to an independent file --- src/66/66-inresolve.c | 55 ++++--- src/include/66/resolve.h | 3 +- src/include/66/tree.h | 51 +++++-- src/lib66/resolve.c | 51 +++++-- src/lib66/ssexec_tree.c | 48 +++---- src/lib66/tree_resolve.c | 301 +++++++++++++++++++++++++++------------ 6 files changed, 358 insertions(+), 151 deletions(-) diff --git a/src/66/66-inresolve.c b/src/66/66-inresolve.c index 1ba06a44..5179d7ea 100644 --- a/src/66/66-inresolve.c +++ b/src/66/66-inresolve.c @@ -301,6 +301,8 @@ int main(int argc, char const *const *argv) } else { + uint8_t master = 0 ; + char tree_buf[MAXOPTS][INFO_FIELD_MAXLEN] = { "Name", "Depends" , @@ -319,8 +321,19 @@ int main(int argc, char const *const *argv) "Disen", "Nenabled" } ; + resolve_wrapper_t_ref wres = 0 ; resolve_tree_t tres = RESOLVE_TREE_ZERO ; - resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE, &tres) ; + resolve_tree_master_t mres = RESOLVE_TREE_MASTER_ZERO ; + + if (!strcmp(svname, SS_MASTER + 1)) { + + master = 1 ; + wres = resolve_set_struct(DATA_TREE_MASTER, &mres) ; + + } else { + + wres = resolve_set_struct(DATA_TREE, &tres) ; + } if (!set_ownersysdir(&src, getuid())) log_dieusys(LOG_EXIT_SYS, "set owner directory") ; @@ -340,22 +353,30 @@ int main(int argc, char const *const *argv) info_field_align(tree_buf,fields,field_suffix,MAXOPTS) ; - info_display_string(fields[0],tres.sa.s + tres.name) ; - info_display_string(fields[1],tres.sa.s + tres.depends) ; - info_display_string(fields[2],tres.sa.s + tres.requiredby) ; - info_display_string(fields[3],tres.sa.s + tres.allow) ; - info_display_string(fields[4],tres.sa.s + tres.groups) ; - info_display_string(fields[5],tres.sa.s + tres.contents) ; - info_display_string(fields[6],tres.sa.s + tres.enabled) ; - info_display_string(fields[7],tres.sa.s + tres.current) ; - info_display_int(fields[8],tres.ndepends) ; - info_display_int(fields[9],tres.nrequiredby) ; - info_display_int(fields[10],tres.nallow) ; - info_display_int(fields[11],tres.ngroups) ; - info_display_int(fields[12],tres.ncontents) ; - info_display_int(fields[13],tres.init) ; - info_display_int(fields[14],tres.disen) ; - info_display_int(fields[15],tres.nenabled) ; + if (!master) { + + info_display_string(fields[0],tres.sa.s + tres.name) ; + info_display_string(fields[1],tres.sa.s + tres.depends) ; + info_display_string(fields[2],tres.sa.s + tres.requiredby) ; + info_display_string(fields[3],tres.sa.s + tres.allow) ; + info_display_string(fields[4],tres.sa.s + tres.groups) ; + info_display_string(fields[5],tres.sa.s + tres.contents) ; + info_display_int(fields[8],tres.ndepends) ; + info_display_int(fields[9],tres.nrequiredby) ; + info_display_int(fields[10],tres.nallow) ; + info_display_int(fields[11],tres.ngroups) ; + info_display_int(fields[12],tres.ncontents) ; + info_display_int(fields[13],tres.init) ; + info_display_int(fields[14],tres.disen) ; + + } else { + + info_display_string(fields[0],mres.sa.s + mres.name) ; + info_display_string(fields[3],mres.sa.s + mres.allow) ; + info_display_string(fields[6],mres.sa.s + mres.enabled) ; + info_display_string(fields[7],mres.sa.s + mres.current) ; + info_display_int(fields[15],mres.nenabled) ; + } resolve_free(wres) ; diff --git a/src/include/66/resolve.h b/src/include/66/resolve.h index c4ddcc8c..dacea9be 100644 --- a/src/include/66/resolve.h +++ b/src/include/66/resolve.h @@ -52,7 +52,8 @@ struct resolve_wrapper_s #define RESOLVE_SET_SAWRES(wres) \ stralloc_ref sawres = 0 ; \ if (wres->type == DATA_SERVICE) sawres = (&((resolve_service_t *)wres->obj)->sa) ; \ - else if (wres->type == DATA_TREE) sawres = (&((resolve_tree_t *)wres->obj)->sa) ; + else if (wres->type == DATA_TREE) sawres = (&((resolve_tree_t *)wres->obj)->sa) ; \ + else if (wres->type == DATA_TREE_MASTER) sawres = (&((resolve_tree_master_t *)wres->obj)->sa) ; #endif /** * diff --git a/src/include/66/tree.h b/src/include/66/tree.h index ca1a5830..df40bf5a 100644 --- a/src/include/66/tree.h +++ b/src/include/66/tree.h @@ -26,6 +26,7 @@ #define DATA_TREE 1 +#define DATA_TREE_MASTER 2 #define TREE_GROUPS_BOOT "boot" #define TREE_GROUPS_BOOT_LEN (sizeof TREE_GROUPS_BOOT - 1) #define TREE_GROUPS_ADM "admin" @@ -33,7 +34,6 @@ #define TREE_GROUPS_USER "user" #define TREE_GROUPS_USER_LEN (sizeof TREE_GROUPS_USER - 1) - typedef struct resolve_tree_s resolve_tree_t, *resolve_tree_t_ref ; struct resolve_tree_s { @@ -46,9 +46,6 @@ struct resolve_tree_s uint32_t allow ; uint32_t groups ; uint32_t contents ; - // for the master - uint32_t enabled ; //string of all enabled tree - uint32_t current ;//name of the current tree, only available and used on Master resolve file uint32_t ndepends ; uint32_t nrequiredby ; @@ -58,10 +55,8 @@ struct resolve_tree_s uint32_t init ;//not initialized->0, initialized->1 uint32_t disen ;//disable->0, enable->1 - // for the master - uint32_t nenabled ; //nbre of enabled tree } ; -#define RESOLVE_TREE_ZERO { 0,STRALLOC_ZERO,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } +#define RESOLVE_TREE_ZERO { 0,STRALLOC_ZERO,0,0,0,0,0,0,0,0,0,0,0,0,0 } typedef enum resolve_tree_enum_e resolve_tree_enum_t, *resolve_tree_enum_t_ref; enum resolve_tree_enum_e @@ -72,8 +67,6 @@ enum resolve_tree_enum_e TREE_ENUM_ALLOW, TREE_ENUM_GROUPS, TREE_ENUM_CONTENTS, - TREE_ENUM_ENABLED, - TREE_ENUM_CURRENT, TREE_ENUM_NDEPENDS, TREE_ENUM_NREQUIREDBY, TREE_ENUM_NALLOW, @@ -81,7 +74,6 @@ enum resolve_tree_enum_e TREE_ENUM_NCONTENTS, TREE_ENUM_INIT, TREE_ENUM_DISEN, - TREE_ENUM_NENABLED, TREE_ENUM_ENDOFKEY } ; @@ -93,6 +85,35 @@ struct resolve_tree_field_table_s extern resolve_tree_field_table_t resolve_tree_field_table[] ; +typedef struct resolve_tree_master_s resolve_tree_master_t, *resolve_tree_master_t_ref ; +struct resolve_tree_master_s +{ + uint32_t salen ; + stralloc sa ; + + uint32_t name ; + uint32_t allow ; + uint32_t enabled ; + uint32_t current ; + + uint32_t nenabled ; + +} ; +#define RESOLVE_TREE_MASTER_ZERO { 0,STRALLOC_ZERO,0,0,0,0,0 } + +typedef enum resolve_tree_master_enum_e resolve_tree_master_enum_t, *resolve_tree_master_enum_t_ref; +enum resolve_tree_master_enum_e +{ + TREE_ENUM_MASTER_NAME = 0, + TREE_ENUM_MASTER_ALLOW, + TREE_ENUM_MASTER_ENABLED, + TREE_ENUM_MASTER_CURRENT, + TREE_ENUM_MASTER_NENABLED, + TREE_ENUM_MASTER_ENDOFKEY +} ; + +extern resolve_tree_field_table_t resolve_tree_master_field_table[] ; + typedef struct tree_seed_s tree_seed_t, tree_seed_t_ref ; struct tree_seed_s { @@ -173,13 +194,21 @@ extern int tree_switch_current(char const *base, char const *tree) ; * * */ +/** tree */ 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) ; -extern int tree_resolve_create_master(char const *base, uid_t owner) ; extern int tree_resolve_modify_field(resolve_tree_t *tres, uint8_t field, char const *data) ; extern int tree_resolve_field_tosa(stralloc *sa, resolve_tree_t *tres, resolve_tree_enum_t field) ; +/** Master */ +extern int tree_read_master_cdb(cdb *c, resolve_tree_master_t *mres) ; +extern int tree_write_master_cdb(cdbmaker *c, resolve_tree_master_t *mres) ; +extern int tree_resolve_master_create(char const *base, uid_t owner) ; +extern int tree_resolve_master_copy(resolve_tree_master_t *dst, resolve_tree_master_t *mres) ; +extern int tree_resolve_master_modify_field(resolve_tree_master_t *mres, uint8_t field, char const *data) ; +extern int tree_resolve_master_field_tosa(stralloc *sa, resolve_tree_master_t *mres, resolve_tree_master_enum_t field) ; + /** * * Seed API diff --git a/src/lib66/resolve.c b/src/lib66/resolve.c index 214c2164..2fc670d7 100644 --- a/src/lib66/resolve.c +++ b/src/lib66/resolve.c @@ -141,6 +141,15 @@ int resolve_append(genalloc *ga, resolve_wrapper_t *wres) if (!genalloc_append(resolve_tree_t, ga, &cp)) goto err ; + } else if (wres->type == DATA_TREE_MASTER) { + + resolve_tree_master_t cp = RESOLVE_TREE_MASTER_ZERO ; + + if (!tree_resolve_master_copy(&cp, ((resolve_tree_master_t *)wres->obj))) + goto err ; + + if (!genalloc_append(resolve_tree_master_t, ga, &cp)) + goto err ; } e = 1 ; @@ -269,7 +278,7 @@ int resolve_modify_field(resolve_wrapper_t_ref wres, uint8_t field, char const * if (!service_resolve_modify_field(res, field, by)) goto err ; - } else if (wres-> type == DATA_TREE) { + } else if (wres->type == DATA_TREE) { resolve_tree_t_ref res = (resolve_tree_t *)wres->obj ; mwres = resolve_set_struct(DATA_TREE, res) ; @@ -279,7 +288,17 @@ int resolve_modify_field(resolve_wrapper_t_ref wres, uint8_t field, char const * if (!tree_resolve_modify_field(res, field, by)) goto err ; + } else if (wres->type == DATA_TREE_MASTER) { + + resolve_tree_master_t_ref res = (resolve_tree_master_t *)wres->obj ; + mwres = resolve_set_struct(DATA_TREE_MASTER, res) ; + + log_trace("modify field ", resolve_tree_master_field_table[field].field," of inner resolve file of trees with value: ", by) ; + + if (!tree_resolve_master_modify_field(res, field, by)) + goto err ; } + e = 1 ; err: free(mwres) ; @@ -291,27 +310,23 @@ int resolve_modify_field_g(resolve_wrapper_t_ref wres, char const *base, char co log_flow() ; - size_t baselen = strlen(base), tot = 0, treelen = 0 ; + size_t baselen = strlen(base), tot = baselen + SS_SYSTEM_LEN + 1, treelen = 0 ; char *treename = 0 ; if (wres->type == DATA_SERVICE) { + treename = ((resolve_service_t *)wres->obj)->sa.s + ((resolve_service_t *)wres->obj)->treename ; + treelen = strlen(treename) ; + tot += treelen + SS_SVDIRS_LEN + 1 ; - treelen = strlen(((resolve_service_t *)wres->obj)->sa.s + ((resolve_service_t *)wres->obj)->treename) ; - tot = baselen + SS_SYSTEM_LEN + 1 + treelen + SS_SVDIRS_LEN + 1 ; - - } else { - - tot = baselen + SS_SYSTEM_LEN + 1 ; } char solve[tot] ; if (wres->type == DATA_SERVICE) { - treename = ((resolve_service_t *)wres->obj)->sa.s + ((resolve_service_t *)wres->obj)->treename ; auto_strings(solve, base, SS_SYSTEM, "/", treename, SS_SVDIRS) ; - } else { + } else if (wres->type == DATA_TREE || wres->type == DATA_TREE_MASTER) { auto_strings(solve, base, SS_SYSTEM) ; } @@ -365,6 +380,13 @@ void resolve_deep_free(uint8_t type, genalloc *g) stralloc_free(&genalloc_s(resolve_tree_t, g)[pos].sa) ; genalloc_free(resolve_tree_t, g) ; + + } else if (type == DATA_TREE_MASTER) { + + for (; pos < genalloc_len(resolve_tree_master_t, g) ; pos++) + stralloc_free(&genalloc_s(resolve_tree_master_t, g)[pos].sa) ; + + genalloc_free(resolve_tree_master_t, g) ; } } @@ -403,6 +425,10 @@ int resolve_read_cdb(resolve_wrapper_t *wres, char const *name) if (!tree_read_cdb(&c, ((resolve_tree_t *)wres->obj))) goto err ; + } else if (wres->type == DATA_TREE_MASTER) { + + if (!tree_read_master_cdb(&c, ((resolve_tree_master_t *)wres->obj))) + goto err ; } e = 1 ; @@ -449,6 +475,11 @@ int resolve_write_cdb(resolve_wrapper_t *wres, char const *dst, char const *name if (!tree_write_cdb(&c, ((resolve_tree_t *)wres->obj))) goto err ; + } else if (wres->type == DATA_TREE_MASTER) { + + if (!tree_write_master_cdb(&c, ((resolve_tree_master_t *)wres->obj))) + goto err ; + } if (!cdbmake_finish(&c) || fsync(fd) < 0) { diff --git a/src/lib66/ssexec_tree.c b/src/lib66/ssexec_tree.c index ba21427c..5bb047b1 100644 --- a/src/lib66/ssexec_tree.c +++ b/src/lib66/ssexec_tree.c @@ -300,12 +300,12 @@ void sanitize_system(ssexec_t *info) auto_strings(dst + baselen + SS_SYSTEM_LEN + SS_RESOLVE_LEN, SS_MASTER) ; if (!scan_mode(dst, S_IFREG)) - if (!tree_resolve_create_master(info->base.s, info->owner)) + if (!tree_resolve_master_create(info->base.s, info->owner)) log_dieu(LOG_EXIT_SYS, "write resolve file of inner tree") ; auto_strings(dst + baselen, SS_TREE_CURRENT) ; auto_check(dst) ; - auto_strings(dst + baselen,SS_SYSTEM, SS_BACKUP) ; + auto_strings(dst + baselen, SS_SYSTEM, SS_BACKUP) ; auto_check(dst) ; } @@ -633,7 +633,7 @@ void create_tree(ssexec_t *info) auto_create(dst, SS_RESOLVE, newlen) ; dst[newlen] = 0 ; - if (!service_resolve_create_master(info->base.s, info->treename.s)) + if (!service_resolve_master_create(info->base.s, info->treename.s)) log_dieusys_nclean(LOG_EXIT_SYS,&cleanup,"write resolve file of inner bundle") ; auto_strings(sym,dst, "/", SS_SYM_SVC) ; @@ -810,28 +810,28 @@ void tree_master_enable_disable(char const *base, char const *treename, uint8_t size_t pos = 0, nb = 0, baselen = strlen(base), len = 0 ; stralloc sa = STRALLOC_ZERO ; - resolve_tree_t tres = RESOLVE_TREE_ZERO ; - resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE, &tres) ; + resolve_tree_master_t mres = RESOLVE_TREE_MASTER_ZERO ; + resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE_MASTER, &mres) ; char solve[baselen + SS_SYSTEM_LEN + 1] ; log_trace(!action ? "disable" : "enable"," tree: ", treename, " from: ", SS_MASTER + 1) ; auto_strings(solve, base, SS_SYSTEM) ; - if (!resolve_read(wres, solve, SS_MASTER)) - log_dieusys(LOG_EXIT_SYS, "read resolve file of inner tree") ; + if (!resolve_read(wres, solve, SS_MASTER + 1)) + log_dieusys(LOG_EXIT_SYS, "read inner resolve file of trees") ; - if (!tres.nenabled && action) { - if (!resolve_modify_field(wres, TREE_ENUM_ENABLED, treename)) - log_dieusys(LOG_EXIT_SYS, "modify resolve file of: ", SS_MASTER + 1) ; + if (!mres.nenabled && action) { + if (!resolve_modify_field(wres, TREE_ENUM_MASTER_ENABLED, treename)) + log_dieusys(LOG_EXIT_SYS, "modify inner resolve file of trees") ; - tres.nenabled = 1 ; + mres.nenabled = 1 ; goto write ; } - if (tres.nenabled) { + if (mres.nenabled) { - if (!sastr_clean_string(&sa, tres.sa.s + tres.enabled)) + if (!sastr_clean_string(&sa, mres.sa.s + mres.enabled)) log_dieu(LOG_EXIT_SYS, "clean string") ; len = sa.len ; @@ -867,15 +867,15 @@ void tree_master_enable_disable(char const *base, char const *treename, uint8_t if (!stralloc_0(&sa)) log_die_nomem("stralloc") ; - if (!resolve_modify_field(wres, TREE_ENUM_ENABLED, sa.s)) + if (!resolve_modify_field(wres, TREE_ENUM_MASTER_ENABLED, sa.s)) log_dieusys(LOG_EXIT_SYS, "modify resolve file of: ", SS_MASTER + 1) ; - tres.nenabled = nb ; + mres.nenabled = nb ; } write: if (!resolve_write(wres, solve, SS_MASTER + 1)) - log_dieusys(LOG_EXIT_SYS, "read resolve file of inner tree") ; + log_dieusys(LOG_EXIT_SYS, "write inner resolve file of trees") ; resolve_free(wres) ; stralloc_free(&sa) ; @@ -1316,7 +1316,7 @@ void tree_clone(char const *clone, ssexec_t *info) int r ; resolve_service_t res = RESOLVE_SERVICE_ZERO ; - resolve_tree_t tres = RESOLVE_TREE_ZERO ; + resolve_tree_master_t mres = RESOLVE_TREE_MASTER_ZERO ; resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ; stralloc sa = STRALLOC_ZERO ; char const *exclude[1] = { 0 } ; @@ -1441,19 +1441,19 @@ void tree_clone(char const *clone, ssexec_t *info) resolve_free(wres) ; - wres = resolve_set_struct(DATA_TREE, &tres) ; + wres = resolve_set_struct(DATA_TREE_MASTER, &mres) ; if (!resolve_read(wres, system, info->treename.s)) - log_dieusys_nclean(LOG_EXIT_SYS,&cleanup,"read resolve file of: ", system, "/", info->treename.s) ; + log_dieusys_nclean(LOG_EXIT_SYS,&cleanup,"read inner resolve file of trees") ; - if (!resolve_modify_field(wres, TREE_ENUM_ENABLED, 0) || - !resolve_modify_field(wres, TREE_ENUM_NAME, clone)) - log_dieusys(LOG_EXIT_SYS, "modify resolve file of: ", clone) ; + if (!resolve_modify_field(wres, TREE_ENUM_MASTER_ENABLED, 0) || + !resolve_modify_field(wres, TREE_ENUM_MASTER_NAME, clone)) + log_dieusys(LOG_EXIT_SYS, "modify inner resolve file of trees") ; - tres.disen = 0 ; + mres.nenabled = 0 ; if (!resolve_write(wres, system, clone)) - log_dieusys_nclean(LOG_EXIT_SYS, &cleanup, "write resolve file of: ", system, "/", clone) ; + log_dieusys_nclean(LOG_EXIT_SYS, &cleanup, "write inner resolve file of trees") ; resolve_free(wres) ; diff --git a/src/lib66/tree_resolve.c b/src/lib66/tree_resolve.c index e36f3ba2..4c8f29fb 100644 --- a/src/lib66/tree_resolve.c +++ b/src/lib66/tree_resolve.c @@ -39,8 +39,6 @@ resolve_tree_field_table_t resolve_tree_field_table[] = { [TREE_ENUM_ALLOW] = { .field = "allow" }, [TREE_ENUM_GROUPS] = { .field = "groups" }, [TREE_ENUM_CONTENTS] = { .field = "contents" }, - [TREE_ENUM_ENABLED] = { .field = "enabled" }, - [TREE_ENUM_CURRENT] = { .field = "current" }, [TREE_ENUM_NDEPENDS] = { .field = "ndepends" }, [TREE_ENUM_NREQUIREDBY] = { .field = "nrequiredby" }, [TREE_ENUM_NALLOW] = { .field = "nallow" }, @@ -48,10 +46,19 @@ resolve_tree_field_table_t resolve_tree_field_table[] = { [TREE_ENUM_NCONTENTS] = { .field = "ncontents" }, [TREE_ENUM_INIT] = { .field = "init" }, [TREE_ENUM_DISEN] = { .field = "disen" }, - [TREE_ENUM_NENABLED] = { .field = "nenabled" }, [TREE_ENUM_ENDOFKEY] = { .field = 0 } } ; +resolve_tree_field_table_t resolve_tree_master_field_table[] = { + + [TREE_ENUM_MASTER_NAME] = { .field = "name" }, + [TREE_ENUM_MASTER_ALLOW] = { .field = "allow" }, + [TREE_ENUM_MASTER_ENABLED] = { .field = "enabled" }, + [TREE_ENUM_MASTER_CURRENT] = { .field = "current" }, + [TREE_ENUM_MASTER_NENABLED] = { .field = "nenabled" }, + [TREE_ENUM_MASTER_ENDOFKEY] = { .field = 0 } +} ; + int tree_read_cdb(cdb *c, resolve_tree_t *tres) { log_flow() ; @@ -60,7 +67,7 @@ int tree_read_cdb(cdb *c, resolve_tree_t *tres) resolve_wrapper_t_ref wres ; uint32_t x ; - wres = resolve_set_struct(DATA_SERVICE, tres) ; + wres = resolve_set_struct(DATA_TREE, tres) ; resolve_init(wres) ; @@ -88,14 +95,6 @@ int tree_read_cdb(cdb *c, resolve_tree_t *tres) resolve_find_cdb(&tmp,c,"contents") ; tres->contents = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ; - /* enabled */ - resolve_find_cdb(&tmp,c,"enabled") ; - tres->enabled = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ; - - /* current */ - resolve_find_cdb(&tmp,c,"current") ; - tres->current = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ; - /* ndepends */ x = resolve_find_cdb(&tmp,c,"ndepends") ; tres->ndepends = x ; @@ -124,10 +123,6 @@ int tree_read_cdb(cdb *c, resolve_tree_t *tres) x = resolve_find_cdb(&tmp,c,"disen") ; tres->disen = x ; - /* nenabled */ - x = resolve_find_cdb(&tmp,c,"nenabled") ; - tres->nenabled = x ; - free(wres) ; stralloc_free(&tmp) ; @@ -158,12 +153,6 @@ int tree_write_cdb(cdbmaker *c, resolve_tree_t *tres) /* contents */ !resolve_add_cdb(c,"contents",str + tres->contents) || - /* enabled */ - !resolve_add_cdb(c,"enabled",str + tres->enabled) || - - /* current */ - !resolve_add_cdb(c,"current",str + tres->current) || - /* ndepends */ !resolve_add_cdb_uint(c,"ndepends",tres->ndepends) || @@ -183,10 +172,7 @@ int tree_write_cdb(cdbmaker *c, resolve_tree_t *tres) !resolve_add_cdb_uint(c,"init",tres->init) || /* disen */ - !resolve_add_cdb_uint(c,"disen",tres->disen) || - - /* nenabled */ - !resolve_add_cdb_uint(c,"nenabled",tres->nenabled)) return 0 ; + !resolve_add_cdb_uint(c,"disen",tres->disen)) return 0 ; return 1 ; } @@ -210,8 +196,6 @@ int tree_resolve_copy(resolve_tree_t *dst, resolve_tree_t *tres) dst->allow = tres->allow ; dst->groups = tres->groups ; dst->contents = tres->contents ; - dst->enabled = tres->enabled ; - dst->current = tres->current ; dst->ndepends = tres->ndepends ; dst->nrequiredby = tres->nrequiredby ; dst->nallow = tres->nallow ; @@ -219,47 +203,11 @@ int tree_resolve_copy(resolve_tree_t *dst, resolve_tree_t *tres) dst->ncontents = tres->ncontents ; dst->init = tres->init ; dst->disen = tres->disen ; - dst->nenabled = tres->nenabled ; return 1 ; } -int tree_resolve_create_master(char const *base, uid_t owner) -{ - int e = 0 ; - size_t baselen = strlen(base) ; - struct passwd *pw = getpwuid(owner) ; - resolve_tree_t tres = RESOLVE_TREE_ZERO ; - resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE, &tres) ; - char dst[baselen + SS_SYSTEM_LEN + 1] ; - - if (!pw) { - - if (!errno) - errno = ESRCH ; - goto err ; - } - - resolve_init(wres) ; - - auto_strings(dst, base, SS_SYSTEM) ; - - tres.name = resolve_add_string(wres, SS_MASTER + 1) ; - tres.allow = resolve_add_string(wres, pw->pw_name) ; - tres.groups = resolve_add_string(wres, owner ? TREE_GROUPS_USER : TREE_GROUPS_ADM) ; - - log_trace("write resolve file of inner tree") ; - if (!resolve_write(wres, dst, SS_MASTER + 1)) - goto err ; - - e = 1 ; - - err: - resolve_free(wres) ; - return e ; -} - int tree_resolve_modify_field(resolve_tree_t *tres, uint8_t field, char const *data) { log_flow() ; @@ -295,14 +243,6 @@ int tree_resolve_modify_field(resolve_tree_t *tres, uint8_t field, char const *d tres->contents = resolve_add_string(wres,data) ; break ; - case TREE_ENUM_ENABLED: - tres->enabled = resolve_add_string(wres,data) ; - break ; - - case TREE_ENUM_CURRENT: - tres->current = resolve_add_string(wres,data) ; - break ; - case TREE_ENUM_NDEPENDS: if (!uint0_scan(data, &ifield)) goto err ; tres->ndepends = ifield ; @@ -338,11 +278,6 @@ int tree_resolve_modify_field(resolve_tree_t *tres, uint8_t field, char const *d tres->disen = ifield ; break ; - case TREE_ENUM_NENABLED: - if (!uint0_scan(data, &ifield)) goto err ; - tres->nenabled = ifield ; - break ; - default: break ; } @@ -387,14 +322,6 @@ int tree_resolve_field_tosa(stralloc *sa, resolve_tree_t *tres, resolve_tree_enu ifield = tres->contents ; break ; - case TREE_ENUM_ENABLED: - ifield = tres->enabled ; - break ; - - case TREE_ENUM_CURRENT: - ifield = tres->current ; - break ; - case TREE_ENUM_NDEPENDS: ifield = tres->ndepends ; break ; @@ -423,15 +350,213 @@ int tree_resolve_field_tosa(stralloc *sa, resolve_tree_t *tres, resolve_tree_enu ifield = tres->disen ; break ; - case TREE_ENUM_NENABLED: - ifield = tres->nenabled ; + default: + return 0 ; + } + + if (!auto_stra(sa,tres->sa.s + ifield)) + return 0 ; + + return 1 ; +} + +/** Master */ +int tree_read_master_cdb(cdb *c, resolve_tree_master_t *mres) +{ + log_flow() ; + + stralloc tmp = STRALLOC_ZERO ; + resolve_wrapper_t_ref wres ; + uint32_t x ; + + wres = resolve_set_struct(DATA_TREE_MASTER, mres) ; + + resolve_init(wres) ; + + /* name */ + resolve_find_cdb(&tmp,c,"name") ; + mres->name = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ; + + /* allow */ + resolve_find_cdb(&tmp,c,"allow") ; + mres->allow = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ; + + /* enabled */ + resolve_find_cdb(&tmp,c,"enabled") ; + mres->enabled = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ; + + /* current */ + resolve_find_cdb(&tmp,c,"current") ; + mres->current = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ; + + /* nenabled */ + x = resolve_find_cdb(&tmp,c,"nenabled") ; + mres->nenabled = x ; + + free(wres) ; + stralloc_free(&tmp) ; + + return 1 ; +} + +int tree_write_master_cdb(cdbmaker *c, resolve_tree_master_t *mres) +{ + log_flow() ; + + char *str = mres->sa.s ; + + /* name */ + if (!resolve_add_cdb(c,"name",str + mres->name) || + + /* allow */ + !resolve_add_cdb(c,"allow",str + mres->allow) || + + /* enabled */ + !resolve_add_cdb(c,"enabled",str + mres->enabled) || + + /* current */ + !resolve_add_cdb(c,"current",str + mres->current) || + + /* nenabled */ + !resolve_add_cdb_uint(c,"nenabled",mres->nenabled)) return 0 ; + + return 1 ; +} + +int tree_resolve_master_create(char const *base, uid_t owner) +{ + int e = 0 ; + size_t baselen = strlen(base) ; + struct passwd *pw = getpwuid(owner) ; + resolve_tree_master_t mres = RESOLVE_TREE_MASTER_ZERO ; + resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE_MASTER, &mres) ; + char dst[baselen + SS_SYSTEM_LEN + 1] ; + + if (!pw) { + + if (!errno) + errno = ESRCH ; + goto err ; + } + + resolve_init(wres) ; + + auto_strings(dst, base, SS_SYSTEM) ; + + mres.name = resolve_add_string(wres, SS_MASTER + 1) ; + mres.allow = resolve_add_string(wres, pw->pw_name) ; + + log_trace("write inner resolve file of trees") ; + if (!resolve_write(wres, dst, SS_MASTER + 1)) + goto err ; + + e = 1 ; + + err: + resolve_free(wres) ; + return e ; +} + +int tree_resolve_master_copy(resolve_tree_master_t *dst, resolve_tree_master_t *mres) +{ + log_flow() ; + + stralloc_free(&dst->sa) ; + + size_t len = mres->sa.len - 1 ; + dst->salen = mres->salen ; + + if (!stralloc_catb(&dst->sa,mres->sa.s,len) || + !stralloc_0(&dst->sa)) + return 0 ; + + dst->name = mres->name ; + dst->allow = mres->allow ; + dst->enabled = mres->enabled ; + dst->current = mres->current ; + dst->nenabled = mres->nenabled ; + + return 1 ; + +} + +int tree_resolve_master_modify_field(resolve_tree_master_t *mres, uint8_t field, char const *data) +{ + log_flow() ; + + uint32_t ifield ; + int e = 0 ; + + resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE_MASTER, mres) ; + + switch(field) { + + case TREE_ENUM_MASTER_NAME: + mres->name = resolve_add_string(wres,data) ; + break ; + + case TREE_ENUM_MASTER_ALLOW: + mres->allow = resolve_add_string(wres,data) ; + break ; + + case TREE_ENUM_MASTER_ENABLED: + mres->enabled = resolve_add_string(wres,data) ; + break ; + + case TREE_ENUM_MASTER_CURRENT: + mres->current = resolve_add_string(wres,data) ; + break ; + + case TREE_ENUM_MASTER_NENABLED: + if (!uint0_scan(data, &ifield)) goto err ; + mres->nenabled = ifield ; + break ; + + default: + break ; + } + + e = 1 ; + + err: + free(wres) ; + return e ; + +} + +int tree_resolve_master_field_tosa(stralloc *sa, resolve_tree_master_t *mres, resolve_tree_master_enum_t field) +{ + log_flow() ; + + uint32_t ifield ; + + switch(field) { + + case TREE_ENUM_MASTER_NAME: + ifield = mres->name ; + break ; + + case TREE_ENUM_MASTER_ALLOW: + ifield = mres->name ; + break ; + + case TREE_ENUM_MASTER_ENABLED: + ifield = mres->enabled ; + break ; + + case TREE_ENUM_MASTER_CURRENT: + ifield = mres->current ; + break ; + + case TREE_ENUM_MASTER_NENABLED: + ifield = mres->nenabled ; break ; default: return 0 ; } - if (!auto_stra(sa,tres->sa.s + ifield)) + if (!auto_stra(sa,mres->sa.s + ifield)) return 0 ; return 1 ; -- GitLab