From 80b310bb5ae03bd2f30c3ae54297e658dc6a0b92 Mon Sep 17 00:00:00 2001
From: obarun <eric@obarun.org>
Date: Sun, 21 May 2023 21:02:29 +1100
Subject: [PATCH] add version, notify, maxdeath and earlier field

---
 src/lib66/exec/ssexec_status.c | 105 ++++++++++++++++++++-------------
 1 file changed, 64 insertions(+), 41 deletions(-)

diff --git a/src/lib66/exec/ssexec_status.c b/src/lib66/exec/ssexec_status.c
index 7c3c061c..76d30f49 100644
--- a/src/lib66/exec/ssexec_status.c
+++ b/src/lib66/exec/ssexec_status.c
@@ -51,22 +51,6 @@
 
 #include <s6/supervise.h>
 
-/**
- *
- *
- *
- *
- * a revoir, notamment les fonctions appeler comme optsdeps
- *le tname pour le tree etc etc
- *
- *
- *
- *
- *
- *
- *
- *
- * */
 static unsigned int REVERSE = 0 ;
 static unsigned int NOFIELD = 1 ;
 static unsigned int GRAPH = 0 ;
@@ -76,11 +60,14 @@ static wchar_t const field_suffix[] = L" :" ;
 static char fields[INFO_NKEY][INFO_FIELD_MAXLEN] = {{ 0 }} ;
 static void info_display_string(char const *str) ;
 static void info_display_name(char const *field, resolve_service_t *res) ;
+static void info_display_version(char const *field, resolve_service_t *res) ;
 static void info_display_intree(char const *field, resolve_service_t *res) ;
 static void info_display_status(char const *field, resolve_service_t *res) ;
 static void info_display_type(char const *field, resolve_service_t *res) ;
 static void info_display_description(char const *field, resolve_service_t *res) ;
-static void info_display_version(char const *field, resolve_service_t *res) ;
+static void info_display_notify(char const *field, resolve_service_t *res) ;
+static void info_display_maxdeath(char const *field, resolve_service_t *res) ;
+static void info_display_earlier(char const *field, resolve_service_t *res) ;
 static void info_display_source(char const *field, resolve_service_t *res) ;
 static void info_display_live(char const *field, resolve_service_t *res) ;
 static void info_display_deps(char const *field, resolve_service_t *res) ;
@@ -107,23 +94,26 @@ static info_opts_map_t const opts_sv_table[] =
     { .str = "status", .svfunc = &info_display_status, .id = 3 },
     { .str = "type", .svfunc = &info_display_type, .id = 4 },
     { .str = "description", .svfunc = &info_display_description, .id = 5 },
-    { .str = "source", .svfunc = &info_display_source, .id = 6 },
-    { .str = "live", .svfunc = &info_display_live, .id = 7 },
-    { .str = "depends", .svfunc = &info_display_deps, .id = 8 },
-    { .str = "requiredby", .svfunc = &info_display_requiredby, .id = 9 },
-    { .str = "optsdepends", .svfunc = &info_display_optsdeps, .id = 10 },
-    { .str = "contents", .svfunc = &info_display_contents, .id = 11 },
-    { .str = "start", .svfunc = &info_display_start, .id = 12 },
-    { .str = "stop", .svfunc = &info_display_stop, .id = 13 },
-    { .str = "envat", .svfunc = &info_display_envat, .id = 14 },
-    { .str = "envfile", .svfunc = &info_display_envfile, .id = 15 },
-    { .str = "logname", .svfunc = &info_display_logname, .id = 16 },
-    { .str = "logdst", .svfunc = &info_display_logdst, .id = 17 },
-    { .str = "logfile", .svfunc = &info_display_logfile, .id = 18 },
+    { .str = "notify", .svfunc = &info_display_notify, .id = 6 },
+    { .str = "maxdeath", .svfunc = &info_display_maxdeath, .id = 7 },
+    { .str = "earlier", .svfunc = &info_display_earlier, .id = 8 },
+    { .str = "source", .svfunc = &info_display_source, .id = 9 },
+    { .str = "live", .svfunc = &info_display_live, .id = 10 },
+    { .str = "depends", .svfunc = &info_display_deps, .id = 11 },
+    { .str = "requiredby", .svfunc = &info_display_requiredby, .id = 12 },
+    { .str = "optsdepends", .svfunc = &info_display_optsdeps, .id = 13 },
+    { .str = "contents", .svfunc = &info_display_contents, .id = 14 },
+    { .str = "start", .svfunc = &info_display_start, .id = 15 },
+    { .str = "stop", .svfunc = &info_display_stop, .id = 16 },
+    { .str = "envat", .svfunc = &info_display_envat, .id = 17 },
+    { .str = "envfile", .svfunc = &info_display_envfile, .id = 18 },
+    { .str = "logname", .svfunc = &info_display_logname, .id = 19 },
+    { .str = "logdst", .svfunc = &info_display_logdst, .id = 20 },
+    { .str = "logfile", .svfunc = &info_display_logfile, .id = 21 },
     { .str = 0, .svfunc = 0, .id = -1 }
 } ;
 
-#define MAXOPTS 20
+#define MAXOPTS 23
 #define checkopts(n) if (n >= MAXOPTS) log_die(LOG_EXIT_USER, "too many options")
 #define DELIM ','
 
@@ -167,6 +157,18 @@ static void info_display_string(char const *str)
             log_dieusys(LOG_EXIT_SYS,"write to stdout") ;
 }
 
