diff --git a/src/lib66/exec/ssexec_init.c b/src/lib66/exec/ssexec_init.c index 211ba5d66c5e0915e1c677fefac4ab095fde6c15..3e65fbbc6a0f92a2d3fb924a10bb84c6b5fb5527 100644 --- a/src/lib66/exec/ssexec_init.c +++ b/src/lib66/exec/ssexec_init.c @@ -142,7 +142,7 @@ int ssexec_init(int argc, char const *const *argv, ssexec_t *info) int r ; uint8_t earlier = 0 ; char const *treename = 0 ; - char const *exclude[2] = { SS_MASTER + 1 , 0 } ; + stralloc sa = STRALLOC_ZERO ; @@ -150,9 +150,8 @@ int ssexec_init(int argc, char const *const *argv, ssexec_t *info) log_usage(usage_init) ; treename = argv[1] ; - size_t treenamelen = strlen(treename) ; - size_t treelen = info->base.len + SS_SYSTEM_LEN + 1 + treenamelen + SS_SVDIRS_LEN + SS_RESOLVE_LEN ; + size_t treelen = info->base.len + SS_SYSTEM_LEN + 1 + treenamelen + 1 ; char tree[treelen + 1] ; auto_strings(tree, info->base.s, SS_SYSTEM, "/", treename) ; @@ -170,9 +169,7 @@ int ssexec_init(int argc, char const *const *argv, ssexec_t *info) r = svc_scandir_ok(info->scandir.s) ; if (r != 1) earlier = 1 ; - auto_strings(tree + info->base.len + SS_SYSTEM_LEN + 1 + treenamelen, SS_SVDIRS, SS_RESOLVE) ; - - if (!sastr_dir_get(&sa, tree, exclude, S_IFREG)) + if (!resolve_get_field_tosa_g(&sa, info->base.s, treename, DATA_TREE, E_RESOLVE_TREE_CONTENTS)) log_dieu(LOG_EXIT_SYS, "get services list from tree: ", treename) ; if (sa.len) { diff --git a/src/lib66/parse/parse_service.c b/src/lib66/parse/parse_service.c index 2d6234f99072c22ff3573dd7ea23ab4a75c54809..d5a5beebfca6aeb331b9ba502c80ab32931a748e 100644 --- a/src/lib66/parse/parse_service.c +++ b/src/lib66/parse/parse_service.c @@ -34,6 +34,7 @@ #include <66/state.h> #include <66/resolve.h> #include <66/service.h> +#include <66/tree.h> parse_mill_t MILL_GET_SECTION_NAME = \ { \ @@ -69,7 +70,7 @@ parse_mill_t MILL_GET_VALUE = \ * At the end, i think that good API to know/acknowledge of a global system state changes should be provide. After all, handling events will appear in the future. * * - * */ + * void service_master_modify_contents(resolve_service_t *res, resolve_service_master_enum_t ENUM) { stralloc sa = STRALLOC_ZERO ; @@ -171,6 +172,54 @@ void service_master_modify_contents(resolve_service_t *res, resolve_service_mast stralloc_free(&sa) ; resolve_free(wres) ; } +*/ + +static void service_notify_add_string(stralloc *sa, char const *name, char const *str) +{ + if (!sastr_clean_string(sa, str)) + log_dieu(LOG_EXIT_SYS, "clean string") ; + + if (!sastr_add_string(sa, name)) + log_dieu(LOG_EXIT_SYS, "clean string") ; + + if (!sastr_sortndrop_element(sa)) + log_dieu(LOG_EXIT_SYS, "sort string") ; +} + +static void service_notify_tree(char const *name, char const *base, char const *treename, uint8_t field) +{ + resolve_tree_t tres = RESOLVE_TREE_ZERO ; + resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE, &tres) ; + stralloc sa = STRALLOC_ZERO ; + + log_trace("modify field contents of resolve tree file: ", treename) ; + + if (!resolve_read_g(wres, base, treename)) + log_dieusys(LOG_EXIT_SYS, "read resolve file of tree: ", treename) ; + + if (field == E_RESOLVE_TREE_CONTENTS) { + + if (tres.ncontents) + service_notify_add_string(&sa, name, tres.sa.s + tres.contents) ; + else if (!sastr_add_string(&sa, name)) + log_dieu(LOG_EXIT_SYS, "add string") ; + + tres.ncontents += 1 ; + } else goto freed ; + + if (!sastr_rebuild_in_oneline(&sa)) + log_dieu(LOG_EXIT_SYS, "rebuild stralloc list") ; + + if (!resolve_modify_field(wres, field, sa.s)) + log_dieusys(LOG_EXIT_SYS, "modify resolve file of: ", treename) ; + + if (!resolve_write_g(wres, base, treename)) + log_dieusys(LOG_EXIT_SYS, "write resolve file of tree: ", treename) ; + + freed : + stralloc_free(&sa) ; + resolve_free(wres) ; +} void parse_service(char const *sv, ssexec_t *info, uint8_t force, uint8_t conf) { @@ -206,7 +255,8 @@ void parse_service(char const *sv, ssexec_t *info, uint8_t force, uint8_t conf) if (!state_write(&sta, ares[pos].sa.s + ares[pos].path.home, ares[pos].sa.s + ares[pos].logger.name)) log_dieu(LOG_EXIT_SYS, "write state file of: ", ares[pos].sa.s + ares[pos].logger.name) ; - service_master_modify_contents(&ares[pos], E_RESOLVE_SERVICE_MASTER_CONTENTS) ; + //service_master_modify_contents(&ares[pos], E_RESOLVE_SERVICE_MASTER_CONTENTS) ; + service_notify_tree(ares[pos].sa.s + ares[pos].name, info->base.s, ares[pos].sa.s + ares[pos].treename, E_RESOLVE_TREE_CONTENTS) ; log_info("Parsed successfully: ", ares[pos].sa.s + ares[pos].name, " at tree: ", ares[pos].sa.s + ares[pos].treename) ; }