From 1dea359d15e06576b99be6c09e85e69a8d29d301 Mon Sep 17 00:00:00 2001
From: obarun <eric@obarun.org>
Date: Sat, 15 Oct 2022 23:41:47 +1100
Subject: [PATCH] [WIP] adapt headers files

---
 src/include/66/66.h        |   5 +-
 src/include/66/constants.h |  43 ++--
 src/include/66/enum.h      |  34 +--
 src/include/66/environ.h   |   7 +-
 src/include/66/graph.h     |  18 +-
 src/include/66/info.h      |   2 +-
 src/include/66/parser.h    |   5 +-
 src/include/66/service.h   | 435 ++++++++++++++++++++++++-------------
 src/include/66/ssexec.h    |  86 +++++---
 src/include/66/svc.h       |  67 +-----
 src/include/66/utils.h     |   6 +-
 src/include/66/write.h     |   3 +-
 12 files changed, 408 insertions(+), 303 deletions(-)

diff --git a/src/include/66/66.h b/src/include/66/66.h
index 3c91c14c..cc013428 100644
--- a/src/include/66/66.h
+++ b/src/include/66/66.h
@@ -15,17 +15,16 @@
 #ifndef SS_CONFIG_H
 #define SS_CONFIG_H
 
-#include <66/backup.h>
 #include <66/config.h>
 #include <66/constants.h>
-#include <66/db.h>
 #include <66/enum.h>
 #include <66/environ.h>
+#include <66/graph.h>
 #include <66/hpr.h>
 #include <66/info.h>
 #include <66/parser.h>
-#include <66/rc.h>
 #include <66/resolve.h>
+#include <66/sanitize.h>
 #include <66/service.h>
 #include <66/ssexec.h>
 #include <66/state.h>
diff --git a/src/include/66/constants.h b/src/include/66/constants.h
index a754df73..e6bbc2f9 100644
--- a/src/include/66/constants.h
+++ b/src/include/66/constants.h
@@ -29,8 +29,6 @@
 #define SS_MODULE_LEN (sizeof SS_MODULE - 1)
 #define SS_SCANDIR "scandir"
 #define SS_SCANDIR_LEN (sizeof SS_SCANDIR - 1)
-#define SS_TREE "tree"
-#define SS_TREE_LEN (sizeof SS_TREE - 1)
 #define SS_NOTIFICATION "notification-fd"
 #define SS_NOTIFICATION_LEN (sizeof SS_NOTIFICATION - 1)
 #define SS_MAXDEATHTALLY "max-death-tally"
@@ -41,18 +39,11 @@
 #define SS_RULES_LEN (sizeof SS_RULES - 1)
 #define SS_SVDIRS "/servicedirs"
 #define SS_SVDIRS_LEN (sizeof SS_SVDIRS - 1)
-#define SS_BACKUP "/backup"
-#define SS_BACKUP_LEN (sizeof SS_BACKUP - 1)
-#define SS_LIVETREE_INIT "init"
-#define SS_LIVETREE_INIT_LEN (sizeof SS_LIVETREE_INIT - 1)
 
 /**service dir*/
 #define SS_SVC "/svc"
 #define SS_SVC_LEN (sizeof SS_SVC - 1)
-#define SS_DB "/db"
-#define SS_DB_LEN (sizeof SS_DB - 1)
-#define SS_SRC "/source"
-#define SS_SRC_LEN (sizeof SS_SRC - 1)
+
 #define SS_MASTER "/Master"
 #define SS_MASTER_LEN (sizeof SS_MASTER - 1)
 #define SS_CONTENTS "contents"
@@ -61,24 +52,13 @@
 /** logger */
 #define SS_LOG "log"
 #define SS_LOG_LEN (sizeof SS_LOG - 1)
-#define SS_LOG_SUFFIX "-" SS_LOG
+
+#define SS_LOG_SUFFIX "-log"
 #define SS_LOG_SUFFIX_LEN (sizeof SS_LOG_SUFFIX - 1)
+
 #define SS_SVSCAN_LOG "/.s6-svscan"
 #define SS_SVSCAN_LOG_LEN (sizeof SS_SVSCAN_LOG - 1)
 
-/** pipe */
-#define SS_PIPE_NAME "bundle-"
-#define SS_PIPE_NAME_LEN (sizeof SS_PIPE_NAME - 1)
-
-/** backup */
-#define SS_SYM_DB "bdb"
-#define SS_SYM_DB_LEN (sizeof SS_SYM_DB - 1)
-#define SS_SYM_SVC "bsvc"
-#define SS_SYM_SVC_LEN (sizeof SS_SYM_SVC - 1)
-
-#define SS_SWSRC 0 //switch to source
-#define SS_SWBACK 1 //switch to backup
-
 /** environment and data */
 #define SS_ENVDIR "/conf"
 #define SS_ENVDIR_LEN (sizeof SS_ENVDIR - 1)
@@ -89,6 +69,18 @@
 
 #define SS_STATE "/state"
 #define SS_STATE_LEN (sizeof SS_STATE - 1)
+#define SS_STATUS "status"
+#define SS_STATUS_LEN (sizeof SS_STATUS - 1)
+
+#define SS_RESOLVE "/.resolve"
+#define SS_RESOLVE_LEN (sizeof SS_RESOLVE - 1)
+
+#define SS_FDHOLDER "fdholder"
+#define SS_FDHOLDER_LEN (sizeof SS_FDHOLDER - 1)
+#define SS_FDHOLDER_PIPENAME "pipe:66-"
+#define SS_FDHOLDER_PIPENAME_LEN (sizeof SS_FDHOLDER_PIPENAME - 1)
+#define SS_ONESHOTD "oneshotd"
+#define SS_ONESHOTD_LEN (sizeof SS_ONESHOTD - 1)
 
 #define SS_VAR_UNEXPORT '!'
 
@@ -99,6 +91,7 @@
 
 #define SS_EVENTDIR "/event"
 #define SS_EVENTDIR_LEN (sizeof SS_EVENTDIR - 1)
+
 /** boot */
 #define SS_BOOT_CONF "init.conf"
 #define SS_BOOT_CONF_LEN (sizeof SS_BOOT_CONF - 1)
@@ -121,6 +114,7 @@
 #define SS_BOOT_LOGFIFO_LEN (sizeof SS_BOOT_LOGFIFO - 1)
 #define SS_BOOT_SHUTDOWND "66-shutdownd"
 #define SS_BOOT_SHUTDOWND_LEN (sizeof SS_BOOT_SHUTDOWND - 1)
+
 /** container */
 #define SS_BOOT_CONTAINER 0
 #define SS_BOOT_RCINIT_CONTAINER "rc.init.container"
@@ -138,4 +132,5 @@
 #define SS_INSTANCE_NAME 1
 
 #define SS_MAX_PATH_LEN (SS_MAX_PATH + SS_SYSTEM_LEN + SS_SVDIRS_LEN + SS_MAX_TREENAME + SS_MAX_SERVICE_NAME + 63 + 1)
+
 #endif
