diff --git a/configure b/configure index d5365ff9adcf2ff064580f55e83643370e086ab4..2c381ce27546bd9b77a59021d27b59abfa053e7f 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 b9d9fa6e6706f7bc09b05a0a6c93c161f4a00bef..b959b87fdc36232fc50d9b2906eb561cf6569e22 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 a37e58bf3030fb29d75c2db1078d1e1ca0deca75..38c8fcef0ee46ad7a5d45ff428fed3ff0e9c0f81 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. */