From 39255381904edff0cee0781d24b2067076c7f93f Mon Sep 17 00:00:00 2001 From: obarun <eric@obarun.org> Date: Sun, 18 Jun 2023 00:17:06 +1100 Subject: [PATCH] simplify interface of service_is_g and its functionality, provide service_get_treename as replacement --- src/include/66/service.h | 3 +- src/lib66/exec/ssexec_env.c | 4 +-- src/lib66/exec/ssexec_reconfigure.c | 3 +- src/lib66/exec/ssexec_reload.c | 5 ++- src/lib66/exec/ssexec_resolve.c | 3 +- src/lib66/exec/ssexec_state.c | 3 +- src/lib66/exec/ssexec_status.c | 3 +- src/lib66/info/info_walk.c | 3 +- src/lib66/parse/parse_frontend.c | 3 +- src/lib66/sanitize/sanitize_source.c | 3 +- src/lib66/service/service_is_g.c | 51 +++++++++++++++++++++++----- 11 files changed, 56 insertions(+), 28 deletions(-) diff --git a/src/include/66/service.h b/src/include/66/service.h index fe26e010..bfb13812 100644 --- a/src/include/66/service.h +++ b/src/include/66/service.h @@ -305,7 +305,8 @@ extern int service_cmp_basedir(char const *dir) ; extern int service_endof_dir(char const *dir, char const *name) ; extern int service_frontend_path(stralloc *sasrc,char const *sv, uid_t owner,char const *directory_forced, char const **exclude) ; extern int service_frontend_src(stralloc *sasrc, char const *name, char const *src, char const **exclude) ; -extern int service_is_g(char *atree, char const *name, uint32_t flag) ; +extern int service_is_g(char const *name, uint32_t flag) ; +extern int service_get_treename(char *atree, char const *name, uint32_t flag) ; extern void service_resolve_array_free(resolve_service_t *ares, unsigned int areslen) ; extern int service_resolve_array_search(resolve_service_t *ares, unsigned int areslen, char const *name) ; extern int service_resolve_copy(resolve_service_t *dst, resolve_service_t *res) ; diff --git a/src/lib66/exec/ssexec_env.c b/src/lib66/exec/ssexec_env.c index d0cb5f2e..b4fbd8bc 100644 --- a/src/lib66/exec/ssexec_env.c +++ b/src/lib66/exec/ssexec_env.c @@ -218,8 +218,6 @@ int ssexec_env(int argc, char const *const *argv, ssexec_t *info) resolve_service_t res = RESOLVE_SERVICE_ZERO ; resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ; - char atree[SS_MAX_TREENAME + 1] ; - uint8_t todo = T_UNSET ; char const *sv = 0, *svconf = 0, *src = 0, *import = 0 ; @@ -300,7 +298,7 @@ int ssexec_env(int argc, char const *const *argv, ssexec_t *info) if (todo == T_UNSET && !import && !saversion.len && !eversion.len) todo = T_EDIT ; - r = service_is_g(atree, sv, STATE_FLAGS_ISPARSED) ; + r = service_is_g(sv, STATE_FLAGS_ISPARSED) ; if (r == -1) log_dieusys(LOG_EXIT_SYS, "get information of service: ", sv, " -- please a bug report") ; else if (!r || r == STATE_FLAGS_FALSE) { diff --git a/src/lib66/exec/ssexec_reconfigure.c b/src/lib66/exec/ssexec_reconfigure.c index d2515e54..0572da56 100644 --- a/src/lib66/exec/ssexec_reconfigure.c +++ b/src/lib66/exec/ssexec_reconfigure.c @@ -44,7 +44,6 @@ int ssexec_reconfigure(int argc, char const *const *argv, ssexec_t *info) unsigned int areslen = 0, list[SS_MAX_SERVICE + 1], visit[SS_MAX_SERVICE + 1], nservice = 0, n = 0 ; resolve_service_t ares[SS_MAX_SERVICE + 1] ; - char atree[SS_MAX_TREENAME + 1] ; FLAGS_SET(flag, STATE_FLAGS_TOPROPAGATE|STATE_FLAGS_TOPARSE|STATE_FLAGS_WANTUP) ; @@ -96,7 +95,7 @@ int ssexec_reconfigure(int argc, char const *const *argv, ssexec_t *info) if (!state_messenger(&ares[aresid], STATE_FLAGS_TOPARSE, STATE_FLAGS_TRUE)) log_dieusys(LOG_EXIT_SYS, "send message to state of: ", argv[n]) ; - r = service_is_g(atree, argv[n], STATE_FLAGS_ISSUPERVISED) ; + r = service_is_g(argv[n], STATE_FLAGS_ISSUPERVISED) ; if (r < 0) log_dieusys(LOG_EXIT_SYS, "get information of service: ", argv[n], " -- please make a bug report") ; diff --git a/src/lib66/exec/ssexec_reload.c b/src/lib66/exec/ssexec_reload.c index f6c7361c..436a0d64 100644 --- a/src/lib66/exec/ssexec_reload.c +++ b/src/lib66/exec/ssexec_reload.c @@ -40,7 +40,6 @@ int ssexec_reload(int argc, char const *const *argv, ssexec_t *info) unsigned int areslen = 0, m = 0 ; resolve_service_t ares[SS_MAX_SERVICE + 1] ; - char atree[SS_MAX_TREENAME + 1] ; FLAGS_SET(flag, STATE_FLAGS_TOPROPAGATE|STATE_FLAGS_WANTUP) ; @@ -84,7 +83,7 @@ int ssexec_reload(int argc, char const *const *argv, ssexec_t *info) for (; n < argc ; n++) { - r = service_is_g(atree, argv[n], STATE_FLAGS_ISPARSED) ; + r = service_is_g(argv[n], STATE_FLAGS_ISPARSED) ; if (r < 0) log_dieusys(LOG_EXIT_SYS, "get information of service: ", argv[n], " -- please make a bug report") ; @@ -94,7 +93,7 @@ int ssexec_reload(int argc, char const *const *argv, ssexec_t *info) return 0 ; } - r = service_is_g(atree, argv[n], STATE_FLAGS_ISSUPERVISED) ; + r = service_is_g(argv[n], STATE_FLAGS_ISSUPERVISED) ; if (r < 0) log_dieusys(LOG_EXIT_SYS, "get information of service: ", argv[n], " -- please make a bug report") ; diff --git a/src/lib66/exec/ssexec_resolve.c b/src/lib66/exec/ssexec_resolve.c index 00610854..f8df5af4 100644 --- a/src/lib66/exec/ssexec_resolve.c +++ b/src/lib66/exec/ssexec_resolve.c @@ -163,7 +163,6 @@ int ssexec_resolve(int argc, char const *const *argv, ssexec_t *info) int r = 0 ; char const *svname = 0 ; - char atree[SS_MAX_TREENAME + 1] ; resolve_service_t res = RESOLVE_SERVICE_ZERO ; resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ; @@ -260,7 +259,7 @@ int ssexec_resolve(int argc, char const *const *argv, ssexec_t *info) } ; - r = service_is_g(atree, svname, STATE_FLAGS_ISPARSED) ; + r = service_is_g(svname, STATE_FLAGS_ISPARSED) ; if (r == -1) log_dieu(LOG_EXIT_SYS, "get information of service: ", svname, " -- please a bug report") ; else if (!r || r == STATE_FLAGS_FALSE) diff --git a/src/lib66/exec/ssexec_state.c b/src/lib66/exec/ssexec_state.c index 61d11b30..cb28b866 100644 --- a/src/lib66/exec/ssexec_state.c +++ b/src/lib66/exec/ssexec_state.c @@ -67,7 +67,6 @@ int ssexec_state(int argc, char const *const *argv, ssexec_t *info) ss_state_t sta = STATE_ZERO ; char const *svname = 0 ; - char atree[SS_MAX_TREENAME + 1] ; char buf[MAXOPTS][INFO_FIELD_MAXLEN] = { "toinit", @@ -90,7 +89,7 @@ int ssexec_state(int argc, char const *const *argv, ssexec_t *info) svname = *argv ; - r = service_is_g(atree, svname, STATE_FLAGS_ISPARSED) ; + r = service_is_g(svname, STATE_FLAGS_ISPARSED) ; if (r == -1) log_dieusys(LOG_EXIT_SYS, "get information of service: ", svname, " -- please a bug report") ; else if (!r || r == STATE_FLAGS_FALSE) diff --git a/src/lib66/exec/ssexec_status.c b/src/lib66/exec/ssexec_status.c index 0cebee13..2c021f6e 100644 --- a/src/lib66/exec/ssexec_status.c +++ b/src/lib66/exec/ssexec_status.c @@ -881,7 +881,6 @@ int ssexec_status(int argc, char const *const *argv, ssexec_t *info) resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ; char const *svname = 0 ; - char atree[SS_MAX_TREENAME + 1] ; for (int i = 0 ; i < MAXOPTS ; i++) what[i] = -1 ; @@ -953,7 +952,7 @@ int ssexec_status(int argc, char const *const *argv, ssexec_t *info) if(!strcmp(nl_langinfo(CODESET), "UTF-8")) S_STYLE = &graph_utf8; - r = service_is_g(atree, svname, STATE_FLAGS_ISPARSED) ; + r = service_is_g(svname, STATE_FLAGS_ISPARSED) ; if (r < 0) log_dieusys(LOG_EXIT_SYS, "get information of service: ", svname, " -- please make a bug report") ; diff --git a/src/lib66/info/info_walk.c b/src/lib66/info/info_walk.c index bc6d72b9..e6acb907 100644 --- a/src/lib66/info/info_walk.c +++ b/src/lib66/info/info_walk.c @@ -73,7 +73,8 @@ int info_walk(graph_t *g, char const *name, char const *treename, info_graph_fun if (depth->level == 1 && treename) { char atree[SS_MAX_TREENAME + 1] ; - service_is_g(atree, name, 0) ; + if (!service_get_treename(atree, name, 0)) + goto err ; if (strcmp(treename, atree)) continue ; diff --git a/src/lib66/parse/parse_frontend.c b/src/lib66/parse/parse_frontend.c index 31f88b9c..39edf232 100644 --- a/src/lib66/parse/parse_frontend.c +++ b/src/lib66/parse/parse_frontend.c @@ -92,7 +92,6 @@ int parse_frontend(char const *sv, resolve_service_t *ares, unsigned int *aresle uint8_t opt_tree_forced = 0 ; size_t svlen = strlen(sv) ; char svname[svlen + 1], svsrc[svlen + 1] ; - char atree[SS_MAX_TREENAME + 1] ; stralloc sa = STRALLOC_ZERO ; if (!ob_basename(svname, sv)) @@ -142,7 +141,7 @@ int parse_frontend(char const *sv, resolve_service_t *ares, unsigned int *aresle char file[sa.len + 1] ; auto_strings(file, sa.s) ; - isparsed = service_is_g(atree, svname, STATE_FLAGS_ISPARSED) ; + isparsed = service_is_g(svname, STATE_FLAGS_ISPARSED) ; if (isparsed == -1) log_dieusys(LOG_EXIT_SYS, "get information of service: ", svname, " -- please make a bug report") ; else if (!isparsed) diff --git a/src/lib66/sanitize/sanitize_source.c b/src/lib66/sanitize/sanitize_source.c index f678f0ed..1b54882e 100644 --- a/src/lib66/sanitize/sanitize_source.c +++ b/src/lib66/sanitize/sanitize_source.c @@ -31,9 +31,8 @@ void sanitize_source(char const *name, ssexec_t *info) int r ; ssize_t logname = get_rstrlen_until(name,SS_LOG_SUFFIX) ; - char atree[SS_MAX_TREENAME + 1] ; - r = service_is_g(atree, name, STATE_FLAGS_ISPARSED) ; + r = service_is_g(name, STATE_FLAGS_ISPARSED) ; if (r == -1) log_dieusys(LOG_EXIT_SYS, "get information of service: ", name, " -- please a bug report") ; diff --git a/src/lib66/service/service_is_g.c b/src/lib66/service/service_is_g.c index 22da6385..16656602 100644 --- a/src/lib66/service/service_is_g.c +++ b/src/lib66/service/service_is_g.c @@ -65,11 +65,53 @@ int service_is(ss_state_t *ste, uint32_t flag) return STATE_FLAGS_FALSE ; } +int service_get_treename(char *atree, char const *name, uint32_t flag) +{ + log_flow() ; + + int e = 0, r = -1 ; + resolve_service_t res = RESOLVE_SERVICE_ZERO ; + resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ; + + char base[SS_MAX_PATH_LEN + SS_SYSTEM_LEN + 1] ; + + if (!set_ownersysdir_stack(base, getuid())) { + resolve_free(wres) ; + log_warnusys_return(LOG_EXIT_ZERO, "set owner directory") ; + } + + size_t baselen = strlen(base) ; + auto_strings(base + baselen, SS_SYSTEM) ; + + // no tree exist yet + if (!scan_mode(base, S_IFDIR)) + goto freed ; + + base[baselen] = 0 ; + + r = resolve_read_g(wres, base, name) ; + if (r == -1 || !r) + goto freed ; + + if (strlen(res.sa.s + res.treename) >= SS_MAX_TREENAME) { + errno = ENAMETOOLONG ; + goto freed ; + } + + auto_strings(atree, res.sa.s + res.treename) ; + + e = 1 ; + + freed: + resolve_free(wres) ; + return e ; +} + /*@Return : * -1 system error * 0 check fail * STATE_FLAGS_TRUE/STATE_FLAGS_FALSE check success */ -int service_is_g(char *atree, char const *name, uint32_t flag) +int service_is_g(char const *name, uint32_t flag) { log_flow() ; @@ -106,13 +148,6 @@ int service_is_g(char *atree, char const *name, uint32_t flag) goto freed ; } - if (strlen(res.sa.s + res.treename) >= SS_MAX_TREENAME) { - errno = ENAMETOOLONG ; - goto freed ; - } - - auto_strings(atree, res.sa.s + res.treename) ; - if (!state_read(&ste, &res)) { log_warnu("read state file of: ", name, " -- please make a bug report") ; goto freed ; -- GitLab