diff --git a/src/include/66/enum.h b/src/include/66/enum.h
index e3fce9ae..ae36bba2 100644
--- a/src/include/66/enum.h
+++ b/src/include/66/enum.h
@@ -35,7 +35,6 @@ enum enum_main_e
     ENUM_BUILD ,
     ENUM_MANDATORY ,
     ENUM_TIME ,
-    ENUM_LOGOPTS ,
     ENUM_SEED ,
     ENUM_ENDOFKEY
 } ;
@@ -60,10 +59,9 @@ enum enum_key_section_main_e
     KEY_MAIN_TYPE = 0 ,
     KEY_MAIN_VERSION ,
     KEY_MAIN_DESCRIPTION ,
-    KEY_MAIN_CONTENTS ,
     KEY_MAIN_DEPENDS ,
+    KEY_MAIN_REQUIREDBY ,
     KEY_MAIN_OPTSDEPS ,
-    KEY_MAIN_EXTDEPS ,
     KEY_MAIN_OPTIONS ,
     KEY_MAIN_NOTIFY ,
     KEY_MAIN_USER ,
@@ -106,7 +104,6 @@ enum enum_key_section_logger_e
     KEY_LOGGER_TIMESTP ,
     KEY_LOGGER_T_FINISH ,
     KEY_LOGGER_T_KILL ,
-    KEY_LOGGER_DEPENDS ,
     KEY_LOGGER_ENDOFKEY
 } ;
 
@@ -129,6 +126,7 @@ enum enum_key_section_regex_e
     KEY_REGEX_FILES ,
     KEY_REGEX_INFILES ,
     KEY_REGEX_ADDSERVICES ,
+    KEY_REGEX_APPLYTO ,
     KEY_REGEX_ENDOFKEY
 } ;
 
