From c70a5e101a74aed302874c16c65a81c996a344f2 Mon Sep 17 00:00:00 2001 From: obarun <eric@obarun.org> Date: Sat, 15 Apr 2023 17:52:01 +1100 Subject: [PATCH] change parameter for state_xxx function. use new servicedir field for the path --- src/include/66/state.h | 13 ++--- src/lib66/exec/ssexec_init.c | 7 +-- src/lib66/exec/ssexec_state.c | 41 +++++++--------- src/lib66/exec/ssexec_tree_status.c | 1 + src/lib66/info/info_graph_display_service.c | 4 +- src/lib66/sanitize/sanitize_livestate.c | 9 ++-- src/lib66/sanitize/sanitize_scandir.c | 16 ++++--- src/lib66/service/service_graph_build.c | 17 ++++--- src/lib66/service/service_graph_collect.c | 30 +----------- src/lib66/service/service_is_g.c | 2 +- src/lib66/state/deps-lib/deps | 1 - src/lib66/state/state_check.c | 12 ++--- src/lib66/state/state_get_flags.c | 53 --------------------- src/lib66/state/state_messenger.c | 12 ++--- src/lib66/state/state_read.c | 12 ++--- src/lib66/state/state_rmfile.c | 12 ++--- src/lib66/state/state_write.c | 24 ++++++---- 17 files changed, 100 insertions(+), 166 deletions(-) delete mode 100644 src/lib66/state/state_get_flags.c diff --git a/src/include/66/state.h b/src/include/66/state.h index edd319e6..7f0e49fb 100644 --- a/src/include/66/state.h +++ b/src/include/66/state.h @@ -19,6 +19,8 @@ #include <skalibs/uint32.h> +#include <66/service.h> + #define STATE_STATE_SIZE 44 #define STATE_FLAGS_FALSE (1 << 1) // 2 @@ -63,14 +65,13 @@ struct ss_state_s #define STATE_ZERO { 2,2,2,2,2,2,2,2,2,2,2 } extern ss_state_t const ss_state_zero ; -extern int state_check(char const *base, char const *name) ; -extern void state_rmfile(char const *base, char const *name) ; +extern void state_rmfile(resolve_service_t *res) ; extern void state_pack(char *base, ss_state_t *sta) ; extern void state_unpack(char *pack, ss_state_t *sta) ; -extern int state_write(ss_state_t *sta, char const *base, char const *name) ; -extern int state_read(ss_state_t *sta, char const *base, char const *name) ; extern void state_set_flag(ss_state_t *sta, int flags,int flags_val) ; -extern int state_get_flags(char const *base, char const *name, int flags) ; -extern int state_messenger(char const *base, char const *name, uint32_t flag, uint32_t value) ; +extern int state_check(resolve_service_t *res) ; +extern int state_write(ss_state_t *sta, resolve_service_t *res) ; +extern int state_read(ss_state_t *sta, resolve_service_t *res) ; +extern int state_messenger(resolve_service_t *res, uint32_t flag, uint32_t value) ; #endif diff --git a/src/lib66/exec/ssexec_init.c b/src/lib66/exec/ssexec_init.c index adf22c4c..238f7cec 100644 --- a/src/lib66/exec/ssexec_init.c +++ b/src/lib66/exec/ssexec_init.c @@ -33,6 +33,7 @@ #include <66/state.h> #include <66/graph.h> #include <66/sanitize.h> + /** * * @@ -83,7 +84,7 @@ static void doit(stralloc *sa, ssexec_t *info, uint8_t earlier) } else { - if (!state_read(&ste, ares[aresid].sa.s + ares[aresid].path.home, sa->s + n)) + if (!state_read(&ste, &ares[aresid])) log_dieusys(LOG_EXIT_SYS, "read state file of service: ", sa->s + n) ; if (service_is(&ste, STATE_FLAGS_ISENABLED)) { @@ -118,7 +119,7 @@ static void doit(stralloc *sa, ssexec_t *info, uint8_t earlier) } else { - if (!state_read(&ste, ares[aresid].sa.s + ares[aresid].path.home, name)) + if (!state_read(&ste, &ares[aresid])) log_dieusys(LOG_EXIT_SYS, "read state file of service: ", name) ; if (service_is(&ste, STATE_FLAGS_ISENABLED)) { @@ -171,7 +172,7 @@ int ssexec_init(int argc, char const *const *argv, ssexec_t *info) if (!argc) log_usage(info->usage, "\n", info->help) ; - treename = argv[1] ; + treename = argv[0] ; if (!tree_isvalid(info->base.s, treename)) log_diesys(LOG_EXIT_USER, "invalid tree name: ", treename) ; diff --git a/src/lib66/exec/ssexec_state.c b/src/lib66/exec/ssexec_state.c index 61fc74ad..55c8f7cd 100644 --- a/src/lib66/exec/ssexec_state.c +++ b/src/lib66/exec/ssexec_state.c @@ -12,28 +12,20 @@ * except according to the terms contained in the LICENSE file./ */ - -#include <string.h> #include <wchar.h> #include <oblibs/log.h> -#include <oblibs/sastr.h> -#include <oblibs/string.h> -#include <oblibs/obgetopt.h> -#include <oblibs/types.h> #include <skalibs/types.h> -#include <skalibs/stralloc.h> #include <skalibs/lolstdio.h> #include <skalibs/buffer.h> -#include <66/resolve.h> -#include <66/ssexec.h> #include <66/info.h> -#include <66/utils.h> -#include <66/constants.h> +#include <66/resolve.h> +#include <66/service.h> #include <66/state.h> #include <66/config.h> +#include <66/ssexec.h> #define MAXOPTS 11 @@ -70,13 +62,12 @@ static void info_display_int(char const *field,unsigned int id) int ssexec_state(int argc, char const *const *argv, ssexec_t *info) { - int found = 0 ; + int 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 + 1] ; + ss_state_t sta = STATE_ZERO ; char const *svname = 0 ; - char const *ste = 0 ; char atree[SS_MAX_TREENAME + 1] ; char buf[MAXOPTS][INFO_FIELD_MAXLEN] = { @@ -94,22 +85,25 @@ int ssexec_state(int argc, char const *const *argv, ssexec_t *info) argc-- ; argv++ ; - if (!argc) log_usage(info->usage, "\n", info->help) ; - svname = *argv ; + if (!argc) + log_usage(info->usage, "\n", info->help) ; - if (!set_ownersysdir_stack(base, getuid())) - log_dieu(LOG_EXIT_SYS, "set owner directory") ; + svname = *argv ; - found = service_is_g(atree, svname, STATE_FLAGS_ISPARSED) ; - if (found == -1) + r = service_is_g(atree, svname, STATE_FLAGS_ISPARSED) ; + if (r == -1) log_dieusys(LOG_EXIT_SYS, "get information of service: ", svname, " -- please a bug report") ; - else if (!found) + else if (!r) log_die(LOG_EXIT_USER, "unknown service: ", svname) ; + r = resolve_read_g(wres, info->base.s, svname) ; + if (r < 0) + log_dieu(LOG_EXIT_SYS, "read resolve file: ", svname) ; + info_field_align(buf,fields,field_suffix,MAXOPTS) ; - if (!state_check(base, svname)) log_diesys(111,"unitialized service: ",svname) ; - if (!state_read(&sta, base, svname)) log_dieusys(111,"read state file of: ",ste,"/",svname) ; + if (!state_read(&sta, &res)) + log_dieusys(111,"read state file of: ", svname) ; info_display_int(fields[0],sta.toinit) ; info_display_int(fields[1],sta.toreload) ; @@ -122,7 +116,6 @@ int ssexec_state(int argc, char const *const *argv, ssexec_t *info) info_display_int(fields[8],sta.issupervised) ; info_display_int(fields[9],sta.isup) ; - resolve_free(wres) ; return 0 ; diff --git a/src/lib66/exec/ssexec_tree_status.c b/src/lib66/exec/ssexec_tree_status.c index 4b2acd5d..bc8a1a7f 100644 --- a/src/lib66/exec/ssexec_tree_status.c +++ b/src/lib66/exec/ssexec_tree_status.c @@ -41,6 +41,7 @@ #include <66/service.h> #include <66/graph.h> #include <66/ssexec.h> +#include <66/state.h> static unsigned int REVERSE = 0 ; static unsigned int NOFIELD = 1 ; diff --git a/src/lib66/info/info_graph_display_service.c b/src/lib66/info/info_graph_display_service.c index 52c517b8..6122322e 100644 --- a/src/lib66/info/info_graph_display_service.c +++ b/src/lib66/info/info_graph_display_service.c @@ -55,8 +55,8 @@ int info_graph_display_service(char const *name) goto freed ; } - if (!state_read(&sta, res.sa.s + res.path.home, name)) { - log_warnusys("read state of: ",name) ; + if (!state_read(&sta, &res)) { + log_warnusys("read state of: ", name) ; goto freed ; } diff --git a/src/lib66/sanitize/sanitize_livestate.c b/src/lib66/sanitize/sanitize_livestate.c index 10557366..c633b706 100644 --- a/src/lib66/sanitize/sanitize_livestate.c +++ b/src/lib66/sanitize/sanitize_livestate.c @@ -51,6 +51,7 @@ static void sanitize_livestate_directory(resolve_service_t *res) log_diesys(LOG_EXIT_SYS, "conflicting format for: ", ste) ; if (!r) { + log_trace("create directory: ", ste) ; r = dir_create_parent(ste, 0700) ; if (!r) log_dieusys(LOG_EXIT_SYS, "create directory: ", ste) ; @@ -72,7 +73,6 @@ static void sanitize_livestate_service_symlink(resolve_service_t *res) size_t livelen = strlen(res->sa.s + res->live.livedir) ; size_t ownerlen = strlen(res->sa.s + res->ownerstr) ; size_t homelen = strlen(res->sa.s + res->path.home) ; - char sym[livelen + SS_STATE_LEN + 1 + ownerlen + 1 + namelen + 1] ; char dst[homelen + SS_SYSTEM_LEN + SS_SERVICE_LEN + SS_SVC_LEN + 1 + namelen + 1] ; @@ -80,6 +80,7 @@ static void sanitize_livestate_service_symlink(resolve_service_t *res) auto_strings(dst, res->sa.s + res->path.home, SS_SYSTEM, SS_SERVICE, SS_SVC, "/", name) ; + log_trace("symlink: ", sym, " to: ", dst) ; if (!atomic_symlink(dst, sym, "livestate")) log_dieu(LOG_EXIT_SYS, "symlink: ", sym, " to: ", dst) ; } @@ -95,6 +96,7 @@ void sanitize_livestate(resolve_service_t *res, uint32_t flag) size_t ownerlen = strlen(res->sa.s + res->owner) ; char ste[livelen + SS_STATE_LEN + 1 + ownerlen + 1 + namelen + 1] ; + auto_strings(ste, res->sa.s + res->live.livedir, SS_STATE + 1, "/", res->sa.s + res->ownerstr, "/", name) ; r = access(ste, F_OK) ; @@ -108,14 +110,15 @@ void sanitize_livestate(resolve_service_t *res, uint32_t flag) if (FLAGS_ISSET(flag, STATE_FLAGS_TOUNSUPERVISE)) { + log_trace("unlink: ", ste) ; unlink_void(ste) ; - if (!state_messenger(res->sa.s + res->path.home, name, STATE_FLAGS_TORELOAD, STATE_FLAGS_FALSE)) + if (!state_messenger(res, STATE_FLAGS_TORELOAD, STATE_FLAGS_FALSE)) log_dieusys(LOG_EXIT_SYS, "send message to state of: ", name) ; } } - if (!state_messenger(res->sa.s + res->path.home, name, STATE_FLAGS_TOINIT, STATE_FLAGS_FALSE)) + if (!state_messenger(res, STATE_FLAGS_TOINIT, STATE_FLAGS_FALSE)) log_dieusys(LOG_EXIT_SYS, "send message to state of: ", name) ; } diff --git a/src/lib66/sanitize/sanitize_scandir.c b/src/lib66/sanitize/sanitize_scandir.c index 4a3be020..e57e9b50 100644 --- a/src/lib66/sanitize/sanitize_scandir.c +++ b/src/lib66/sanitize/sanitize_scandir.c @@ -46,6 +46,7 @@ static void scandir_scandir_to_livestate(resolve_service_t *res) auto_strings(dst, res->sa.s + res->live.livedir, SS_STATE + 1, "/", res->sa.s + res->ownerstr, "/", name) ; + log_trace("symlink: ", sym, " to: ", dst) ; if (!atomic_symlink(dst, sym, "scandir")) log_dieu(LOG_EXIT_SYS, "symlink: ", sym, " to: ", dst) ; } @@ -66,6 +67,7 @@ static void scandir_service_to_scandir(resolve_service_t *res) auto_strings(dst, res->sa.s + res->live.livedir, SS_SCANDIR, "/", res->sa.s + res->ownerstr) ; + log_trace("symlink: ", sym, " to: ", dst) ; if (!atomic_symlink(dst, sym, "scandir")) log_dieu(LOG_EXIT_SYS, "symlink: ", sym, " to: ", dst) ; } @@ -77,6 +79,7 @@ static void compute_supervision_dir(resolve_service_t *res) char *supervise = res->sa.s + res->live.supervisedir ; /* event dir */ + log_trace("create directory: ", event) ; int r = dir_create_parent(event, 0700) ; if (!r) log_dieusys(LOG_EXIT_SYS, "create directory: ", event) ; @@ -88,6 +91,7 @@ static void compute_supervision_dir(resolve_service_t *res) log_dieusys(LOG_EXIT_SYS, "chmod: ", event) ; /* supervise dir*/ + log_trace("create directory: ", supervise) ; r = dir_create_parent(supervise, 0700) ; if (!r) log_dieusys(LOG_EXIT_SYS, "create directory: ", event) ; @@ -124,10 +128,10 @@ void sanitize_scandir(resolve_service_t *res, uint32_t flag) log_dieu(LOG_EXIT_SYS, "reload scandir: ", svcandir) ; } - if (!state_messenger(res->sa.s + res->path.home, name, STATE_FLAGS_ISSUPERVISED, STATE_FLAGS_TRUE)) + if (!state_messenger(res, STATE_FLAGS_ISSUPERVISED, STATE_FLAGS_TRUE)) log_dieusys(LOG_EXIT_SYS, "send message to state of: ", name) ; - if (!state_messenger(res->sa.s + res->path.home, name, STATE_FLAGS_TOUNSUPERVISE, STATE_FLAGS_FALSE)) + if (!state_messenger(res, STATE_FLAGS_TOUNSUPERVISE, STATE_FLAGS_FALSE)) log_dieusys(LOG_EXIT_SYS, "send message to state of: ", name) ; } else { @@ -139,10 +143,10 @@ void sanitize_scandir(resolve_service_t *res, uint32_t flag) unlink_void(s) ; - if (!state_messenger(res->sa.s + res->path.home, name, STATE_FLAGS_ISSUPERVISED, STATE_FLAGS_FALSE)) + if (!state_messenger(res, STATE_FLAGS_ISSUPERVISED, STATE_FLAGS_FALSE)) log_dieusys(LOG_EXIT_SYS, "send message to state of: ", name) ; - if (!state_messenger(res->sa.s + res->path.home, name, STATE_FLAGS_TOUNSUPERVISE, STATE_FLAGS_FALSE)) + if (!state_messenger(res, STATE_FLAGS_TOUNSUPERVISE, STATE_FLAGS_FALSE)) log_dieusys(LOG_EXIT_SYS, "send message to state of: ", name) ; if (svc_scandir_send(svcandir, "an") <= 0) @@ -154,10 +158,10 @@ void sanitize_scandir(resolve_service_t *res, uint32_t flag) if (svc_scandir_send(svcandir, "a") <= 0) log_dieu(LOG_EXIT_SYS, "reload scandir: ", svcandir) ; - if (!state_messenger(res->sa.s + res->path.home, name, STATE_FLAGS_TORELOAD, STATE_FLAGS_FALSE)) + if (!state_messenger(res, STATE_FLAGS_TORELOAD, STATE_FLAGS_FALSE)) log_dieusys(LOG_EXIT_SYS, "send message to state of: ", name) ; - if (!state_messenger(res->sa.s + res->path.home, name, STATE_FLAGS_TOUNSUPERVISE, STATE_FLAGS_FALSE)) + if (!state_messenger(res, STATE_FLAGS_TOUNSUPERVISE, STATE_FLAGS_FALSE)) log_dieusys(LOG_EXIT_SYS, "send message to state of: ", name) ; } } diff --git a/src/lib66/service/service_graph_build.c b/src/lib66/service/service_graph_build.c index 21a0df53..6a5fce7c 100644 --- a/src/lib66/service/service_graph_build.c +++ b/src/lib66/service/service_graph_build.c @@ -24,7 +24,7 @@ #include <66/graph.h> #include <66/state.h> -static void issupervised(char *store, char const *base, char const *str) +static void issupervised(char *store, resolve_service_t *ares, unsigned int areslen, char const *str) { size_t pos = 0 ; ss_state_t ste = STATE_ZERO ; @@ -39,10 +39,16 @@ static void issupervised(char *store, char const *base, char const *str) char *name = sa.s + pos ; - if (!state_check(base, name)) + int aresid = service_resolve_array_search(ares, areslen, name) ; + if (aresid < 0) { + log_warn("service: ", name, " not available -- ignore it") ; + continue ; + } + + if (!state_check(&ares[aresid])) continue ; - if (!state_read(&ste, base, name)) + if (!state_read(&ste, &ares[aresid])) continue ; if (service_is(&ste, STATE_FLAGS_ISSUPERVISED)) @@ -79,8 +85,7 @@ void service_graph_build(graph_t *g, resolve_service_t *ares, unsigned int aresl if (FLAGS_ISSET(flag, STATE_FLAGS_ISSUPERVISED)) { - issupervised(store, pres->sa.s + pres->path.home, pres->sa.s + pres->dependencies.depends) ; - + issupervised(store, ares, areslen, pres->sa.s + pres->dependencies.depends) ; } else { @@ -99,7 +104,7 @@ void service_graph_build(graph_t *g, resolve_service_t *ares, unsigned int aresl if (FLAGS_ISSET(flag, STATE_FLAGS_ISSUPERVISED)) { - issupervised(store, pres->sa.s + pres->path.home, pres->sa.s + pres->dependencies.requiredby) ; + issupervised(store, ares, areslen, pres->sa.s + pres->dependencies.requiredby) ; } else { diff --git a/src/lib66/service/service_graph_collect.c b/src/lib66/service/service_graph_collect.c index bfd81d79..2cc14a01 100644 --- a/src/lib66/service/service_graph_collect.c +++ b/src/lib66/service/service_graph_collect.c @@ -76,7 +76,7 @@ void service_graph_collect(graph_t *g, char const *alist, size_t alen, resolve_s } else if (!FLAGS_ISSET(flag, STATE_FLAGS_TOPARSE)) continue ; - if (FLAGS_ISSET(flag, STATE_FLAGS_TOPARSE)) + if (FLAGS_ISSET(flag, STATE_FLAGS_TOPARSE) && !r) sanitize_source(name, info, flag) ; if (!resolve_read_g(wres, info->base.s, name)) @@ -84,7 +84,7 @@ void service_graph_collect(graph_t *g, char const *alist, size_t alen, resolve_s if (FLAGS_ISSET(flag, STATE_FLAGS_ISSUPERVISED)) { - if (!state_read(&ste, res.sa.s + res.path.home, name)) + if (!state_read(&ste, &res)) log_dieu(LOG_EXIT_SYS, "read state file of: ", name, " -- please make a bug report") ; if (service_is(&ste, STATE_FLAGS_ISSUPERVISED)) { @@ -110,15 +110,6 @@ void service_graph_collect(graph_t *g, char const *alist, size_t alen, resolve_s if (FLAGS_ISSET(flag, STATE_FLAGS_TOPROPAGATE)) { - stralloc module = STRALLOC_ZERO ; - - if (res.type == TYPE_MODULE) { - - if (res.regex.ncontents) - if (!sastr_clean_string(&module, res.sa.s + res.regex.contents)) - log_dieu(LOG_EXIT_SYS, "clean string") ; - } - if (res.dependencies.ndepends && FLAGS_ISSET(flag, STATE_FLAGS_WANTUP)) { sa.len = 0 ; @@ -126,14 +117,6 @@ void service_graph_collect(graph_t *g, char const *alist, size_t alen, resolve_s if (!sastr_clean_string(&sa, res.sa.s + res.dependencies.depends)) log_dieu(LOG_EXIT_SYS, "clean string") ; - if (module.len) { - FOREACH_SASTR(&module, pos) - sastr_add_string(&sa, module.s + pos) ; - } - - stralloc_0(&sa) ; - sa.len-- ; - service_graph_collect(g, sa.s, sa.len, ares, areslen, info, flag) ; } @@ -145,18 +128,9 @@ void service_graph_collect(graph_t *g, char const *alist, size_t alen, resolve_s if (!sastr_clean_string(&sa, res.sa.s + res.dependencies.requiredby)) log_dieu(LOG_EXIT_SYS, "clean string") ; - if (module.len) { - FOREACH_SASTR(&module, pos) - sastr_add_string(&sa, module.s + pos) ; - } - - stralloc_0(&sa) ; - sa.len-- ; - service_graph_collect(g, sa.s, sa.len, ares, areslen, info, flag) ; } - stralloc_free(&module) ; } resolve_free(wres) ; } diff --git a/src/lib66/service/service_is_g.c b/src/lib66/service/service_is_g.c index 4ed6b37d..cf36bd69 100644 --- a/src/lib66/service/service_is_g.c +++ b/src/lib66/service/service_is_g.c @@ -113,7 +113,7 @@ int service_is_g(char *atree, char const *name, uint32_t flag) auto_strings(atree, res.sa.s + res.treename) ; - if (!state_read(&ste, res.sa.s + res.path.home, name)) { + if (!state_read(&ste, &res)) { log_warnu("read state file of: ", name, " -- please make a bug report") ; goto freed ; } diff --git a/src/lib66/state/deps-lib/deps b/src/lib66/state/deps-lib/deps index 8e957dc4..aff0afdb 100644 --- a/src/lib66/state/deps-lib/deps +++ b/src/lib66/state/deps-lib/deps @@ -1,5 +1,4 @@ state_check.o -state_get_flags.o state_messenger.o state_pack.o state_read.o diff --git a/src/lib66/state/state_check.c b/src/lib66/state/state_check.c index 49857572..7f8336f3 100644 --- a/src/lib66/state/state_check.c +++ b/src/lib66/state/state_check.c @@ -20,17 +20,17 @@ #include <66/state.h> #include <66/constants.h> -#include <66/resolve.h> +#include <66/service.h> -int state_check(char const *base, char const *name) +int state_check(resolve_service_t *res) { log_flow() ; - size_t baselen = strlen(base) ; - size_t namelen = strlen(name) ; - char target[baselen + SS_SYSTEM_LEN + SS_RESOLVE_LEN + SS_SERVICE_LEN + 1 + namelen + SS_SVC_LEN + 1 + namelen + SS_STATE_LEN + 1 + SS_STATUS_LEN + 1] ; + size_t len = strlen(res->sa.s + res->path.servicedir) ; - auto_strings(target, base, SS_SYSTEM, SS_RESOLVE, SS_SERVICE, "/", name, SS_SVC, "/", name, SS_STATE, "/", SS_STATUS) ; + char target[len + SS_STATE_LEN + 1 + SS_STATUS_LEN + 1] ; + + auto_strings(target, res->sa.s + res->path.servicedir, SS_STATE, "/", SS_STATUS) ; if (access(target, F_OK) < 0) return 0 ; diff --git a/src/lib66/state/state_get_flags.c b/src/lib66/state/state_get_flags.c deleted file mode 100644 index f7312845..00000000 --- a/src/lib66/state/state_get_flags.c +++ /dev/null @@ -1,53 +0,0 @@ -/* - * state_get_flags.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 <oblibs/log.h> - -#include <66/state.h> - -int state_get_flags(char const *base, char const *name, int flags) -{ - log_flow() ; - - /** not parsed. - * Return -1 to make a distinction between - * file absent and flag == 0. */ - if (!state_check(base, name)) - return -1 ; - - ss_state_t sta = STATE_ZERO ; - - if (!state_read(&sta, base, name)) - // should not happen - return -1 ; - - switch (flags) - { - case STATE_FLAGS_TOINIT: return sta.toinit ; - case STATE_FLAGS_TORELOAD: return sta.toreload ; - case STATE_FLAGS_TORESTART: return sta.torestart ; - case STATE_FLAGS_TOUNSUPERVISE: return sta.tounsupervise ; - case STATE_FLAGS_TOPARSE: return sta.toparse ; - case STATE_FLAGS_ISDOWNFILE: return sta.isdownfile ; - case STATE_FLAGS_ISEARLIER: return sta.isearlier ; - case STATE_FLAGS_ISENABLED: return sta.isenabled ; - case STATE_FLAGS_ISPARSED: return sta.isparsed ; - case STATE_FLAGS_ISSUPERVISED: return sta.issupervised ; - case STATE_FLAGS_ISUP: return sta.isup ; - default: - // should never happen - return -1 ; - } - -} diff --git a/src/lib66/state/state_messenger.c b/src/lib66/state/state_messenger.c index 876887e6..35ca82f2 100644 --- a/src/lib66/state/state_messenger.c +++ b/src/lib66/state/state_messenger.c @@ -16,21 +16,21 @@ #include <oblibs/log.h> #include <66/state.h> +#include <66/service.h> -int state_messenger(char const *base, char const *name, uint32_t flag, uint32_t value) +int state_messenger(resolve_service_t *res, uint32_t flag, uint32_t value) { log_flow() ; ss_state_t sta = STATE_ZERO ; - if (!state_read(&sta, base, name)) - log_warnusys_return(LOG_EXIT_ZERO, "read status file of: ", name) ; + if (!state_read(&sta, res)) + log_warnusys_return(LOG_EXIT_ZERO, "read status file of: ", res->sa.s + res->name) ; state_set_flag(&sta, flag, value) ; - if (!state_write(&sta, base, name)) - log_warnusys_return(LOG_EXIT_ZERO, "write status file of: ", name) ; - + if (!state_write(&sta, res)) + log_warnusys_return(LOG_EXIT_ZERO, "write status file of: ", res->sa.s + res->name) ; return 1 ; } diff --git a/src/lib66/state/state_read.c b/src/lib66/state/state_read.c index faccddb5..0d696a11 100644 --- a/src/lib66/state/state_read.c +++ b/src/lib66/state/state_read.c @@ -21,18 +21,18 @@ #include <66/state.h> #include <66/constants.h> -#include <66/resolve.h> +#include <66/service.h> -int state_read(ss_state_t *sta, char const *base, char const *name) +int state_read(ss_state_t *sta, resolve_service_t *res) { log_flow() ; - size_t baselen = strlen(base) ; - size_t namelen = strlen(name) ; + size_t len = strlen(res->sa.s + res->path.servicedir) ; + char pack[STATE_STATE_SIZE] ; - char target[baselen + SS_SYSTEM_LEN + SS_RESOLVE_LEN + SS_SERVICE_LEN + 1 + namelen + SS_SVC_LEN + 1 + namelen + SS_STATE_LEN + 1 + SS_STATUS_LEN + 1] ; + char target[len + SS_STATE_LEN + 1 + SS_STATUS_LEN + 1] ; - auto_strings(target, base, SS_SYSTEM, SS_RESOLVE, SS_SERVICE, "/", name, SS_SVC, "/", name, SS_STATE, "/", SS_STATUS) ; + auto_strings(target, res->sa.s + res->path.servicedir, SS_STATE, "/", SS_STATUS) ; if (openreadnclose(target, pack, STATE_STATE_SIZE) < STATE_STATE_SIZE) return 0 ; diff --git a/src/lib66/state/state_rmfile.c b/src/lib66/state/state_rmfile.c index 29162993..a0e0aa09 100644 --- a/src/lib66/state/state_rmfile.c +++ b/src/lib66/state/state_rmfile.c @@ -21,17 +21,17 @@ #include <66/state.h> #include <66/constants.h> -#include <66/resolve.h> +#include <66/service.h> -void state_rmfile(char const *base, char const *name) +void state_rmfile(resolve_service_t *res) { log_flow() ; - size_t baselen = strlen(base) ; - size_t namelen = strlen(name) ; - char target[baselen + SS_SYSTEM_LEN + SS_RESOLVE_LEN + SS_SERVICE_LEN + 1 + namelen + SS_SVC_LEN + 1 + namelen + SS_STATE_LEN + 1 + SS_STATUS_LEN + 1] ; + size_t len = strlen(res->sa.s + res->path.servicedir) ; - auto_strings(target, base, SS_SYSTEM, SS_RESOLVE, SS_SERVICE, "/", name, SS_SVC, "/", name, SS_STATE, "/", SS_STATUS) ; + char target[len + SS_STATE_LEN + 1 + SS_STATUS_LEN + 1] ; + + auto_strings(target, res->sa.s + res->path.servicedir, SS_STATE, "/", SS_STATUS) ; unlink_void(target) ; } diff --git a/src/lib66/state/state_write.c b/src/lib66/state/state_write.c index 656bef33..30f37be3 100644 --- a/src/lib66/state/state_write.c +++ b/src/lib66/state/state_write.c @@ -23,28 +23,34 @@ #include <66/state.h> #include <66/constants.h> -#include <66/resolve.h> +#include <66/service.h> -int state_write(ss_state_t *sta, char const *base, char const *name) +int state_write(ss_state_t *sta, resolve_service_t *res) { log_flow() ; - size_t baselen = strlen(base) ; - size_t namelen = strlen(name) ; - char target[baselen + SS_SYSTEM_LEN + SS_RESOLVE_LEN + SS_SERVICE_LEN + 1 + namelen + SS_SVC_LEN + 1 + namelen + SS_STATE_LEN + 1 + SS_STATUS_LEN + 1] ; + size_t len = strlen(res->sa.s + res->path.servicedir) ; - auto_strings(target, base, SS_SYSTEM, SS_RESOLVE, SS_SERVICE, "/", name, SS_SVC, "/", name, SS_STATE) ; + char target[len + SS_STATE_LEN + 1 + SS_STATUS_LEN + 1] ; - if (access(target, F_OK) < 0) + auto_strings(target, res->sa.s + res->path.servicedir, SS_STATE) ; + + if (access(target, F_OK) < 0) { + log_trace("create directory: ", target) ; if (!dir_create_parent(target, 0755)) log_warnusys_return(LOG_EXIT_ZERO, "create directory: ", target) ; + } - auto_strings(target + baselen + SS_SYSTEM_LEN + SS_RESOLVE_LEN + SS_SERVICE_LEN + 1 + namelen + SS_SVC_LEN + 1 + namelen + SS_STATE_LEN, "/", SS_STATUS) ; + auto_strings(target + len + SS_STATE_LEN, "/", SS_STATUS) ; char pack[STATE_STATE_SIZE] ; state_pack(pack, sta) ; - if (!openwritenclose_unsafe(target, pack, STATE_STATE_SIZE)) return 0 ; + + log_trace("write status file at: ", target) ; + + if (!openwritenclose_unsafe(target, pack, STATE_STATE_SIZE)) + return 0 ; return 1 ; } -- GitLab