From 629db2e2c0fdbcdb1224ec8dc88d067f575ade4a Mon Sep 17 00:00:00 2001
From: obarun <eric@obarun.org>
Date: Sun, 27 Nov 2022 12:24:06 +1100
Subject: [PATCH] Provide a tree by default and handle it name at compilation
 time with the --with-default-tree-name flag

---
 configure                            |  9 +++++++++
 src/lib66/sanitize/sanitize_system.c | 26 ++++++++++++++++++++++++++
 src/lib66/tree/tree_sethome.c        | 16 +++++++++-------
 3 files changed, 44 insertions(+), 7 deletions(-)

diff --git a/configure b/configure
index d5365ff9..2c381ce2 100755
--- a/configure
+++ b/configure
@@ -33,6 +33,7 @@ Fine tuning of the installation directories:
   --max-path-size=KB               default maximum size of a path[1024KB]
   --max-service-size=KB            default maximum size of a frontend service name[256KB]
   --max-tree-name-size=KB          default maximum size of a tree name[256KB]
+  --with-default-tree-name=NAME    name of the default tree[global]
   --with-skeleton=DIR              skeleton files directory installation [SYSDIR/66]
   --with-system-log=DIR            system service log directory [/var/log/66]
   --with-s6-log-user=USER          user for running s6-log program [root]
@@ -199,6 +200,7 @@ max_service='500'
 max_path='1024'
 max_service_size='256'
 max_treename='256'
+default_treename='global'
 skel='$sysconfdir/66'
 system_dir='/var/lib/66'
 system_log='/var/log/66'
@@ -254,6 +256,7 @@ for arg ; do
     --max-path-size=*) max_path=${arg#*=} ;;
     --max-service-size=*) max_service_size=${arg#*=} ;;
     --max-tree-name-size=*) max_treename=${arg#*=} ;;
+    --with-default-tree-name=*) default_treename=${arg#*=} ;;
     --with-skeleton=*) skel=${arg#*=} ;;
     --with-system-dir=*) system_dir=${arg#*=} ;;
     --with-system-log=*) system_log=${arg#*=} ;;
@@ -392,6 +395,10 @@ if [ $max_treename -lt 2 ]; then
      fail "$0: lower limit for --max-tree-name-size is 2"
 fi
 
+if [ ${#default_treename} -gt $max_treename ]; then
+    fail "$0: maximum length of --with-default-tree-name is $max_treename"
+fi
+
 for i in $skel $system_dir $system_log $service_system $module_system $script_system \
         $seed_system $service_adm $module_adm $service_admconf $seed_adm $user_dir $service_user \
         $module_user $script_user $service_userconf $user_log $seed_user; do
@@ -564,6 +571,7 @@ max_service := $max_service
 max_path := $max_path
 max_service_size := $max_service_size
 max_treename := $max_treename
+default_treename := $default_treename
 skel := $skel
 system_dir := $system_dir
 system_log := $system_log
@@ -653,6 +661,7 @@ All rights reserved.*/
 #define ${package_macro_name}_MAX_PATH $max_path
 #define ${package_macro_name}_MAX_SERVICE_NAME $max_service_size
 #define ${package_macro_name}_MAX_TREENAME $max_treename
+#define ${package_macro_name}_DEFAULT_TREENAME "$default_treename"
 #define ${package_macro_name}_SYSTEM_DIR "$system_dir/"
 #define ${package_macro_name}_SKEL_DIR "$skel/"
 #define ${package_macro_name}_LOGGER_SYSDIR "$system_log/"
diff --git a/src/lib66/sanitize/sanitize_system.c b/src/lib66/sanitize/sanitize_system.c
index b9d9fa6e..b959b87f 100644
--- a/src/lib66/sanitize/sanitize_system.c
+++ b/src/lib66/sanitize/sanitize_system.c
@@ -83,6 +83,7 @@ int sanitize_system(ssexec_t *info)
     /** set cleanup */
     cleantree = info->tree.s ;
 
+    int r ;
     size_t baselen = info->base.len ;
     uid_t log_uid ;
     gid_t log_gid ;
@@ -165,5 +166,30 @@ int sanitize_system(ssexec_t *info)
     auto_strings(dst + baselen, SS_TREE_CURRENT) ;
     auto_check(dst) ;
 
+    /** create the default tree if it doesn't exist yet */
+    r = tree_isvalid(info->base.s, SS_DEFAULT_TREENAME) ;
+    if (r < 0)
+        log_dieu(LOG_EXIT_SYS, "check validity of tree: ", SS_DEFAULT_TREENAME) ;
+
+    if (!r) {
+
+        int nargc = 4 ;
+        char const *newargv[nargc] ;
+        unsigned int m = 0 ;
+
+        newargv[m++] = "tree" ;
+        newargv[m++] = "-E" ;
+        newargv[m++] = SS_DEFAULT_TREENAME ;
+        newargv[m++] = 0 ;
+
+        char *prog = PROG ;
+        PROG = "tree" ;
+
+        if (ssexec_tree(nargc, newargv, info))
+            log_dieu(LOG_EXIT_SYS, "create tree: ", SS_DEFAULT_TREENAME) ;
+
+        PROG = prog ;
+    }
+
     return 1 ;
 }
diff --git a/src/lib66/tree/tree_sethome.c b/src/lib66/tree/tree_sethome.c
index a37e58bf..38c8fcef 100644
--- a/src/lib66/tree/tree_sethome.c
+++ b/src/lib66/tree/tree_sethome.c
@@ -39,9 +39,11 @@ int tree_sethome(ssexec_t *info)
     if (!info->treename.len) {
 
         if (!tree_find_current(&info->tree, base))
-            return -3 ;
+            /** no current tree found. Use the default one. */
+            if (!auto_stra(&info->tree, base, SS_SYSTEM, "/", SS_DEFAULT_TREENAME))
+                return 0 ;
 
-        if (!tree_setname(&info->treename,info->tree.s))
+        if (!tree_setname(&info->treename, info->tree.s))
             return -2 ;
 
     } else {
@@ -56,10 +58,7 @@ int tree_sethome(ssexec_t *info)
 
         } else if (!r) {
             /** Tree doesn't exist yet.
-             * Let see if we have a seed/<name> to create it,
-             * but only if we come from the 66-enable tool. */
-            //if (strcmp(info->prog, "66-enable"))
-              //  return 0 ;
+             * Let see if we have a seed file to create it */
 
             if (!tree_seed_isvalid(info->treename.s))
                 log_warnu_return(LOG_EXIT_ZERO,"find a seed file to create the tree: ", info->treename.s) ;
@@ -68,12 +67,15 @@ int tree_sethome(ssexec_t *info)
             char const *newargv[nargc] ;
             unsigned int m = 0 ;
 
-            newargv[m++] = "66-tree" ;
+            newargv[m++] = "66 tree" ;
             newargv[m++] = info->treename.s ;
             newargv[m++] = 0 ;
 
+            char *prog = PROG ;
+            PROG = "tree" ;
             if (ssexec_tree(nargc, newargv, info))
                 log_warnu_return(LOG_EXIT_ZERO,"create tree: ",info->treename.s) ;
+            PROG = prog ;
         }
         /** The tree_sethome() function can be recursively called. The info->tree may not be empty.
          * Be sure to clean up before using it. */
-- 
GitLab