@@ -139,7 +137,6 @@ enum enum_type_e
 {
     TYPE_CLASSIC = 0 ,
     TYPE_BUNDLE ,
-    TYPE_LONGRUN ,
     TYPE_ONESHOT ,
     TYPE_MODULE ,
     TYPE_ENDOFKEY
@@ -167,8 +164,6 @@ enum enum_opts_e
 {
     OPTS_LOGGER = 0 ,
     OPTS_ENVIR ,
-    OPTS_HIERCOPY ,
-    OPTS_PIPELINE ,
     OPTS_ENDOFKEY
 } ;
 
@@ -178,6 +173,7 @@ typedef enum enum_flags_e enum_flags_t, *enum_flags_t_ref ;
 enum enum_flags_e
 {
     FLAGS_DOWN = 0 ,
+    FLAGS_EARLIER,
     FLAGS_ENDOFKEY
 } ;
 
@@ -216,17 +212,6 @@ enum enum_time_e
 
 extern char const *enum_str_time[] ;
 
-typedef enum enum_logopts_e enum_logotps_t, *enum_logopts_t_ref ;
-enum enum_logopts_e
-{
-    LOGOPTS_PRODUCER = 0 ,
-    LOGOPTS_CONSUMER ,
-    LOGOPTS_PIPE ,
-    LOGOPTS_ENDOFKEY
-} ;
-
-extern char const *enum_str_logopts[] ;
-
 typedef enum enum_seed_e enum_seed_t, *enum_seed_t_ref ;
 enum enum_seed_e
 {
@@ -294,10 +279,9 @@ static key_description_t const main_section_list[] =
     { .name = &enum_str_key_section_main[KEY_MAIN_TYPE], .id = KEY_MAIN_TYPE, .expected = EXPECT_LINE },
     { .name = &enum_str_key_section_main[KEY_MAIN_VERSION], .id = KEY_MAIN_VERSION, .expected = EXPECT_LINE },
     { .name = &enum_str_key_section_main[KEY_MAIN_DESCRIPTION], .id = KEY_MAIN_DESCRIPTION, .expected = EXPECT_QUOTE },
-    { .name = &enum_str_key_section_main[KEY_MAIN_CONTENTS], .id = KEY_MAIN_CONTENTS, .expected = EXPECT_BRACKET },
     { .name = &enum_str_key_section_main[KEY_MAIN_DEPENDS], .id = KEY_MAIN_DEPENDS, .expected = EXPECT_BRACKET },
+    { .name = &enum_str_key_section_main[KEY_MAIN_REQUIREDBY], .id = KEY_MAIN_REQUIREDBY, .expected = EXPECT_BRACKET },
     { .name = &enum_str_key_section_main[KEY_MAIN_OPTSDEPS], .id = KEY_MAIN_OPTSDEPS, .expected = EXPECT_BRACKET },
-    { .name = &enum_str_key_section_main[KEY_MAIN_EXTDEPS], .id = KEY_MAIN_EXTDEPS, .expected = EXPECT_BRACKET },
     { .name = &enum_str_key_section_main[KEY_MAIN_OPTIONS], .id = KEY_MAIN_OPTIONS, .expected = EXPECT_BRACKET },
     { .name = &enum_str_key_section_main[KEY_MAIN_NOTIFY], .id = KEY_MAIN_NOTIFY, .expected = EXPECT_UINT },
     { .name = &enum_str_key_section_main[KEY_MAIN_USER], .id = KEY_MAIN_USER, .expected = EXPECT_BRACKET },
@@ -324,17 +308,16 @@ static key_description_t const startstop_section_list[] =
 
 static key_description_t const logger_section_list[] =
 {
-    { .name = &enum_str_key_section_logger[KEY_LOGGER_DESTINATION], .id = KEY_LOGGER_DESTINATION, .expected = EXPECT_SLASH },
     { .name = &enum_str_key_section_logger[KEY_LOGGER_BUILD], .id = KEY_LOGGER_BUILD, .expected = EXPECT_LINE },
     { .name = &enum_str_key_section_logger[KEY_LOGGER_RUNAS], .id = KEY_LOGGER_RUNAS, .expected = EXPECT_LINE },
-    { .name = &enum_str_key_section_logger[KEY_LOGGER_DEPENDS], .id = KEY_LOGGER_DEPENDS, .expected = EXPECT_BRACKET },
     { .name = &enum_str_key_section_logger[KEY_LOGGER_SHEBANG], .id = KEY_LOGGER_SHEBANG, .expected = EXPECT_QUOTE },
-    { .name = &enum_str_key_section_logger[KEY_LOGGER_T_FINISH], .id = KEY_LOGGER_T_FINISH, .expected = EXPECT_UINT },
-    { .name = &enum_str_key_section_logger[KEY_LOGGER_T_KILL], .id = KEY_LOGGER_T_KILL, .expected = EXPECT_UINT },
+    { .name = &enum_str_key_section_logger[KEY_LOGGER_EXEC], .id = KEY_LOGGER_EXEC, .expected = EXPECT_BRACKET },
+    { .name = &enum_str_key_section_logger[KEY_LOGGER_DESTINATION], .id = KEY_LOGGER_DESTINATION, .expected = EXPECT_SLASH },
     { .name = &enum_str_key_section_logger[KEY_LOGGER_BACKUP], .id = KEY_LOGGER_BACKUP, .expected = EXPECT_UINT },
     { .name = &enum_str_key_section_logger[KEY_LOGGER_MAXSIZE], .id = KEY_LOGGER_MAXSIZE, .expected = EXPECT_UINT },
     { .name = &enum_str_key_section_logger[KEY_LOGGER_TIMESTP], .id = KEY_LOGGER_TIMESTP, .expected = EXPECT_LINE },
-    { .name = &enum_str_key_section_logger[KEY_LOGGER_EXEC], .id = KEY_LOGGER_EXEC, .expected = EXPECT_BRACKET },
+    { .name = &enum_str_key_section_logger[KEY_LOGGER_T_FINISH], .id = KEY_LOGGER_T_FINISH, .expected = EXPECT_UINT },
+    { .name = &enum_str_key_section_logger[KEY_LOGGER_T_KILL], .id = KEY_LOGGER_T_KILL, .expected = EXPECT_UINT },
     { .name = &enum_str_key_section_logger[KEY_LOGGER_ENDOFKEY] }
 } ;
 
@@ -374,5 +357,6 @@ static key_all_t const total_list[] =
     { .list = 0 }
 } ;
 
+extern char const *get_key_by_key_all(int const idsec, int const key) ;
 
 #endif
diff --git a/src/include/66/environ.h b/src/include/66/environ.h
index 2b93ec63..b531c2e5 100644
--- a/src/include/66/environ.h
+++ b/src/include/66/environ.h
@@ -21,12 +21,13 @@
 #include <skalibs/stralloc.h>
 
 #include <66/parser.h>
+#include <66/service.h>
 
 extern int env_resolve_conf(stralloc *env,char const *svname,uid_t owner) ;
-extern int env_make_symlink(sv_alltype *sv) ;
-extern int env_compute(stralloc *result,sv_alltype *sv, uint8_t conf) ;
+extern int env_make_symlink(resolve_service_t *res) ;
+extern int env_compute(stralloc *result, resolve_service_t *res) ;
 extern int env_clean_with_comment(stralloc *sa) ;
-extern int env_prepare_for_write(stralloc *name, stralloc *dst, stralloc *contents, sv_alltype *sv,uint8_t conf) ;
+extern int env_prepare_for_write(stralloc *dst, stralloc *contents, resolve_service_t *res) ;
 
 /** version function */
 extern int env_find_current_version(stralloc *sa,char const *svconf) ;
diff --git a/src/include/66/graph.h b/src/include/66/graph.h
index f644c366..fc36ffef 100644
--- a/src/include/66/graph.h
+++ b/src/include/66/graph.h
@@ -19,11 +19,19 @@
 
 #include <oblibs/graph.h>
 
-extern int graph_build_g(graph_t *g, char const *base, char const *treename, uint8_t data_type, uint8_t general) ;
-extern int graph_build_tree(graph_t *g,char const *base) ;
-extern int graph_build_service(graph_t *g, char const *base, char const *treename, uint8_t general) ;
-extern int graph_build_service_bytree(graph_t *g, char const *tree, uint8_t what) ;
+#include <66/service.h>
+#include <66/ssexec.h>
+
+
+
+//extern void graph_build_g(graph_t *graph, resolve_service_t *ares, unsigned int *areslen, ssexec_t *info) ;
+extern void graph_build_tree(graph_t *g,char const *base) ;
+extern void graph_build_service(graph_t *g, resolve_service_t *ares, unsigned int *areslen, ssexec_t *info, uint32_t flag) ;
+extern int graph_compute_dependencies(graph_t *g, char const *vertex, char const *edge, uint8_t requiredby) ;
+
+
+extern int graph_build_service_bytree(graph_t *g, char const *tree, uint8_t what,  uint8_t is_supervised) ;
 extern int graph_build_service_bytree_from_src(graph_t *g, char const *src, uint8_t what) ;
-extern int graph_add_deps(graph_t *g, char const *vertex, char const *edge, uint8_t requiredby) ;
+
 
 #endif
diff --git a/src/include/66/info.h b/src/include/66/info.h
index af9afdcf..e00361da 100644
--- a/src/include/66/info.h
+++ b/src/include/66/info.h
@@ -26,7 +26,7 @@
 #define SS_INFO_H
 
 #define INFO_FIELD_MAXLEN 30
-#define INFO_NKEY 100
+#define INFO_NKEY 150
 
 typedef int info_graph_func(char const *name, char const *obj) ;
 typedef info_graph_func *info_graph_func_t_ref ;
diff --git a/src/include/66/parser.h b/src/include/66/parser.h
index 7db31619..b2da8b7c 100644
--- a/src/include/66/parser.h
+++ b/src/include/66/parser.h
@@ -46,7 +46,7 @@ extern void ssexec_enable_cleanup(void) ;
 /** main */
 extern void start_parser(char const *sv, ssexec_t *info, uint8_t disable_module, char const *directory_forced) ;
 
-extern void parser(char const *sv, char const *dst, ssexec_t *info, uint8_t force, uint8_t conf) ;
+extern void parse_service(char const *sv, ssexec_t *info, uint8_t force, uint8_t conf) ;
 extern int parse_frontend(char const *sv, resolve_service_t *ares, unsigned int *areslen, ssexec_t *info, uint8_t force, uint8_t conf, unsigned int *residx, char const *forced_directory) ;
 extern int parse_dependencies(resolve_service_t *res, resolve_service_t *ares, unsigned int *areslen, ssexec_t *info, uint8_t force,uint8_t conf, char const *forced_directory) ;
 
@@ -77,4 +77,7 @@ extern void parse_error(int ierr, int idsec, int idkey) ;
 /** module */
 extern void parse_module(resolve_service_t *res, resolve_service_t *ares, unsigned int *areslen, ssexec_t *info, uint8_t force) ;
 
+/** resolve */
+extern void parse_compute_resolve(resolve_service_t *res, ssexec_t *info) ;
+
 #endif
diff --git a/src/include/66/service.h b/src/include/66/service.h
index 116cb80a..e0bd8787 100644
--- a/src/include/66/service.h
+++ b/src/include/66/service.h
@@ -17,52 +17,146 @@
 
 #include <stdint.h>
 
+#include <oblibs/graph.h>
+
 #include <skalibs/stralloc.h>
-#include <skalibs/genalloc.h>
 #include <skalibs/cdb.h>
 #include <skalibs/cdbmake.h>
 
-#include <66/parser.h>
 #include <66/ssexec.h>
 #include <66/resolve.h>
+#include <66/state.h>
 
-/**
- *
- *
- * obsolete functions
- *
- *
- *
- * */
+typedef struct resolve_service_addon_path_s resolve_service_addon_path_t, *resolve_service_addon_path_t_ref ;
+struct resolve_service_addon_path_s
+{
+    uint32_t home ; // string, /var/lib/66 or /home/user/.66
+    uint32_t frontend ;  // string, /home/<user>/.66/service or /etc/66/service or /usr/lib/66/service
+    uint32_t tree ; // string, /var/lib/66/system/treename
+    uint32_t status ; //string, /var/lib/66/system/treename/servicedirs/svc/service_name/state/status
+} ;
+
+#define RESOLVE_SERVICE_ADDON_PATH_ZERO { 0,0,0,0 }
 
-/** Graph struct */
-typedef struct ss_resolve_graph_ndeps_s ss_resolve_graph_ndeps_t ;
-struct ss_resolve_graph_ndeps_s
+typedef struct resolve_service_addon_dependencies_s resolve_service_addon_dependencies_t, *resolve_service_addon_dependencies_t_ref ;
+struct resolve_service_addon_dependencies_s
 {
-    uint32_t idx ;//uint32_t
-    genalloc ndeps ;//uint32_t
+    uint32_t depends ; // string
+    uint32_t requiredby ; // string,
+    uint32_t optsdeps ; // string, optional dependencies
+
+    uint32_t ndepends ; // integer
+    uint32_t nrequiredby ; // integer
+    uint32_t noptsdeps ; // integer
 } ;
-#define RESOLVE_GRAPH_NDEPS_ZERO { 0 , GENALLOC_ZERO }
 
-typedef struct ss_resolve_graph_s ss_resolve_graph_t, *ss_resolve_graph_t_ref ;
-struct ss_resolve_graph_s
+#define RESOLVE_SERVICE_ADDON_DEPENDENCIES_ZERO { 0,0,0,0,0,0 }
+
+typedef struct resolve_service_addon_timeout_s resolve_service_addon_timeout_t, *resolve_service_addon_timeout_t_ref ;
+struct resolve_service_addon_timeout_s
 {
-    genalloc name ;//resolve_service_t
-    genalloc cp ; //ss_resolve_graph_ndeps_t
-    genalloc sorted ;//resolve_service_t
+    uint32_t kill ; // integer
+    uint32_t finish ; // integer
+    uint32_t up ; // integer
+    uint32_t down ; // integer
 } ;
-#define RESOLVE_GRAPH_ZERO { GENALLOC_ZERO , GENALLOC_ZERO , GENALLOC_ZERO }
 
-typedef enum visit_e visit ;
-enum visit_e
+#define RESOLVE_SERVICE_ADDON_TIMEOUT_ZERO { 0,0,0,0 }
+
+typedef struct resolve_service_addon_scripts_s resolve_service_addon_scripts_t, *resolve_service_addon_scritps_t_ref ;
+struct resolve_service_addon_scripts_s
 {
-    SS_WHITE = 0,
-    SS_GRAY,
-    SS_BLACK
+    uint32_t run ; // string, launch before @execute
+    uint32_t run_user ; // string, @execute field
+    uint32_t build ; // string, custom or execline
+    uint32_t shebang ; // string
+    uint32_t runas ; // string
+} ;
+
+#define RESOLVE_SERVICE_ADDON_SCRIPTS_ZERO { 0,0,0,0,0 }
+
+typedef struct resolve_service_addon_execute_s resolve_service_addon_execute_t, *resolve_service_addon_execute_t_ref ;
+struct resolve_service_addon_execute_s
+{
+    resolve_service_addon_scripts_t run ;
+    resolve_service_addon_scripts_t finish ;
+    resolve_service_addon_timeout_t timeout ;
+    uint32_t down ; // integer
+    uint32_t downsignal ; // integer
+} ;
+
+#define RESOLVE_SERVICE_ADDON_EXECUTE_ZERO { \
+    RESOLVE_SERVICE_ADDON_SCRIPTS_ZERO, \
+    RESOLVE_SERVICE_ADDON_SCRIPTS_ZERO, \
+    RESOLVE_SERVICE_ADDON_TIMEOUT_ZERO, \
+    0, \
+    0 \
+}
+
+typedef struct resolve_service_addon_live_s resolve_service_addon_live_t, *resolve_service_addon_live_t_ref ;
+struct resolve_service_addon_live_s
+{
+    uint32_t livedir ; // string, /run/66
+    uint32_t scandir ; // string, /run/66/state/uid/service_name/scandir/service_name -> /var/lib/66/system/treename/svc/service -> /run/66/scandir/uid
+    uint32_t statedir ; // string, /run/66/state/uid/service_name/state -> /var/lib/66/system/treename/svc/service/state
+    uint32_t eventdir ; // string, /run/66/state/uid/service_name/event -> /var/lib/66/system/treename/svc/service/event
+    uint32_t notifdir ; // string, /run/66/state/uid/service_name/notif -> /var/lib/66/system/treename/svc/service/notif
+    uint32_t supervisedir ; // string, /run/66/state/uid/service_name/supervise -> /var/lib/66/system/treename/svc/service/supervise
+    uint32_t fdholderdir ; // string, /run/66/state/uid/service_name/scandir/fdholder
+    uint32_t oneshotddir ; // string, /run/66/state/uid/service_name/scandir/oneshotd
+} ;
+
+#define RESOLVE_SERVICE_ADDON_LIVE_ZERO { 0,0,0,0,0,0,0,0 }
+
+typedef struct resolve_service_addon_logger_s resolve_service_addon_logger_t, *resolve_service_addon_logger_t_ref ;
+struct resolve_service_addon_logger_s
+{
+    // logger
+    uint32_t name ; // string, typically "name-log" or 0 if it's the resolve of the logger
+    uint32_t destination ; // string
+    uint32_t backup ; // integer
+    uint32_t maxsize ; // integer
+    /** integer, default 3 which mean not touched, in this case the value configured by
+     * at compilation take precedence */
+    uint32_t timestamp ;
+    uint32_t want ; // 1 want, 0 do not want. Want by default
+    resolve_service_addon_execute_t execute ;
+    resolve_service_addon_timeout_t timeout ;
+
+} ;
+
+#define RESOLVE_SERVICE_ADDON_LOGGER_ZERO { \
+    0,0,3,1000000,3,1, \
+    RESOLVE_SERVICE_ADDON_EXECUTE_ZERO, \
+    RESOLVE_SERVICE_ADDON_TIMEOUT_ZERO \
+}
+
+typedef struct resolve_service_addon_environ_s resolve_service_addon_environ_t, *resolve_service_addon_environ_t_ref ;
+struct resolve_service_addon_environ_s
+{
+    uint32_t env ; // string
+    uint32_t envdir ; // string, /etc/66/conf or /home/user/.66/conf
+    uint32_t env_overwrite ; // integer, overwrite the environment
+
+} ;
+
+#define RESOLVE_SERVICE_ADDON_ENVIRON_ZERO { 0,0,0 }
+
+typedef struct resolve_service_addon_regex_s resolve_service_addon_regex_t, *resolve_service_addon_regex_t_ref ;
+struct resolve_service_addon_regex_s
+{
+    uint32_t configure ; // string
+    uint32_t directories ; // string
+    uint32_t files ; // string
+    uint32_t infiles ; // string
+
+    uint32_t ndirectories ; // integer
+    uint32_t nfiles ; // integer
+    uint32_t ninfiles ; // integer
 } ;
 
