From 391c1b2056ece7cc7ff53fdfb26629dbf6680b06 Mon Sep 17 00:00:00 2001 From: obarun <eric@obarun.org> Date: Mon, 30 Jan 2023 01:16:55 +1100 Subject: [PATCH] clean the mess and show again the associated tree --- src/lib66/exec/ssexec_inservice.c | 99 ++++++++++++------------------- 1 file changed, 39 insertions(+), 60 deletions(-) diff --git a/src/lib66/exec/ssexec_inservice.c b/src/lib66/exec/ssexec_inservice.c index 549a7245..09d868f5 100644 --- a/src/lib66/exec/ssexec_inservice.c +++ b/src/lib66/exec/ssexec_inservice.c @@ -71,8 +71,6 @@ static unsigned int REVERSE = 0 ; static unsigned int NOFIELD = 1 ; static unsigned int GRAPH = 0 ; static unsigned int nlog = 20 ; -static stralloc src = STRALLOC_ZERO ; -static stralloc home = STRALLOC_ZERO ;// /var/lib/66/system or ${HOME}/system static wchar_t const field_suffix[] = L" :" ; static char fields[INFO_NKEY][INFO_FIELD_MAXLEN] = {{ 0 }} ; @@ -187,11 +185,11 @@ static void info_display_intree(char const *field,resolve_service_t *res) static void info_get_status(resolve_service_t *res) { - int r ; - int wstat ; + int r, wstat, warn_color = 0 ; pid_t pid ; + ss_state_t sta = STATE_ZERO ; - int warn_color = 0 ; + if (res->type == TYPE_CLASSIC) { r = s6_svc_ok(res->sa.s + res->live.scandir) ; @@ -443,57 +441,51 @@ static void info_display_deps(char const *field, resolve_service_t *res) stralloc_free(&deps) ; } -static void info_display_with_source_tree(stralloc *list,resolve_service_t *res) +static void info_display_with_source_tree(stralloc *list, resolve_service_t *res) { - size_t pos = 0, lpos = 0, newlen = 0 ; - stralloc svlist = STRALLOC_ZERO ; - stralloc ntree = STRALLOC_ZERO ; - stralloc src = STRALLOC_ZERO ; + size_t pos = 0, lpos = 0 ; stralloc tmp = STRALLOC_ZERO ; - char const *exclude[2] = { SS_RESOLVE + 1, 0 } ; - char *treename = 0 ; + stralloc sa = STRALLOC_ZERO ; - if (!auto_stra(&src,home.s)) log_die_nomem("stralloc") ; - newlen = src.len ; + if (!resolve_get_field_tosa_g(&sa, pinfo->base.s, SS_MASTER + 1, DATA_TREE_MASTER, E_RESOLVE_TREE_MASTER_CONTENTS)) + log_dieu(LOG_EXIT_SYS, "get list of trees") ; - if (!sastr_dir_get(&ntree,home.s,exclude,S_IFDIR)) - log_dieu(LOG_EXIT_SYS,"get list of trees of: ",home.s) ; + size_t len = sa.len ; - for (pos = 0 ; pos < ntree.len ; pos += strlen(ntree.s + pos) + 1) - { - svlist.len = 0 ; - src.len = newlen ; - treename = ntree.s + pos ; + char t[len + 1] ; - if (!auto_stra(&src,treename,SS_SVDIRS,SS_RESOLVE)) - log_die_nomem("stralloc") ; + sastr_to_char(t, &sa) ; - exclude[0] = SS_MASTER + 1 ; - exclude[1] = 0 ; - if (!sastr_dir_get(&svlist,src.s,exclude,S_IFREG)) - log_dieu(LOG_EXIT_SYS,"get contents of tree: ",src.s) ; + sa.len = 0 ; - for (lpos = 0 ; lpos < list->len ; lpos += strlen(list->s + lpos) + 1) - { - char *name = list->s + lpos ; - if (sastr_cmp(&svlist,name) >= 0) - { - if (!stralloc_cats(&tmp,name) || - !stralloc_cats(&tmp,":") || - !stralloc_catb(&tmp,treename,strlen(treename) +1)) + for (; pos < len ; pos += strlen(t + pos) + 1) { + + sa.len = lpos = 0 ; + char *treename = t + pos ; + + if (!resolve_get_field_tosa_g(&sa, pinfo->base.s, treename, DATA_TREE, E_RESOLVE_TREE_CONTENTS)) + log_dieu(LOG_EXIT_SYS, "get services list from tree: ", treename) ; + + FOREACH_SASTR(&sa, lpos) { + + char *service = sa.s + lpos ; + + if (sastr_cmp(list, service) >= 0) { + + if (!stralloc_cats(&tmp, service) || + !stralloc_cats(&tmp, ":") || + !stralloc_catb(&tmp, treename, strlen(treename) +1)) log_die_nomem("stralloc") ; } } } - list->len = 0 ; - for (pos = 0 ; pos < tmp.len ; pos += strlen(tmp.s + pos) + 1) - if (!stralloc_catb(list,tmp.s + pos,strlen(tmp.s + pos) + 1)) + list->len = pos = 0 ; + FOREACH_SASTR(&tmp, pos) + if (!stralloc_catb(list, tmp.s + pos, strlen(tmp.s + pos) + 1)) log_die_nomem("stralloc") ; - stralloc_free (&svlist) ; - stralloc_free (&ntree) ; - stralloc_free (&src) ; + stralloc_free (&sa) ; stralloc_free (&tmp) ; } @@ -837,12 +829,9 @@ int ssexec_inservice(int argc, char const *const *argv, ssexec_t *info) int what[MAXOPTS] = { 0 } ; pinfo = info ; - uid_t owner ; - char ownerstr[UID_FMT] ; resolve_service_t res = RESOLVE_SERVICE_ZERO ; resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ; - stralloc satree = STRALLOC_ZERO ; char const *svname = 0 ; char atree[SS_MAX_TREENAME + 1] ; @@ -850,7 +839,6 @@ int ssexec_inservice(int argc, char const *const *argv, ssexec_t *info) for (int i = 0 ; i < MAXOPTS ; i++) what[i] = -1 ; - char buf[MAXOPTS][INFO_FIELD_MAXLEN] = { "Name", "Version" , @@ -893,11 +881,13 @@ int ssexec_inservice(int argc, char const *const *argv, ssexec_t *info) argc -= l.ind ; argv += l.ind ; } - if (!argc) log_usage(usage_service_status, "\n", help_service_status) ; + if (!argc) + log_usage(usage_service_status, "\n", help_service_status) ; + svname = *argv ; - if (legacy) - { + if (legacy) { + unsigned int i = 0 ; for (; i < MAXOPTS - 1 ; i++) what[i] = i ; @@ -905,19 +895,12 @@ int ssexec_inservice(int argc, char const *const *argv, ssexec_t *info) what[i] = -1 ; } - owner = getuid() ; - size_t ownerlen = uid_fmt(ownerstr,owner) ; - ownerstr[ownerlen] = 0 ; - info_field_align(buf,fields,field_suffix,MAXOPTS) ; setlocale(LC_ALL, ""); - if(!strcmp(nl_langinfo(CODESET), "UTF-8")) { + if(!strcmp(nl_langinfo(CODESET), "UTF-8")) S_STYLE = &graph_utf8; - } - if (!set_ownersysdir(&home,owner)) log_dieusys(LOG_EXIT_SYS, "set owner directory") ; - if (!auto_stra(&home,SS_SYSTEM,"/")) log_die_nomem("stralloc") ; r = service_is_g(atree, svname, STATE_FLAGS_ISPARSED) ; if (r < 0) @@ -937,12 +920,8 @@ int ssexec_inservice(int argc, char const *const *argv, ssexec_t *info) if (buffer_putsflush(buffer_1,"\n") == -1) log_dieusys(LOG_EXIT_SYS, "write to stdout") ; - freed: resolve_free(wres) ; - stralloc_free(&src) ; - stralloc_free(&home) ; - stralloc_free(&satree) ; return 0 ; -- GitLab