From d58c932dc6348daa777701828827944722b47868 Mon Sep 17 00:00:00 2001
From: obarun <eric@obarun.org>
Date: Sun, 21 May 2023 20:47:01 +1100
Subject: [PATCH] return the actual flag instead of the binary form

---
 src/lib66/exec/ssexec_env.c                 |  4 +--
 src/lib66/exec/ssexec_init.c                |  6 ++--
 src/lib66/exec/ssexec_reload.c              | 12 ++++----
 src/lib66/exec/ssexec_resolve.c             |  4 +--
 src/lib66/exec/ssexec_restart.c             | 34 ++++++---------------
 src/lib66/exec/ssexec_signal.c              |  6 ++--
 src/lib66/exec/ssexec_tree_signal.c         |  2 +-
 src/lib66/info/info_graph_display_service.c |  8 ++---
 src/lib66/parse/parse_frontend.c            |  9 ++++--
 src/lib66/parse/parse_service.c             | 16 ++++------
 src/lib66/service/service_graph_build.c     |  2 +-
 src/lib66/service/service_is_g.c            | 30 +++++++++---------
 src/lib66/svc/svc_compute_ns.c              |  8 ++---
 13 files changed, 63 insertions(+), 78 deletions(-)

diff --git a/src/lib66/exec/ssexec_env.c b/src/lib66/exec/ssexec_env.c
index cc937296..0c4a525f 100644
--- a/src/lib66/exec/ssexec_env.c
+++ b/src/lib66/exec/ssexec_env.c
@@ -303,8 +303,8 @@ int ssexec_env(int argc, char const *const *argv, ssexec_t *info)
     r = service_is_g(atree, sv, STATE_FLAGS_ISPARSED) ;
     if (r == -1)
         log_dieusys(LOG_EXIT_SYS, "get information of service: ", sv, " -- please a bug report") ;
-    else if (!r) {
-        log_warn(sv, " is not parsed -- try to parse it first") ;
+    else if (!r || r == STATE_FLAGS_FALSE) {
+        log_warn("service: ", sv, " is not parsed -- try to parse it first using '66 parse ", sv, "'") ;
         goto freed ;
     }
 
diff --git a/src/lib66/exec/ssexec_init.c b/src/lib66/exec/ssexec_init.c
index 238f7cec..12a935dc 100644
--- a/src/lib66/exec/ssexec_init.c
+++ b/src/lib66/exec/ssexec_init.c
@@ -87,7 +87,7 @@ static void doit(stralloc *sa, ssexec_t *info, uint8_t earlier)
                 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)) {
+                if (service_is(&ste, STATE_FLAGS_ISENABLED) == STATE_FLAGS_TRUE) {
                     list[nservice++] = idx ;
                     visit[idx] = 1 ;
                 }
@@ -122,7 +122,7 @@ static void doit(stralloc *sa, ssexec_t *info, uint8_t earlier)
                     if (!state_read(&ste, &ares[aresid]))
                         log_dieusys(LOG_EXIT_SYS, "read state file of service: ", name) ;
 
-                    if (service_is(&ste, STATE_FLAGS_ISENABLED)) {
+                    if (service_is(&ste, STATE_FLAGS_ISENABLED) == STATE_FLAGS_TRUE) {
                         list[nservice++] = l[pos] ;
                         visit[l[pos]] = 1 ;
                     }
@@ -131,7 +131,7 @@ static void doit(stralloc *sa, ssexec_t *info, uint8_t earlier)
         }
     }
 
-    sanitize_init(list, nservice, &graph, ares, areslen, earlier ? STATE_FLAGS_ISEARLIER : STATE_FLAGS_UNKNOWN) ;
+    sanitize_init(list, nservice, &graph, ares, areslen) ;
 
     service_resolve_array_free(ares, areslen) ;
     graph_free_all(&graph) ;