-#define DATA_SERVICE 0
-#define DATA_SERVICE_MASTER 3
+#define RESOLVE_SERVICE_ADDON_REGEX_ZERO { 0,0,0,0,0,0,0 }
+
 
 typedef struct resolve_service_s resolve_service_t, *resolve_service_t_ref ;
 struct resolve_service_s
@@ -70,80 +164,134 @@ struct resolve_service_s
     uint32_t salen ;
     stralloc sa ;
 
-    uint32_t name ;
-    uint32_t description ;
-    uint32_t version ;
-    uint32_t logger ;
-    uint32_t logreal ;
-    uint32_t logassoc ;
-    uint32_t dstlog ;
-    uint32_t depends ; // for module -> list of s6-rc service
-    uint32_t requiredby ;
-    uint32_t optsdeps ; //optional dependencies
-    uint32_t extdeps ; //external dependencies
-    uint32_t contents ; // module -> list of s6-rc and s6 service
-    uint32_t src ;  //frontend source
-    uint32_t srconf ; //configuration file source
-    uint32_t live ; //run/66
-    uint32_t runat ; //livetree->longrun,scandir->svc
-    uint32_t tree ; //var/lib/66/system/tree
-    uint32_t treename ;
-    uint32_t state ; //run/66/state/uid/treename/
-    uint32_t exec_run ;
-    uint32_t exec_log_run ;
-    uint32_t real_exec_run ;
-    uint32_t real_exec_log_run ;
-    uint32_t exec_finish ;
-    uint32_t real_exec_finish ;
-
-    uint32_t type ;
-    uint32_t ndepends ;
-    uint32_t nrequiredby ;
-    uint32_t noptsdeps ;
-    uint32_t nextdeps ;
-    uint32_t ncontents ;
-    uint32_t down ;
-    uint32_t disen ;//disable->0,enable->1
+    // configuration
+    uint32_t name ; // string
+    uint32_t description ; // string
+    uint32_t version ;// string
+    uint32_t type ; // integer
+    uint32_t notify ; // integer
+    uint32_t maxdeath ; // integer
+    uint32_t earlier ; // integer
+    uint32_t hiercopy ; // string
+    uint32_t intree ; // string
+    uint32_t ownerstr ; // string
+    uint32_t owner ; // integer, uid of the owner
+    uint32_t treename ; // string
+    uint32_t user ; // string
+    uint32_t inmodule ; // string, name of the module wich depend on
+
+    resolve_service_addon_path_t path ;
+    resolve_service_addon_dependencies_t dependencies ;
+    resolve_service_addon_execute_t execute ;
+    resolve_service_addon_live_t live ;
+    resolve_service_addon_logger_t logger ;
+    resolve_service_addon_environ_t environ ;
+    resolve_service_addon_regex_t regex ;
+
 } ;