+static void info_display_int(uint32_t element)
+{
+    char ui[UINT_FMT] ;
+    ui[uint_fmt(ui, element)] = 0 ;
+
+    if (!buffer_puts(buffer_1, ui))
+        log_dieusys(LOG_EXIT_SYS, "write to stdout") ;
+
+    if (buffer_putsflush(buffer_1, "\n") == -1)
+        log_dieusys(LOG_EXIT_SYS, "write to stdout") ;
+}
+
 static void info_display_name(char const *field, resolve_service_t *res)
 {
     if (NOFIELD) info_display_field_name(field) ;
@@ -221,11 +223,11 @@ static void info_get_status(resolve_service_t *res)
         if (!state_read(&sta, res))
             log_dieusys(LOG_EXIT_SYS,"read state of: ", res->sa.s + res->name) ;
 
-        if (!service_is(&sta, STATE_FLAGS_ISSUPERVISED)) {
+        if (service_is(&sta, STATE_FLAGS_ISSUPERVISED) == STATE_FLAGS_FALSE) {
 
             status = "unsupervised" ;
 
-        } else if (!service_is(&sta, STATE_FLAGS_ISUP)) {
+        } else if (service_is(&sta, STATE_FLAGS_ISUP) == STATE_FLAGS_FALSE) {
 
             status = "down" ;
             warn_color = 1 ;
@@ -253,7 +255,7 @@ static void info_display_status(char const *field,resolve_service_t *res)
 
     disen = service_is(&ste, STATE_FLAGS_ISENABLED) ;
 
-    if (!bprintf(buffer_1,"%s%s%s%s", disen ? log_color->valid : log_color->warning, disen ? "enabled" : "disabled", log_color->off, ", "))
+    if (!bprintf(buffer_1,"%s%s%s%s", disen == STATE_FLAGS_TRUE ? log_color->valid : log_color->warning, disen == STATE_FLAGS_TRUE ? "enabled" : "disabled", log_color->off, ", "))
         log_dieusys(LOG_EXIT_SYS,"write to stdout") ;
 
     if (buffer_putsflush(buffer_1,"") == -1)
@@ -275,6 +277,24 @@ static void info_display_description(char const *field,resolve_service_t *res)
     info_display_string(res->sa.s + res->description) ;
 }
 
+static void info_display_notify(char const *field,resolve_service_t *res)
+{
+    if (NOFIELD) info_display_field_name(field) ;
+    info_display_int(res->notify) ;
+}
+
+static void info_display_maxdeath(char const *field, resolve_service_t *res)
+{
+    if (NOFIELD) info_display_field_name(field) ;
+    info_display_int(res->maxdeath) ;
+}
+
+static void info_display_earlier(char const *field,resolve_service_t *res)
+{
+    if (NOFIELD) info_display_field_name(field) ;
+    info_display_int(res->earlier) ;
+}
+
 static void info_display_source(char const *field,resolve_service_t *res)
 {
     if (NOFIELD) info_display_field_name(field) ;
@@ -440,7 +460,7 @@ static void info_display_deps(char const *field, resolve_service_t *res)
         graph_free_all(&graph) ;
         stralloc_free(&deps) ;
 }
-
+/*
 static void info_display_with_source_tree(stralloc *list, resolve_service_t *res)
 {
     size_t pos = 0, lpos = 0 ;
@@ -482,13 +502,13 @@ static void info_display_with_source_tree(stralloc *list, resolve_service_t *res
 
     list->len = pos = 0 ;
     FOREACH_SASTR(&tmp, pos)
-        if (!stralloc_catb(list, tmp.s + pos, strlen(tmp.s + pos) + 1))
+        if (!sastr_add_string(list, tmp.s + pos))
             log_die_nomem("stralloc") ;
 
     stralloc_free (&sa) ;
     stralloc_free (&tmp) ;
 }
-
+*/
 static void info_display_optsdeps(char const *field, resolve_service_t *res)
 {
     stralloc salist = STRALLOC_ZERO ;
@@ -501,7 +521,7 @@ static void info_display_optsdeps(char const *field, resolve_service_t *res)
     if (!sastr_clean_string(&salist,res->sa.s + res->dependencies.optsdeps))
         log_dieu(LOG_EXIT_SYS,"build optionnal dependencies list") ;
 
-    info_display_with_source_tree(&salist,res) ;
+    //info_display_with_source_tree(&salist,res) ;
 
     if (REVERSE)
         if (!sastr_reverse(&salist))
@@ -531,7 +551,7 @@ static void info_display_contents(char const *field, resolve_service_t *res)
     if (!sastr_clean_string(&salist,res->sa.s + res->dependencies.contents))
         log_dieu(LOG_EXIT_SYS,"build contents list") ;
 
-    info_display_with_source_tree(&salist,res) ;
+    //info_display_with_source_tree(&salist,res) ;
 
     if (REVERSE)
         if (!sastr_reverse(&salist))
@@ -876,6 +896,9 @@ int ssexec_status(int argc, char const *const *argv, ssexec_t *info)
         "Status",
         "Type",
         "Description",
+        "Notify",
+        "Max death",
+        "Earlier",
         "Source",
         "Live",
         "Dependencies",
@@ -937,9 +960,9 @@ int ssexec_status(int argc, char const *const *argv, ssexec_t *info)
     if (r < 0)
         log_dieusys(LOG_EXIT_SYS, "get information of service: ", svname, " -- please make a bug report") ;
 
-    if (!r) {
+    if (!r || r == STATE_FLAGS_FALSE) {
         /** nothing to do */
-        log_1_warn("unknown service: ", svname) ;
+        log_1_warn("service: ", svname, " is not parsed -- try to parse it using '66 parse ", svname, "'") ;
         goto freed ;
     }
 
-- 
GitLab