diff --git a/src/lib66/exec/ssexec_reload.c b/src/lib66/exec/ssexec_reload.c
index 54f666fe..e7ad94fe 100644
--- a/src/lib66/exec/ssexec_reload.c
+++ b/src/lib66/exec/ssexec_reload.c
@@ -86,21 +86,21 @@ int ssexec_reload(int argc, char const *const *argv, ssexec_t *info)
 
         r = service_is_g(atree, argv[n], STATE_FLAGS_ISPARSED) ;
         if (r < 0)
-            log_dieusys(LOG_EXIT_SYS, "get information of service: ", argv[n], " -- please a bug report") ;
+            log_dieusys(LOG_EXIT_SYS, "get information of service: ", argv[n], " -- please make a bug report") ;
 
-        if (!r) {
+        if (!r || r == STATE_FLAGS_FALSE) {
             /** nothing to do */
-            log_warn(argv[n], " is not parsed -- try to start it first") ;
+            log_warn(argv[n], " is not parsed -- try to start it first using '66 start ", argv[n], "'") ;
             return 0 ;
         }
 
         r = service_is_g(atree, argv[n], STATE_FLAGS_ISSUPERVISED) ;
         if (r < 0)
-            log_dieusys(LOG_EXIT_SYS, "get information of service: ", argv[n], " -- please a bug report") ;
+            log_dieusys(LOG_EXIT_SYS, "get information of service: ", argv[n], " -- please make a bug report") ;
 
-        if (!r) {
+        if (!r || r == STATE_FLAGS_FALSE) {
             /** nothing to do */
-            log_warn(argv[n], " is not running -- try to start it first") ;
+            log_warn(argv[n], " is not running -- try to start it first using '66 start ", argv[n], "'") ;
             return 0 ;
         }
     }
diff --git a/src/lib66/exec/ssexec_resolve.c b/src/lib66/exec/ssexec_resolve.c
index e31855f0..9611b16c 100644
--- a/src/lib66/exec/ssexec_resolve.c
+++ b/src/lib66/exec/ssexec_resolve.c
@@ -263,8 +263,8 @@ int ssexec_resolve(int argc, char const *const *argv, ssexec_t *info)
     r = service_is_g(atree, svname, STATE_FLAGS_ISPARSED) ;
     if (r == -1)
         log_dieu(LOG_EXIT_SYS, "get information of service: ", svname, " -- please a bug report") ;
-    else if (!r)
-        log_die(LOG_EXIT_USER, svname, " is not parsed -- try to parse it first") ;
+    else if (!r || r == STATE_FLAGS_FALSE)
+        log_die(LOG_EXIT_USER, "service: ", svname, " is not parsed -- try to parse it first using '66 parse ", svname, "'") ;
 
     if (!resolve_read_g(wres, info->base.s, svname))
         log_dieusys(LOG_EXIT_SYS, "read resolve file") ;
diff --git a/src/lib66/exec/ssexec_restart.c b/src/lib66/exec/ssexec_restart.c
index 604b3b55..b353bab2 100644
--- a/src/lib66/exec/ssexec_restart.c
+++ b/src/lib66/exec/ssexec_restart.c
@@ -40,7 +40,7 @@ int ssexec_restart(int argc, char const *const *argv, ssexec_t *info)
 
     unsigned int areslen = 0, m = 0 ;
     resolve_service_t ares[SS_MAX_SERVICE] ;
-    char atree[SS_MAX_TREENAME + 1] ;
+    ss_state_t sta = STATE_ZERO ;
 
     FLAGS_SET(flag, STATE_FLAGS_TOPROPAGATE|STATE_FLAGS_TORESTART|STATE_FLAGS_WANTUP) ;
 
@@ -81,29 +81,6 @@ int ssexec_restart(int argc, char const *const *argv, ssexec_t *info)
 
     char const *nargv[argc] ;
 
-    for (; n < argc ; n++) {
-
-        r = service_is_g(atree, argv[n], STATE_FLAGS_ISPARSED) ;
-        if (r < 0)
-            log_dieusys(LOG_EXIT_SYS, "get information of service: ", argv[n], " -- please a bug report") ;
-
-        if (!r) {
-            /** nothing to do */
-            log_warn(argv[n], " is not parsed -- try to start it first") ;
-            return 0 ;
-        }
-
-        r = service_is_g(atree, argv[n], STATE_FLAGS_ISSUPERVISED) ;
-        if (r < 0)
-            log_dieusys(LOG_EXIT_SYS, "get information of service: ", argv[n], " -- please a bug report") ;
-
-        if (!r) {
-            /** nothing to do */
-            log_warn(argv[n], " is not running -- try to start it first") ;
-            return 0 ;
-        }
-    }
-
     /** build the graph of the entire system */
     graph_build_service(&graph, ares, &areslen, info, flag) ;
 
@@ -116,6 +93,13 @@ int ssexec_restart(int argc, char const *const *argv, ssexec_t *info)
         if (aresid < 0)
             log_die(LOG_EXIT_USER, "service: ", *argv, " not available -- did you parsed it?") ;
 
+        if (!state_read(&sta, &ares[aresid]))
+            log_dieu(LOG_EXIT_SYS, "read state file of: ", argv[n]) ;
+
+        if (service_is(&sta, STATE_FLAGS_ISSUPERVISED) == STATE_FLAGS_FALSE)
+            /** nothing to do */
+            log_warn_return(LOG_EXIT_ZERO, "service: ", argv[n], " is not supervised -- try to start it first using '66 start ", argv[n], "'") ;
+
         if (ares[aresid].type == TYPE_ONESHOT) {
             nargc++ ;
             nargv[m++] = ares[aresid].sa.s + ares[aresid].name ;
@@ -143,11 +127,11 @@ int ssexec_restart(int argc, char const *const *argv, ssexec_t *info)
     r = svc_send_wait(argv, argc, sig, siglen, info) ;
     if (r)
         goto err ;
+
     /** s6-supervise do not deal with oneshot service:
      * The previous send command will bring it down but
      * s6-supervise will not bring it up automatically.
      * Well, do it manually */
-
     if (nargc) {
 
         int verbo = VERBOSITY ;
diff --git a/src/lib66/exec/ssexec_signal.c b/src/lib66/exec/ssexec_signal.c
index 81d240d6..d07f07e6 100644
--- a/src/lib66/exec/ssexec_signal.c
+++ b/src/lib66/exec/ssexec_signal.c
@@ -84,12 +84,12 @@ static void pidservice_init_array(unsigned int *list, unsigned int listlen, pids
 
         if (ares[pids.aresid].type != TYPE_CLASSIC) {
 
-                ss_state_t ste = STATE_ZERO ;
+                ss_state_t sta = STATE_ZERO ;
 
-                if (!state_read(&ste, &ares[pids.aresid]))
+                if (!state_read(&sta, &ares[pids.aresid]))
                     log_dieusys(LOG_EXIT_SYS, "read state file of: ", name) ;
 
-                if (ste.isup == STATE_FLAGS_TRUE)
+                if (service_is(&sta, STATE_FLAGS_ISUP) == STATE_FLAGS_TRUE)
                     FLAGS_SET(pids.state, SVC_FLAGS_UP) ;
                 else
                     FLAGS_SET(pids.state, SVC_FLAGS_DOWN) ;
diff --git a/src/lib66/exec/ssexec_tree_signal.c b/src/lib66/exec/ssexec_tree_signal.c
index 072f8a90..9b778cbb 100644
--- a/src/lib66/exec/ssexec_tree_signal.c
+++ b/src/lib66/exec/ssexec_tree_signal.c
@@ -457,7 +457,7 @@ static int ssexec_callback(stralloc *sa, ssexec_t *info, unsigned int what)
         if (r < 0)
             log_dieusys(LOG_EXIT_SYS, "get information of service: ", name, " -- please a bug report") ;
 
-        if (r > 0)
+        if (r == STATE_FLAGS_TRUE)
             if (!sastr_add_string(sa, name))
                 log_dieu(LOG_EXIT_SYS, "add string") ;
     }
diff --git a/src/lib66/info/info_graph_display_service.c b/src/lib66/info/info_graph_display_service.c
index 6122322e..881fafaa 100644
--- a/src/lib66/info/info_graph_display_service.c
+++ b/src/lib66/info/info_graph_display_service.c
@@ -69,12 +69,12 @@ int info_graph_display_service(char const *name)
 
     } else {
 
-         if (!service_is(&sta, STATE_FLAGS_ISSUPERVISED)) {
+         if (service_is(&sta, STATE_FLAGS_ISSUPERVISED) == STATE_FLAGS_FALSE) {
 
             ppid = "unitialized" ;
             goto dis ;
 
-        } else if (!service_is(&sta, STATE_FLAGS_ISUP)) {
+        } else if (service_is(&sta, STATE_FLAGS_ISUP) == STATE_FLAGS_FALSE) {
 
             ppid = "down" ;
             pid_color = 1 ;
@@ -97,8 +97,8 @@ int info_graph_display_service(char const *name)
         ppid, \
         log_color->off, \
 
-        "state=", service_is(&sta, STATE_FLAGS_ISENABLED) ? log_color->valid : log_color->warning, \
-        service_is(&sta, STATE_FLAGS_ISENABLED) ? "Enabled" : "Disabled", \
+        "state=", service_is(&sta, STATE_FLAGS_ISENABLED) == STATE_FLAGS_TRUE ? log_color->valid : log_color->warning, \
+        service_is(&sta, STATE_FLAGS_ISENABLED) == STATE_FLAGS_TRUE ? "Enabled" : "Disabled", \
         log_color->off, \
 
         "type=", log_color->blue, get_key_by_enum(ENUM_TYPE,res.type), log_color->off, \
diff --git a/src/lib66/parse/parse_frontend.c b/src/lib66/parse/parse_frontend.c
index 30576889..f0bf2243 100644
--- a/src/lib66/parse/parse_frontend.c
+++ b/src/lib66/parse/parse_frontend.c
@@ -141,8 +141,11 @@ int parse_frontend(char const *sv, resolve_service_t *ares, unsigned int *aresle
     if (isparsed == -1)
         log_dieusys(LOG_EXIT_SYS, "get information of service: ", svname, " -- please make a bug report") ;
 
-    if (isparsed && !force)
-        log_warn_return(2, "ignoring service: ", svname, " -- already parsed") ;
+    if (isparsed == STATE_FLAGS_TRUE) {
+
+        if (!force)
+            log_warn_return(2, "ignoring service: ", svname, " -- already parsed") ;
+    }
 
     if (info->opt_tree) {
 
@@ -237,7 +240,7 @@ int parse_frontend(char const *sv, resolve_service_t *ares, unsigned int *aresle
     }
 
     /** parse interdependences if the service was never parsed */
-    if (!isparsed) {
+    if (isparsed == STATE_FLAGS_FALSE) {
 
         if (!parse_interdependences(svname, res.sa.s + res.dependencies.depends, res.dependencies.ndepends, ares, areslen, info, force, conf, forced_directory, main, inmodule))
                 log_dieu(LOG_EXIT_SYS, "parse dependencies of service: ", svname) ;
diff --git a/src/lib66/parse/parse_service.c b/src/lib66/parse/parse_service.c
index 4d2b1aa8..18536647 100644
--- a/src/lib66/parse/parse_service.c
+++ b/src/lib66/parse/parse_service.c
@@ -65,6 +65,7 @@ void parse_service(char const *sv, ssexec_t *info, uint8_t force, uint8_t conf)
     int r ;
     unsigned int areslen = 0, count = 0, pos = 0 ;
     resolve_service_t ares[SS_MAX_SERVICE] ;
+    ss_state_t sta = STATE_ZERO ;
 
     char main[strlen(sv) + 1] ;
     if (!ob_basename(main, sv))
@@ -85,24 +86,19 @@ void parse_service(char const *sv, ssexec_t *info, uint8_t force, uint8_t conf)
 
         sanitize_write(&ares[pos], force) ;
 
-        if (!service_resolve_write(&ares[pos]))
-            log_dieu(LOG_EXIT_SYS, "write resolve file of service: ", ares[pos].sa.s + ares[pos].name) ;
-
         write_services(&ares[pos], ares[pos].sa.s + ares[pos].path.servicedir) ;
 
-        ss_state_t sta = STATE_ZERO ;
-
         if (state_check(&ares[pos])) {
 
             if (!state_read(&sta, &ares[pos]))
                 log_dieu(LOG_EXIT_SYS, "read state file of: ", ares[pos].sa.s + ares[pos].name) ;
-
         }
 
-        FLAGS_SET(sta.toinit, STATE_FLAGS_TRUE) ;
-        FLAGS_SET(sta.isparsed, STATE_FLAGS_TRUE) ;
-        FLAGS_SET(sta.isearlier, ares[pos].earlier ? STATE_FLAGS_TRUE : STATE_FLAGS_FALSE) ;
-        FLAGS_SET(sta.isdownfile, ares[pos].execute.down ? STATE_FLAGS_TRUE : STATE_FLAGS_FALSE) ;
+        state_set_flag(&sta, STATE_FLAGS_TOINIT, STATE_FLAGS_TRUE) ;
+        state_set_flag(&sta, STATE_FLAGS_TOPARSE, STATE_FLAGS_FALSE) ;
+        state_set_flag(&sta, STATE_FLAGS_ISPARSED, STATE_FLAGS_TRUE) ;
+        state_set_flag(&sta, STATE_FLAGS_ISEARLIER, ares[pos].earlier ? STATE_FLAGS_TRUE : STATE_FLAGS_FALSE) ;
+        state_set_flag(&sta, STATE_FLAGS_ISDOWNFILE, ares[pos].execute.down ? STATE_FLAGS_TRUE : STATE_FLAGS_FALSE) ;
 
         if (!state_write(&sta, &ares[pos]))
             log_dieu(LOG_EXIT_SYS, "write state file of: ", ares[pos].sa.s + ares[pos].name) ;
diff --git a/src/lib66/service/service_graph_build.c b/src/lib66/service/service_graph_build.c
index 6a5fce7c..c593c6e2 100644
--- a/src/lib66/service/service_graph_build.c
+++ b/src/lib66/service/service_graph_build.c
@@ -51,7 +51,7 @@ static void issupervised(char *store, resolve_service_t *ares, unsigned int ares
         if (!state_read(&ste, &ares[aresid]))
             continue ;
 
-        if (service_is(&ste, STATE_FLAGS_ISSUPERVISED))
+        if (service_is(&ste, STATE_FLAGS_ISSUPERVISED) == STATE_FLAGS_TRUE)
             auto_strings(store + strlen(store), name, " ") ;
         else
             continue ;
diff --git a/src/lib66/service/service_is_g.c b/src/lib66/service/service_is_g.c
index cf36bd69..9995570e 100644
--- a/src/lib66/service/service_is_g.c
+++ b/src/lib66/service/service_is_g.c
@@ -35,40 +35,42 @@ int service_is(ss_state_t *ste, uint32_t flag)
 
     switch (flag) {
 
-        case STATE_FLAGS_TOINIT : return FLAGS_ISSET(ste->toinit, STATE_FLAGS_TRUE) ? 1 : 0 ;
+        case STATE_FLAGS_TOINIT : return ste->toinit ;
 
-        case STATE_FLAGS_TORELOAD: return FLAGS_ISSET(ste->toreload, STATE_FLAGS_TRUE) ? 1 : 0 ;
+        case STATE_FLAGS_TORELOAD: return ste->toreload ;
 
-        case STATE_FLAGS_TORESTART : return FLAGS_ISSET(ste->torestart, STATE_FLAGS_TRUE) ? 1 : 0 ;
+        case STATE_FLAGS_TORESTART : return ste->torestart ;
 
-        case STATE_FLAGS_TOUNSUPERVISE : return FLAGS_ISSET(ste->tounsupervise, STATE_FLAGS_TRUE) ? 1 : 0 ;
+        case STATE_FLAGS_TOUNSUPERVISE : return ste->tounsupervise ;
 
-        case STATE_FLAGS_TOPARSE : return FLAGS_ISSET(ste->toparse, STATE_FLAGS_TRUE) ? 1 : 0 ;
+        case STATE_FLAGS_TOPARSE : return ste->toparse ;
 
-        case STATE_FLAGS_ISDOWNFILE : return FLAGS_ISSET(ste->isdownfile, STATE_FLAGS_TRUE) ? 1 : 0 ;
+        case STATE_FLAGS_TOSWITCH : return ste->toswitch ;
 
-        case STATE_FLAGS_ISEARLIER : return FLAGS_ISSET(ste->isearlier, STATE_FLAGS_TRUE) ? 1 : 0 ;
+        case STATE_FLAGS_ISDOWNFILE : return ste->isdownfile ;
 
-        case STATE_FLAGS_ISENABLED : return FLAGS_ISSET(ste->isenabled, STATE_FLAGS_TRUE) ? 1 : 0 ;
+        case STATE_FLAGS_ISEARLIER : return ste->isearlier ;
 
-        case STATE_FLAGS_ISPARSED : return  FLAGS_ISSET(ste->isparsed, STATE_FLAGS_TRUE) ? 1 : 0 ; //always true framboise
+        case STATE_FLAGS_ISENABLED : return ste->isenabled ;
 
-        case STATE_FLAGS_ISSUPERVISED : return FLAGS_ISSET(ste->issupervised, STATE_FLAGS_TRUE) ? 1 : 0 ;
+        case STATE_FLAGS_ISPARSED : return ste->isparsed ; //always true framboise
 
-        case STATE_FLAGS_ISUP : return FLAGS_ISSET(ste->isup, STATE_FLAGS_TRUE) ? 1 : 0 ;
+        case STATE_FLAGS_ISSUPERVISED : return ste->issupervised ;
+
+        case STATE_FLAGS_ISUP : return ste->isup ;
 
         default:
             break ;
 
     }
 
-    return 0 ;
+    return STATE_FLAGS_FALSE ;
 }
 
 /*@Return :
  * -1 system error
  * 0 check fail
- * 1 check success */
+ * STATE_FLAGS_TRUE/STATE_FLAGS_FALSE check success */
 int service_is_g(char *atree, char const *name, uint32_t flag)
 {
 
@@ -106,7 +108,7 @@ int service_is_g(char *atree, char const *name, uint32_t flag)
         goto freed ;
     }
 
-    if (strlen(res.sa.s + res.treename) > SS_MAX_TREENAME) {
+    if (strlen(res.sa.s + res.treename) >= SS_MAX_TREENAME) {
         errno = ENAMETOOLONG ;
         goto freed ;
     }
diff --git a/src/lib66/svc/svc_compute_ns.c b/src/lib66/svc/svc_compute_ns.c
index c429ce2f..3cb16c72 100644
--- a/src/lib66/svc/svc_compute_ns.c
+++ b/src/lib66/svc/svc_compute_ns.c
@@ -85,12 +85,12 @@ static void pidservice_init_array(unsigned int *list, unsigned int listlen, pids
 
         if (ares[pids.aresid].type != TYPE_CLASSIC) {
 
-                ss_state_t ste = STATE_ZERO ;
+                ss_state_t sta = STATE_ZERO ;
 
-                if (!state_read(&ste, &ares[pids.aresid]))
+                if (!state_read(&sta, &ares[pids.aresid]))
                     log_dieusys(LOG_EXIT_SYS, "read state file of: ", name) ;
 
-                if (ste.isup == STATE_FLAGS_TRUE)
+                if (service_is(&sta, STATE_FLAGS_ISUP) == STATE_FLAGS_TRUE)
                     FLAGS_SET(pids.state, SVC_FLAGS_UP) ;
                 else
                     FLAGS_SET(pids.state, SVC_FLAGS_DOWN) ;
@@ -172,7 +172,7 @@ int svc_compute_ns(resolve_service_t *res, uint8_t what, ssexec_t *info, char co
     }
 
     if (!what)
-        sanitize_init(list, napid, &graph, ares, areslen, STATE_FLAGS_UNKNOWN) ;
+        sanitize_init(list, napid, &graph, ares, areslen) ;
 
     pidservice_t apids[napid] ;
 
-- 
GitLab