-#define RESOLVE_SERVICE_ZERO { 0,STRALLOC_ZERO,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+
+#define RESOLVE_SERVICE_ZERO { 0,STRALLOC_ZERO, \
+                               0,0,0,0,0,5,0,0,0,0,0,0,0,0, \
+                               RESOLVE_SERVICE_ADDON_PATH_ZERO, \
+                               RESOLVE_SERVICE_ADDON_DEPENDENCIES_ZERO, \
+                               RESOLVE_SERVICE_ADDON_EXECUTE_ZERO, \
+                               RESOLVE_SERVICE_ADDON_LIVE_ZERO, \
+                               RESOLVE_SERVICE_ADDON_LOGGER_ZERO, \
+                               RESOLVE_SERVICE_ADDON_ENVIRON_ZERO, \
+                               RESOLVE_SERVICE_ADDON_REGEX_ZERO }
+
+
 
 typedef enum resolve_service_enum_e resolve_service_enum_t, *resolve_service_enum_t_ref;
 enum resolve_service_enum_e
 {
-    SERVICE_ENUM_NAME = 0,
-    SERVICE_ENUM_DESCRIPTION,
-    SERVICE_ENUM_VERSION,
-    SERVICE_ENUM_LOGGER,
-    SERVICE_ENUM_LOGREAL,
-    SERVICE_ENUM_LOGASSOC,
-    SERVICE_ENUM_DSTLOG,
-    SERVICE_ENUM_DEPENDS,
-    SERVICE_ENUM_REQUIREDBY,
-    SERVICE_ENUM_OPTSDEPS,
-    SERVICE_ENUM_EXTDEPS,
-    SERVICE_ENUM_CONTENTS,
-    SERVICE_ENUM_SRC,
-    SERVICE_ENUM_SRCONF,
-    SERVICE_ENUM_LIVE,
-    SERVICE_ENUM_RUNAT,
-    SERVICE_ENUM_TREE,
-    SERVICE_ENUM_TREENAME,
-    SERVICE_ENUM_STATE,
-    SERVICE_ENUM_EXEC_RUN,
-    SERVICE_ENUM_EXEC_LOG_RUN,
-    SERVICE_ENUM_REAL_EXEC_RUN,
-    SERVICE_ENUM_REAL_EXEC_LOG_RUN,
-    SERVICE_ENUM_EXEC_FINISH,
-    SERVICE_ENUM_REAL_EXEC_FINISH,
-    SERVICE_ENUM_TYPE,
-    SERVICE_ENUM_NDEPENDS,
-    SERVICE_ENUM_NREQUIREDBY,
-    SERVICE_ENUM_NOPTSDEPS,
-    SERVICE_ENUM_NEXTDEPS,
-    SERVICE_ENUM_NCONTENTS,
-    SERVICE_ENUM_DOWN,
-    SERVICE_ENUM_DISEN,
-    SERVICE_ENUM_ENDOFKEY
+    E_RESOLVE_SERVICE_NAME = 0,
+    E_RESOLVE_SERVICE_DESCRIPTION,
+    E_RESOLVE_SERVICE_VERSION,
+    E_RESOLVE_SERVICE_TYPE,
+    E_RESOLVE_SERVICE_NOTIFY,
+    E_RESOLVE_SERVICE_MAXDEATH,
+    E_RESOLVE_SERVICE_EARLIER,
+    E_RESOLVE_SERVICE_HIERCOPY,
+    E_RESOLVE_SERVICE_INTREE,
+    E_RESOLVE_SERVICE_OWNERSTR,
+    E_RESOLVE_SERVICE_OWNER,
+    E_RESOLVE_SERVICE_TREENAME,
+    E_RESOLVE_SERVICE_USER,
+    E_RESOLVE_SERVICE_INMODULE,
+
+    // path
+    E_RESOLVE_SERVICE_HOME,
+    E_RESOLVE_SERVICE_FRONTEND,
+    E_RESOLVE_SERVICE_TREE,
+    E_RESOLVE_SERVICE_STATUS,
+
+    // dependencies
+    E_RESOLVE_SERVICE_DEPENDS,
+    E_RESOLVE_SERVICE_REQUIREDBY,
+    E_RESOLVE_SERVICE_OPTSDEPS,
+    E_RESOLVE_SERVICE_NDEPENDS,
+    E_RESOLVE_SERVICE_NREQUIREDBY,
+    E_RESOLVE_SERVICE_NOPTSDEPS,
+
+    // execute
+    E_RESOLVE_SERVICE_RUN,
+    E_RESOLVE_SERVICE_RUN_USER,
+    E_RESOLVE_SERVICE_RUN_BUILD,
+    E_RESOLVE_SERVICE_RUN_SHEBANG,
+    E_RESOLVE_SERVICE_RUN_RUNAS,
+    E_RESOLVE_SERVICE_FINISH,
+    E_RESOLVE_SERVICE_FINISH_USER,
+    E_RESOLVE_SERVICE_FINISH_BUILD,
+    E_RESOLVE_SERVICE_FINISH_SHEBANG,
+    E_RESOLVE_SERVICE_FINISH_RUNAS,
+    E_RESOLVE_SERVICE_TIMEOUTKILL,
+    E_RESOLVE_SERVICE_TIMEOUTFINISH,
+    E_RESOLVE_SERVICE_TIMEOUTUP,
+    E_RESOLVE_SERVICE_TIMEOUTDOWN,
+    E_RESOLVE_SERVICE_DOWN,
+    E_RESOLVE_SERVICE_DOWNSIGNAL,
+
+    // live
+    E_RESOLVE_SERVICE_LIVEDIR,
+    E_RESOLVE_SERVICE_SCANDIR,
+    E_RESOLVE_SERVICE_STATEDIR,
+    E_RESOLVE_SERVICE_EVENTDIR,
+    E_RESOLVE_SERVICE_NOTIFDIR,
+    E_RESOLVE_SERVICE_SUPERVISEDIR,
+    E_RESOLVE_SERVICE_FDHOLDERDIR,
+    E_RESOLVE_SERVICE_ONESHOTDDIR,
+
+    // logger
+    E_RESOLVE_SERVICE_LOGNAME,
+    E_RESOLVE_SERVICE_LOGDESTINATION,
+    E_RESOLVE_SERVICE_LOGBACKUP,
+    E_RESOLVE_SERVICE_LOGMAXSIZE,
+    E_RESOLVE_SERVICE_LOGTIMESTAMP,
+    E_RESOLVE_SERVICE_LOGWANT,
+    E_RESOLVE_SERVICE_LOGRUN,
+    E_RESOLVE_SERVICE_LOGRUN_USER,
+    E_RESOLVE_SERVICE_LOGRUN_BUILD,
+    E_RESOLVE_SERVICE_LOGRUN_SHEBANG,
+    E_RESOLVE_SERVICE_LOGRUN_RUNAS,
+    E_RESOLVE_SERVICE_LOGTIMEOUTKILL,
+    E_RESOLVE_SERVICE_LOGTIMEOUTFINISH,
+
+    // environment
+    E_RESOLVE_SERVICE_ENV,
+    E_RESOLVE_SERVICE_ENVDIR,
+    E_RESOLVE_SERVICE_ENV_OVERWRITE,
+
+    // regex
+    E_RESOLVE_SERVICE_REGEX_CONFIGURE,
+    E_RESOLVE_SERVICE_REGEX_DIRECTORIES,
+    E_RESOLVE_SERVICE_REGEX_FILES,
+    E_RESOLVE_SERVICE_REGEX_INFILES,
+    E_RESOLVE_SERVICE_REGEX_NDIRECTORIES,
+    E_RESOLVE_SERVICE_REGEX_NFILES,
+    E_RESOLVE_SERVICE_REGEX_NINFILES,
+    E_RESOLVE_SERVICE_ENDOFKEY
+
 } ;
 
 typedef struct resolve_service_master_s resolve_service_master_t, *resolve_service_master_t_ref ;
