diff --git a/src/66/66-init.c b/src/66/66-init.c index 88b7e2da99b70b228eb3bb1f5f3791d17012a8d3..a5b972609a1c38e85effc0190398ac2699d118c9 100644 --- a/src/66/66-init.c +++ b/src/66/66-init.c @@ -25,16 +25,19 @@ #include <skalibs/types.h> #include <skalibs/stralloc.h> #include <skalibs/djbunix.h> +#include <skalibs/direntry.h> #include <s6/config.h> #include <s6-rc/config.h> #include <s6/s6-supervise.h> #include <66/utils.h> +#include <66/enum.h> #include <66/constants.h> #include <66/tree.h> #include <66/backup.h> #include <66/db.h> +#include <66/svc.h> //#include <stdio.h> @@ -62,7 +65,7 @@ static inline void info_help (void) int main(int argc, char const *const *argv, char const *const *envp) { - int r, classic, db ; + int r, db, classic, earlier ; uid_t owner ; int wstat ; @@ -76,8 +79,13 @@ int main(int argc, char const *const *argv, char const *const *envp) stralloc live = STRALLOC_ZERO ; stralloc scandir = STRALLOC_ZERO ; stralloc livetree = STRALLOC_ZERO ; + stralloc saresolve = STRALLOC_ZERO ; + stralloc type = STRALLOC_ZERO ; + genalloc gasvc = GENALLOC_ZERO ; //stralist type - classic = db = 0 ; + svstat_t svstat = SVSTAT_ZERO ; + genalloc gasvstat = GENALLOC_ZERO ; //svstat_t type + classic = db = earlier = 0 ; PROG = "66-init" ; { @@ -132,8 +140,12 @@ int main(int argc, char const *const *argv, char const *const *envp) if (r < 0) strerr_dief3x(111,"scandir: ",scandir.s," must be an absolute path") ; r = scan_mode(scandir.s,S_IFDIR) ; + if (r < 0) strerr_dief2x(111,scandir.s," conflicted format") ; if (!r) strerr_dief3x(110,"scandir: ",scandir.s," doesn't exist") ; + r = scandir_ok(scandir.s) ; + if (r != 1) earlier = 1 ; + if (!stralloc_copy(&livetree,&live)) retstralloc(111,"main") ; r = set_livetree(&livetree,owner) ; if (!r) retstralloc(111,"main") ; @@ -158,54 +170,83 @@ int main(int argc, char const *const *argv, char const *const *envp) svdir[svdirlen + SS_SVC_LEN] = 0 ; /** svc already initiated */ - r = scan_mode(scandir.s,S_IFDIR) ; - if (r < 0) strerr_dief2x(111,scandir.s," conflicted format") ; - if (r) + if (classic) { - genalloc gasvc = GENALLOC_ZERO ; - if (!dir_get(&gasvc,scandir.s,"",S_IFDIR)) strerr_diefu2x(111,"parse directory: ",scandir.s) ; - for (unsigned int i = 0 ; i < genalloc_len(stralist,&gasvc) ; i++) + int i ; + if (!dir_cmp(svdir,scandir.s,"",&gasvc)) strerr_diefu4x(111,"compare ",svdir," to ",scandir.s) ; + if (!earlier) + { + for (i = 0 ; i < genalloc_len(stralist,&gasvc) ; i++) + { + char *name = gaistr(&gasvc,i) ; + size_t namelen = gaistrlen(&gasvc,i) ; + + if (!resolve_pointo(&saresolve,base.s,live.s,tree.s,treename,0,SS_RESOLVE_SRC)) + strerr_diefu1x(111,"set revolve pointer to source") ; + r = resolve_read(&type,saresolve.s,name,"type") ; + if (r < -1) strerr_dief2x(111,"invalid .resolve directory: ",saresolve.s) ; + if (r && type.len && get_enumbyid(type.s,key_enum_el) == CLASSIC) + { + svstat.down = 0 ; + svstat.name = name ; + svstat.namelen = namelen ; + r = resolve_read(&type,saresolve.s,name,"down") ; + if (r > 0) svstat.down = 1 ; + if (!genalloc_append(svstat_t,&gasvstat,&svstat)) strerr_diefu3x(111,"add: ",name," on genalloc") ; + } + } + if (genalloc_len(svstat_t,&gasvstat)) + { + if (!svc_init(scandir.s,svdir,&gasvstat)) strerr_diefu2x(111,"initiate service of tree: ",treename) ; + } + else strerr_warni3x("svc service of tree: ",treename," already initiated") ; + } + else { - char *name = gaistr(&gasvc,i) ; - if (dir_search(svdir,name,S_IFDIR)) + size_t dirlen = strlen(svdir) ; + for (i = 0 ; i < genalloc_len(stralist,&gasvc) ; i++) { - strerr_warni2x(treename," svc services already initiated") ; - classic = 0 ; + char *name = gaistr(&gasvc,i) ; + size_t namelen = gaistrlen(&gasvc,i) ; + size_t scanlen = scandir.len - 1 ; + char svscan[scanlen + 1 + namelen + 1] ; + memcpy(svscan,scandir.s,scanlen) ; + svscan[scanlen] = '/' ; + memcpy(svscan + scanlen + 1, name,namelen) ; + svscan[scanlen + 1 + namelen] = 0 ; + char tocopy[dirlen + 1 + namelen + 1] ; + memcpy(tocopy,svdir,dirlen) ; + tocopy[dirlen] = '/' ; + memcpy(tocopy + dirlen + 1, name, namelen) ; + tocopy[dirlen + 1 + namelen] = 0 ; + if (!hiercopy(tocopy,svscan)) strerr_diefu4sys(111,"to copy: ",tocopy," to: ",svscan) ; } } - genalloc_deepfree(stralist,&gasvc,stra_free) ; } + genalloc_deepfree(stralist,&gasvc,stra_free) ; + genalloc_free(svstat_t,&gasvstat) ; + stralloc_free(&saresolve) ; + stralloc_free(&type) ; /** db already initiated? */ - if (db_ok(livetree.s,treename)) - { - - strerr_warni2x(treename," db already initiated") ; - db = 0 ; - } - - livetree.len--; - if (!stralloc_cats(&livetree,"/")) retstralloc(111,"main") ; - if (!stralloc_cats(&livetree,treename)) retstralloc(111,"main") ; - if (!stralloc_0(&livetree)) retstralloc(111,"main") ; - - /** svc service work */ - if (classic) + if (db) { - VERBO2 strerr_warni5x("copy svc service from ",svdir," to ",scandir.s," ...") ; - if (!hiercopy(svdir,scandir.s)) strerr_diefu4sys(111,"copy: ",svdir," to: ",scandir.s) ; - } + if (!earlier) + { + if (db_ok(livetree.s,treename)) + { + strerr_warni3x(" db of tree: ",treename," already initiated") ; + goto end ; + } + }else strerr_dief3x(110,"scandir: ",scandir.s," is not running") ; + }else goto end ; - /** rc services work */ - if (db) { + livetree.len--; + if (!stralloc_cats(&livetree,"/")) retstralloc(111,"main") ; + if (!stralloc_cats(&livetree,treename)) retstralloc(111,"main") ; + if (!stralloc_0(&livetree)) retstralloc(111,"main") ; - /** we assume that 66-scandir was launched previously because a db - * need an operationnal scandir, so we control if /run/66/scandir/owner exist, - * if not, exist immediately */ - r = scandir_ok(scandir.s) ; - if (r != 1) strerr_dief3x(111,"scandir: ",scandir.s," is not running") ; - memcpy(svdir + svdirlen,SS_DB,SS_DB_LEN) ; memcpy(svdir + svdirlen + SS_DB_LEN, "/", 1) ; memcpy(svdir + svdirlen + SS_DB_LEN + 1, treename,treenamelen) ; @@ -241,12 +282,13 @@ int main(int argc, char const *const *argv, char const *const *envp) strerr_diefu2x(111,"init db: ",svdir) ; } } - - stralloc_free(&base) ; - stralloc_free(&tree) ; - stralloc_free(&live) ; - stralloc_free(&scandir) ; - stralloc_free(&livetree) ; + + end: + stralloc_free(&base) ; + stralloc_free(&tree) ; + stralloc_free(&live) ; + stralloc_free(&scandir) ; + stralloc_free(&livetree) ; return 0 ; }