@@ -156,61 +304,59 @@ struct resolve_service_master_s
 
     uint32_t classic ;
     uint32_t bundle ;
-    uint32_t longrun ;
     uint32_t oneshot ;
     uint32_t module ;
+    uint32_t enabled ;
+    uint32_t disabled ;
+    uint32_t contents ;
 
     uint32_t nclassic ;
     uint32_t nbundle ;
-    uint32_t nlongrun ;
     uint32_t noneshot ;
     uint32_t nmodule ;
-
+    uint32_t nenabled ;
+    uint32_t ndisabled ;
+    uint32_t ncontents ;
 } ;
-#define RESOLVE_SERVICE_MASTER_ZERO { 0,STRALLOC_ZERO,0,0,0,0,0,0,0,0,0,0,0 }
+#define RESOLVE_SERVICE_MASTER_ZERO { 0,STRALLOC_ZERO,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
 
 typedef enum resolve_service_master_enum_e resolve_service_master_enum_t, *resolve_service_master_enum_t_ref;
 enum resolve_service_master_enum_e
 {
-    SERVICE_ENUM_MASTER_NAME = 0,
-    SERVICE_ENUM_MASTER_CLASSIC,
-    SERVICE_ENUM_MASTER_BUNDLE,
-    SERVICE_ENUM_MASTER_LONGRUN,
-    SERVICE_ENUM_MASTER_ONESHOT,
-    SERVICE_ENUM_MASTER_MODULE,
-    SERVICE_ENUM_MASTER_NCLASSIC,
-    SERVICE_ENUM_MASTER_NBUNDLE,
-    SERVICE_ENUM_MASTER_NLONGRUN,
-    SERVICE_ENUM_MASTER_NONESHOT,
-    SERVICE_ENUM_MASTER_NMODULE,
-    SERVICE_ENUM_MASTER_ENDOFKEY
+    E_RESOLVE_SERVICE_MASTER_NAME = 0,
+    E_RESOLVE_SERVICE_MASTER_CLASSIC,
+    E_RESOLVE_SERVICE_MASTER_BUNDLE,
+    E_RESOLVE_SERVICE_MASTER_ONESHOT,
+    E_RESOLVE_SERVICE_MASTER_MODULE,
+    E_RESOLVE_SERVICE_MASTER_ENABLED,
+    E_RESOLVE_SERVICE_MASTER_DISABLED,
+    E_RESOLVE_SERVICE_MASTER_CONTENTS,
+    E_RESOLVE_SERVICE_MASTER_NCLASSIC,
+    E_RESOLVE_SERVICE_MASTER_NBUNDLE,
+    E_RESOLVE_SERVICE_MASTER_NONESHOT,
+    E_RESOLVE_SERVICE_MASTER_NMODULE,
+    E_RESOLVE_SERVICE_MASTER_NENABLED,
+    E_RESOLVE_SERVICE_MASTER_NDISABLED,
+    E_RESOLVE_SERVICE_MASTER_NCONTENTS,
+    E_RESOLVE_SERVICE_MASTER_ENDOFKEY
 } ;
 
 extern resolve_field_table_t resolve_service_field_table[] ;
 extern resolve_field_table_t resolve_service_master_field_table[] ;
 
-extern int service_isenabled(char const *sv) ;
-extern int service_isenabledat(stralloc *tree, char const *sv) ;
-extern int service_frontend_src(stralloc *sasrc, char const *name, char const *src) ;
-extern int service_frontend_path(stralloc *sasrc,char const *sv, uid_t owner,char const *directory_forced) ;
-extern int service_endof_dir(char const *dir, char const *name) ;
-extern int service_cmp_basedir(char const *dir) ;
-extern int service_intree(stralloc *svtree, char const *svname, char const *tree) ;
 
-/**
- *
- * Resolve API
- *
- * */
-
-/** Service */
+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) ;
+extern int service_frontend_src(stralloc *sasrc, char const *name, char const *src) ;
+extern int service_is_g(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) ;
 extern int service_resolve_get_field_tosa(stralloc *sa, resolve_service_t *res, resolve_service_enum_t field) ;
 extern int service_resolve_modify_field(resolve_service_t *res, resolve_service_enum_t field, char const *data) ;
 extern int service_resolve_read_cdb(cdb *c, resolve_service_t *res) ;
-extern int service_resolve_setlognwrite(resolve_service_t *sv, char const *dst) ;
-extern int service_resolve_setnwrite(sv_alltype *services, ssexec_t *info, char const *dst) ;
-extern int service_resolve_sort_bytype(stralloc *list, char const *src) ;
+extern int service_resolve_write(resolve_service_t *res) ;
 extern int service_resolve_write_cdb(cdbmaker *c, resolve_service_t *sres) ;
 
 /** Master */
@@ -222,26 +368,19 @@ extern int service_resolve_master_read_cdb(cdb *c, resolve_service_master_t *tre
 extern int service_resolve_master_write(graph_t *graph, char const *dest) ;
 extern int service_resolve_master_write_cdb(cdbmaker *c, resolve_service_master_t *mres) ;
 
-/**
- *
- *
- * obsolete function
- *
- * */
+/** Graph */
+extern void service_graph_g(char const *alist, size_t alen, graph_t *graph, resolve_service_t *ares, unsigned int *areslen, ssexec_t *info, uint32_t flag) ;
+extern void service_graph_collect(graph_t *g, char const *alist, size_t alen, resolve_service_t *ares, unsigned int *areslen, ssexec_t *info, uint32_t flag) ;
+extern void service_graph_build(graph_t *g, resolve_service_t *ares, unsigned int areslen, uint32_t flag) ;
 
-extern int service_resolve_add_deps(genalloc *tokeep, resolve_service_t *res, char const *src) ;
-extern int service_resolve_add_rdeps(genalloc *tokeep, resolve_service_t *res, char const *src) ;
-extern int service_resolve_add_logger(genalloc *ga,char const *src) ;
+extern int service_is(ss_state_t *ste, uint32_t flag) ;
 
+/** possible remove of it */
+extern int graph_build_service_from_list(char const *const *list, char const *base, graph_t *graph, resolve_service_t *ares, uint8_t requiredby) ;
 
 
-/** obsolete Graph function */
-extern void ss_resolve_graph_ndeps_free(ss_resolve_graph_ndeps_t *graph) ;
-extern void ss_resolve_graph_free(ss_resolve_graph_t *graph) ;
-extern int ss_resolve_graph_src(ss_resolve_graph_t *graph, char const *dir, unsigned int reverse, unsigned int what) ;
-extern int ss_resolve_graph_build(ss_resolve_graph_t *graph,resolve_service_t *res,char const *src,unsigned int reverse) ;
-extern int ss_resolve_graph_sort(ss_resolve_graph_t *graph) ;
-extern int ss_resolve_dfs(ss_resolve_graph_t *graph, unsigned int idx, visit *c,unsigned int *ename,unsigned int *edeps) ;
-extern int ss_resolve_graph_publish(ss_resolve_graph_t *graph,unsigned int reverse) ;
+
+/** SHOULD BE NOT USED */
+extern int service_resolve_sort_bytype(stralloc *list, char const *src) ;
 
 #endif
diff --git a/src/include/66/ssexec.h b/src/include/66/ssexec.h
index 402ab23a..666c3e57 100644
--- a/src/include/66/ssexec.h
+++ b/src/include/66/ssexec.h
@@ -15,20 +15,51 @@
 #ifndef SS_SSEXEC_H
 #define SS_SSEXEC_H
 
+#include <stdint.h>
+
 #include <skalibs/stralloc.h>
 #include <skalibs/types.h>
 
+#include <66/config.h>
+
 typedef struct ssexec_s ssexec_t , *ssexec_t_ref ;
 struct ssexec_s
 {
     stralloc base ;
+
+    //char base[SS_MAX_SERVICE] ;
+    //size_t baselen ;
+
     stralloc live ;
+
+    //char live[SS_MAX_SERVICE] ;
+    //size_t livelen ;
+
     stralloc tree ;
-    stralloc livetree ;
+
+    //char tree[SS_MAX_SERVICE] ;
+    //size_t treelen ;
+
     stralloc scandir ;
+
+    //char scandir[SS_MAX_SERVICE] ;
+    //size_t scandirlen ;
+
     stralloc treename ;
-    int treeallow ; //1 yes , 0 no
+
+    //char treename[SS_MAX_SERVICE] ;
+    //size_t treenamelen ;
+
+    /**
+     *
+     * verifier pour les cast entre int et uint8_t
+     * a son call
+     *
+     * */
+    uint8_t treeallow ; //1 yes , 0 no
     uid_t owner ;
+    char ownerstr[UID_FMT] ;
+    size_t ownerlen ;
     uint32_t timeout ;
     char const *prog ;
     char const *help ;
@@ -43,49 +74,50 @@ struct ssexec_s
     uint8_t skip_opt_tree ; // tree,treename, treeallow will not be set. Also, trees permissions is not checked.
 } ;
 
-#define SSEXEC_ZERO {   .base = STRALLOC_ZERO , \
-                        .live = STRALLOC_ZERO , \
-                        .tree = STRALLOC_ZERO , \
-                        .livetree = STRALLOC_ZERO , \
-                        .scandir = STRALLOC_ZERO , \
-                        .treename = STRALLOC_ZERO , \
-                        .treeallow = 0 , \
-                        .owner = 0 , \
-                        .timeout = 0 , \
-                        .prog = 0 , \
-                        .help = 0 , \
-                        .usage = 0 , \
-                        .opt_verbo = 0 , \
-                        .opt_live = 0 , \
-                        .opt_tree = 0 , \
-                        .opt_timeout = 0 , \
-                        .opt_color = 0 , \
+#define SSEXEC_ZERO {   .base = STRALLOC_ZERO, \
+                        .live = STRALLOC_ZERO, \
+                        .tree = STRALLOC_ZERO, \
+                        .scandir = STRALLOC_ZERO, \
+                        .treename = STRALLOC_ZERO, \
+                        .treeallow = 0, \
+                        .owner = 0, \
+                        .ownerstr = { 0 }, \
+                        .ownerlen = 0, \
+                        .timeout = 0, \
+                        .prog = 0, \
+                        .help = 0, \
+                        .usage = 0, \
+                        .opt_verbo = 0, \
+                        .opt_live = 0, \
+                        .opt_tree = 0, \
+                        .opt_timeout = 0, \
+                        .opt_color = 0, \
                         .skip_opt_tree = 0 }
 
-typedef int ssexec_func_t(int argc, char const *const *argv, char const *const *envp, ssexec_t *info) ;
+typedef int ssexec_func_t(int argc, char const *const *argv, ssexec_t *info) ;
 typedef ssexec_func_t *ssexec_func_t_ref ;
 
 extern void ssexec_free(ssexec_t *info) ;
 extern ssexec_t const ssexec_zero ;
 extern void set_ssinfo(ssexec_t *info) ;
 
+extern ssexec_func_t ssexec_parse ;
 extern ssexec_func_t ssexec_init ;
 extern ssexec_func_t ssexec_enable ;
 extern ssexec_func_t ssexec_disable ;
 extern ssexec_func_t ssexec_start ;
 extern ssexec_func_t ssexec_stop ;
 extern ssexec_func_t ssexec_svctl ;
-extern ssexec_func_t ssexec_dbctl ;
 extern ssexec_func_t ssexec_env ;
 extern ssexec_func_t ssexec_all ;
 extern ssexec_func_t ssexec_tree ;
 
+extern char const *usage_parse ;
+extern char const *help_parse ;
 extern char const *usage_enable ;
 extern char const *help_enable ;
 extern char const *usage_disable ;
 extern char const *help_disable ;
-extern char const *usage_dbctl ;
-extern char const *help_dbctl ;
 extern char const *usage_svctl ;
 extern char const *help_svctl ;
 extern char const *usage_start ;
@@ -101,7 +133,9 @@ extern char const *help_all ;
 extern char const *usage_tree ;
 extern char const *help_tree ;
 
-#define OPTS_INIT "cdb"
+#define OPTS_PARSE "fFcmCI"
+#define OPTS_PARSE_LEN (sizeof OPTS_PARSE - 1)
+#define OPTS_INIT "o:"
 #define OPTS_INIT_LEN (sizeof OPTS_INIT - 1)
 #define OPTS_ENABLE "fFSI"
 #define OPTS_ENABLE_LEN (sizeof OPTS_ENABLE - 1)
@@ -111,10 +145,8 @@ extern char const *help_tree ;
 #define OPTS_START_LEN (sizeof OPTS_START - 1)
 #define OPTS_STOP "uXK"
 #define OPTS_STOP_LEN (sizeof OPTS_STOP - 1)
-#define OPTS_SVCTL "n:urRdXK"
+#define OPTS_SVCTL "abqhkti12pcyroduxOw:P"
 #define OPTS_SVCTL_LEN (sizeof OPTS_SVCTL - 1)
-#define OPTS_DBCTL "udr"
-#define OPTS_DBCTL_LEN (sizeof OPTS_DBCTL - 1)
 #define OPTS_ENV "c:s:VLr:e:i:"
 #define OPTS_ENV_LEN (sizeof OPTS_ENV - 1)
 #define OPTS_ALL "f"
diff --git a/src/include/66/svc.h b/src/include/66/svc.h
index f103c818..bf064632 100644
--- a/src/include/66/svc.h
+++ b/src/include/66/svc.h
@@ -15,70 +15,13 @@
 #ifndef SS_SVC_H
 #define SS_SVC_H
 
-#include <skalibs/tai.h>
-#include <skalibs/stralloc.h>
-#include <skalibs/genalloc.h>
-#include <s6/ftrigr.h>
-
 #include <66/service.h>
 #include <66/ssexec.h>
+#include <66/graph.h>
 
-typedef struct ss_resolve_sig_s ss_resolve_sig_t, *ss_resolve_sig_t_ref ;
-struct ss_resolve_sig_s
-{
-    resolve_service_t res ;
-    unsigned int notify ;
-    unsigned int ndeath;
-    tain deadline ;
-    uint16_t ids ;
-    char *sigtosend ;
-    int sig ;
-    int state ;
-    pid_t pid ;
-} ;
-
-#define RESOLVE_SIG_ZERO \
-{ \
-    .res = RESOLVE_SERVICE_ZERO, \
-    .notify = 0, \
-    .ndeath = 3, \
-    .deadline = TAIN_ZERO, \
-    .ids = 0, \
-    .sigtosend = 0, \
-    .sig = 0, \
-    .state = -1, \
-    .pid = 0 \
-}
-
-typedef enum state_e state_t, *state_t_ref ;
-enum state_e
-{
-    SIGUP = 0, // u
-    SIGRUP , // U - really up
-    SIGR, // r
-    SIGRR, // R - really up
-    SIGDOWN , // d
-    SIGRDOWN ,// D - really down
-    SIGX, //X
-    SIGO , //0
-    SIGSUP //s supervise
-} ;
-typedef enum sigactions_e sigactions_t, *sigactions_t_ref ;
-enum sigactions_e
-{
-    GOTIT = 0 ,
-    WAIT ,
-    DEAD ,
-    DONE ,
-    PERM ,
-    UKNOW
-} ;
-
-
-extern int svc_switch_to(ssexec_t *info,unsigned int where) ;
-extern int svc_init(ssexec_t *info,char const *src, genalloc *ga) ;
-extern int svc_init_pipe(ftrigr_t *fifo,genalloc *gasv,tain *deadline) ;
-extern int svc_send(ssexec_t *info,genalloc *ga,char const *sig,char const *const *envp) ;
-extern int svc_unsupervise(ssexec_t *info,genalloc *ga,char const *sig,char const *const *envp) ;
+extern int svc_scandir_ok (char const *dir) ;
+extern int svc_scandir_send(char const *scandir,char const *signal) ;
+extern int svc_send(char const *const *list, unsigned int nservice, char **sig, unsigned int siglen, ssexec_t *info) ;
+extern void svc_unsupervise(unsigned int *alist, unsigned int alen, graph_t *g, resolve_service_t *ares, unsigned int areslen) ;
 
 #endif
diff --git a/src/include/66/utils.h b/src/include/66/utils.h
index 84d33459..98c02026 100644
--- a/src/include/66/utils.h
+++ b/src/include/66/utils.h
@@ -32,8 +32,6 @@
 #define YOURGID(passto,owner) yourgid(passto,owner)
 
 /** ss_utils.c file */
-extern int scandir_ok (char const *dir) ;
-extern int scandir_send_signal(char const *scandir,char const *signal) ;
 extern char const *get_userhome(uid_t myuid) ;
 extern int youruid(uid_t *passto,char const *owner) ;
 extern int yourgid(gid_t *passto,uid_t owner) ;
@@ -55,5 +53,9 @@ extern int module_path(stralloc *sdir, stralloc *mdir, char const *sv,char const
 extern int sa_pointo(stralloc *sa, ssexec_t *info, int type, unsigned int where) ;
 extern int create_live_state(ssexec_t *info, char const *treename) ;
 extern int create_live_tree(ssexec_t *info) ;
+extern void name_isvalid(char const *name) ;
+
+extern int set_ownerhome_stack(char *store) ;
+extern int set_ownersysdir_stack(char *base, uid_t owner) ;
 
 #endif
diff --git a/src/include/66/write.h b/src/include/66/write.h
index b4b24dc5..1a66d459 100644
--- a/src/include/66/write.h
+++ b/src/include/66/write.h
@@ -22,8 +22,7 @@ extern int write_services(resolve_service_t *res, char const *workdir, uint8_t f
 extern void write_classic(resolve_service_t *res, char const *dst, uint8_t force) ;
 extern void write_common(resolve_service_t *res, char const *dst) ;
 extern void write_environ(char const *name, char const *contents, char const *dst) ;
-extern void write_execute_scripts(resolve_service_t *res, resolve_service_addon_scripts_t *scripts, char const *file, char const *dst) ;
-extern void write_execute_scripts_user(resolve_service_t *res, resolve_service_addon_scripts_t *scripts, char const *file, char const *dst) ;
+extern void write_execute_scripts(char const *file, char const *contents, char const *dst) ;
 extern void write_logger(resolve_service_t *res, char const *destination, uint8_t force) ;
 extern void write_oneshot(resolve_service_t *res, char const *dst) ;
 extern void write_uint(char const *dst, char const *name, uint32_t ui) ;
-- 
GitLab