diff --git a/src/lib66/utils/create_live.c b/src/lib66/utils/create_live.c
new file mode 100644
index 0000000000000000000000000000000000000000..fb088a4f17062f45a66c37b3ec38123498d5b6a7
--- /dev/null
+++ b/src/lib66/utils/create_live.c
@@ -0,0 +1,67 @@
+/*
+ * create_live.c
+ *
+ * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org>
+ *
+ * All rights reserved.
+ *
+ * This file is part of Obarun. It is subject to the license terms in
+ * the LICENSE file found in the top-level directory of this
+ * distribution.
+ * This file may not be copied, modified, propagated, or distributed
+ * except according to the terms contained in the LICENSE file./
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include <oblibs/log.h>
+#include <oblibs/string.h>
+#include <oblibs/types.h>
+#include <oblibs/directory.h>
+
+#include <skalibs/types.h>
+
+#include <66/ssexec.h>
+#include <66/utils.h>
+#include <66/tree.h>
+#include <66/resolve.h>
+#include <66/constants.h>
+
+int create_live(ssexec_t *info)
+{
+    log_flow() ;
+
+    int r ;
+
+    resolve_tree_t tres = RESOLVE_TREE_ZERO ;
+    resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE, &tres) ;
+    char ownerstr[UID_FMT] ;
+    size_t ownerlen = uid_fmt(ownerstr,info->owner) ;
+    size_t stelen = info->live.len + SS_STATE_LEN + 1 + ownerlen + 1 + info->treename.len ;
+    gid_t gidowner ;
+    char ste[stelen + 1] ;
+
+    ownerstr[ownerlen] = 0 ;
+
+    if (!yourgid(&gidowner,info->owner))
+        log_warnusys_return(LOG_EXIT_ZERO, "get gid of: ", ownerstr) ;
+
+    auto_strings(ste, info->live.s, SS_STATE + 1, "/", ownerstr, "/", info->treename.s) ;
+
+    r = scan_mode(ste, S_IFDIR) ;
+    if (r < 0) return 0 ;
+    if (!r) {
+
+        r = dir_create_parent(ste, 0700) ;
+        if (!r)
+            log_warnusys_return(LOG_EXIT_ZERO, "create directory: ", ste) ;
+
+        ste[info->live.len + SS_STATE_LEN + ownerlen + 1] = 0 ;
+        if (chown(ste,info->owner,gidowner) < 0)
+            log_warnusys_return(LOG_EXIT_ZERO, "chown: ", ste) ;
+    }
+
+    return 1 ;
+}
diff --git a/src/lib66/utils/deps-lib/deps b/src/lib66/utils/deps-lib/deps
index 64f006e837197cb9987b8e4f89918783ffd605d0..e921a0dee10c91a8a29bb203c930e94d832274cf 100644
--- a/src/lib66/utils/deps-lib/deps
+++ b/src/lib66/utils/deps-lib/deps
@@ -1,7 +1,20 @@
-utils.o
--ls6rc
--ls6
+create_live.o
+get_userhome.o
+module_in_cmdline.o
+module_path.o
+module_search_service.o
+read_svfile.o
+sa_pointo.o
+scandir_ok.o
+scandir_send_signal.o
+set_livedir.o
+set_livescan.o
+set_livestate.o
+set_livetree.o
+set_ownerhome.o
+set_ownersysdir.o
+yourgid.o
+youruid.o
 -loblibs
--lexecline
 -lskarnet
 
diff --git a/src/lib66/utils/get_userhome.c b/src/lib66/utils/get_userhome.c
new file mode 100644
index 0000000000000000000000000000000000000000..d78716dff00bb3d96683187bdf86a886122191e1
--- /dev/null
+++ b/src/lib66/utils/get_userhome.c
@@ -0,0 +1,41 @@
+/*
+ * get_userhome.c
+ *
+ * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org>
+ *
+ * All rights reserved.
+ *
+ * This file is part of Obarun. It is subject to the license terms in
+ * the LICENSE file found in the top-level directory of this
+ * distribution.
+ * This file may not be copied, modified, propagated, or distributed
+ * except according to the terms contained in the LICENSE file./
+ */
+
+#include <errno.h>
+#include <pwd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <oblibs/log.h>
+#include <66/utils.h>
+
+char const *get_userhome(uid_t myuid)
+{
+    log_flow() ;
+
+    char const *user_home = NULL ;
+    struct passwd *st = getpwuid(myuid) ;
+    int e = errno ;
+    errno = 0 ;
+    if (!st)
+    {
+        if (!errno) errno = ESRCH ;
+        return 0 ;
+    }
+    user_home = st->pw_dir ;
+
+    if (!user_home) return 0 ;
+    errno = e ;
+    return user_home ;
+}
diff --git a/src/lib66/utils/module_in_cmdline.c b/src/lib66/utils/module_in_cmdline.c
new file mode 100644
index 0000000000000000000000000000000000000000..ed54ae9757b843d7db1692d7822a1d2f239ef5d5
--- /dev/null
+++ b/src/lib66/utils/module_in_cmdline.c
@@ -0,0 +1,59 @@
+/*
+ * module_in_cmdline.c
+ *
+ * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org>
+ *
+ * All rights reserved.
+ *
+ * This file is part of Obarun. It is subject to the license terms in
+ * the LICENSE file found in the top-level directory of this
+ * distribution.
+ * This file may not be copied, modified, propagated, or distributed
+ * except according to the terms contained in the LICENSE file./
+ */
+
+#include <stdlib.h>
+
+#include <oblibs/sastr.h>
+
+#include <skalibs/genalloc.h>
+#include <skalibs/stralloc.h>
+
+#include <66/service.h>
+#include <66/resolve.h>
+#include <66/enum.h>
+#include <66/utils.h>
+
+int module_in_cmdline(genalloc *gares, resolve_service_t *res, char const *dir)
+{
+    log_flow() ;
+
+    int e = 0 ;
+    stralloc tmp = STRALLOC_ZERO ;
+    size_t pos = 0 ;
+    resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, res) ;
+
+    if (!resolve_append(gares,wres)) goto err ;
+
+    if (res->contents)
+    {
+        if (!sastr_clean_string(&tmp,res->sa.s + res->contents))
+            goto err ;
+    }
+    for (; pos < tmp.len ; pos += strlen(tmp.s + pos) + 1)
+    {
+        char *name = tmp.s + pos ;
+        if (!resolve_check(dir,name)) goto err ;
+        if (!resolve_read(wres,dir,name)) goto err ;
+        if (res->type == TYPE_CLASSIC)
+            if (resolve_search(gares,name, DATA_SERVICE) < 0)
+                if (!resolve_append(gares,wres)) goto err ;
+    }
+
+    e = 1 ;
+
+    err:
+        free(wres) ;
+        stralloc_free(&tmp) ;
+        return e ;
+}
diff --git a/src/lib66/utils/module_path.c b/src/lib66/utils/module_path.c
new file mode 100644
index 0000000000000000000000000000000000000000..0f0eb72e654580b8574610ef67f41f418c3974da
--- /dev/null
+++ b/src/lib66/utils/module_path.c
@@ -0,0 +1,86 @@
+/*
+ * module_path.c
+ *
+ * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org>
+ *
+ * All rights reserved.
+ *
+ * This file is part of Obarun. It is subject to the license terms in
+ * the LICENSE file found in the top-level directory of this
+ * distribution.
+ * This file may not be copied, modified, propagated, or distributed
+ * except according to the terms contained in the LICENSE file./
+ */
+
+#include <sys/types.h>
+
+#include <oblibs/log.h>
+#include <oblibs/types.h>
+#include <oblibs/string.h>
+
+#include <skalibs/stralloc.h>
+
+#include <66/constants.h>
+#include <66/utils.h>
+
+/* @sdir -> service dir
+ * @mdir -> module dir */
+int module_path(stralloc *sdir, stralloc *mdir, char const *sv,char const *frontend_src, uid_t owner)
+{
+    log_flow() ;
+
+    int r, insta ;
+    stralloc sainsta = STRALLOC_ZERO ;
+    stralloc mhome = STRALLOC_ZERO ; // module user dir
+    stralloc shome = STRALLOC_ZERO ; // service user dir
+    char const *src = 0 ;
+    char const *dest = 0 ;
+
+    insta = instance_check(sv) ;
+    instance_splitname(&sainsta,sv,insta,SS_INSTANCE_TEMPLATE) ;
+
+    if (!owner)
+    {
+        src = SS_MODULE_ADMDIR ;
+        dest = frontend_src ;
+    }
+    else
+    {
+        if (!set_ownerhome(&mhome,owner)) log_warnusys_return(LOG_EXIT_ZERO,"set home directory") ;
+        if (!stralloc_cats(&mhome,SS_MODULE_USERDIR)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+        if (!stralloc_0(&mhome)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+        mhome.len-- ;
+        src = mhome.s ;
+
+        if (!set_ownerhome(&shome,owner)) log_warnusys_return(LOG_EXIT_ZERO,"set home directory") ;
+        if (!stralloc_cats(&shome,SS_SERVICE_USERDIR)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+        if (!stralloc_0(&shome)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+        shome.len-- ;
+        dest = shome.s ;
+
+    }
+    if (!auto_stra(mdir,src,sainsta.s)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+    r = scan_mode(mdir->s,S_IFDIR) ;
+    if (!r || r == -1)
+    {
+        mdir->len = 0 ;
+        src = SS_MODULE_ADMDIR ;
+        if (!auto_stra(mdir,src,sainsta.s)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+        r = scan_mode(mdir->s,S_IFDIR) ;
+        if (!r || r == -1)
+        {
+            mdir->len = 0 ;
+            src = SS_MODULE_SYSDIR ;
+            if (!auto_stra(mdir,src,sainsta.s)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+            r = scan_mode(mdir->s,S_IFDIR) ;
+            if (!r || r == -1) log_warnu_return(LOG_EXIT_ZERO,"find module: ",sv) ;
+        }
+
+    }
+    if (!auto_stra(sdir,dest,sv)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+
+    stralloc_free(&sainsta) ;
+    stralloc_free(&mhome) ;
+    stralloc_free(&shome) ;
+    return 1 ;
+}
diff --git a/src/lib66/utils/module_search_service.c b/src/lib66/utils/module_search_service.c
new file mode 100644
index 0000000000000000000000000000000000000000..6544a5892c9d3317bf0457568da79cb43a59e251
--- /dev/null
+++ b/src/lib66/utils/module_search_service.c
@@ -0,0 +1,88 @@
+/*
+ * module_search_service.c
+ *
+ * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org>
+ *
+ * All rights reserved.
+ *
+ * This file is part of Obarun. It is subject to the license terms in
+ * the LICENSE file found in the top-level directory of this
+ * distribution.
+ * This file may not be copied, modified, propagated, or distributed
+ * except according to the terms contained in the LICENSE file./
+ */
+
+#include <sys/types.h>
+#include <string.h>
+
+#include <oblibs/log.h>
+#include <oblibs/string.h>
+#include <oblibs/sastr.h>
+
+#include <skalibs/genalloc.h>
+#include <skalibs/stralloc.h>
+
+#include <66/constants.h>
+#include <66/service.h>
+#include <66/resolve.h>
+#include <66/enum.h>
+#include <66/utils.h>
+
+int module_search_service(char const *src, genalloc *gares, char const *name,uint8_t *found, char module_name[256])
+{
+    log_flow() ;
+
+    int e = 0 ;
+    size_t srclen = strlen(src), pos = 0, deps = 0 ;
+    stralloc list = STRALLOC_ZERO ;
+    stralloc tmp = STRALLOC_ZERO ;
+    resolve_service_t res = RESOLVE_SERVICE_ZERO ;
+    resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ;
+    char const *exclude[2] = { SS_MASTER + 1, 0 } ;
+
+    char t[srclen + SS_RESOLVE_LEN + 1] ;
+    auto_strings(t,src,SS_RESOLVE) ;
+
+    if (!sastr_dir_get(&list,t,exclude,S_IFREG)) goto err ;
+
+    for (;pos < list.len ; pos += strlen(list.s + pos) + 1)
+    {
+        char *dname = list.s + pos ;
+        if (!resolve_read(wres,src,dname)) goto err ;
+        if (res.type == TYPE_MODULE && res.contents)
+        {
+            if (!sastr_clean_string(&tmp,res.sa.s + res.contents)) goto err ;
+            for (deps = 0 ; deps < tmp.len ; deps += strlen(tmp.s + deps) + 1)
+            {
+                if (!strcmp(name,tmp.s + deps))
+                {
+                    (*found)++ ;
+                    if (strlen(dname) > 255) log_1_warn_return(LOG_EXIT_ZERO,"module name too long") ;
+                    auto_strings(module_name,dname) ;
+                    goto end ;
+                }
+            }
+        }
+    }
+    end:
+    /** search if the service is on the commandline
+     * if not we crash */
+    for(pos = 0 ; pos < genalloc_len(resolve_service_t,gares) ; pos++)
+    {
+        resolve_service_t_ref pres = &genalloc_s(resolve_service_t, gares)[pos] ;
+        char *str = pres->sa.s ;
+        char *name = str + pres->name ;
+        if (!strcmp(name,module_name)) {
+            (*found) = 0 ;
+            break ;
+        }
+    }
+
+    e = 1 ;
+
+    err:
+        stralloc_free(&list) ;
+        stralloc_free(&tmp) ;
+        resolve_free(wres) ;
+        return e ;
+}
diff --git a/src/lib66/utils/read_svfile.c b/src/lib66/utils/read_svfile.c
new file mode 100644
index 0000000000000000000000000000000000000000..af74412fb19d6dda9fd77f29e97bacd79c9f895f
--- /dev/null
+++ b/src/lib66/utils/read_svfile.c
@@ -0,0 +1,52 @@
+/*
+ * read_svfile.c
+ *
+ * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org>
+ *
+ * All rights reserved.
+ *
+ * This file is part of Obarun. It is subject to the license terms in
+ * the LICENSE file found in the top-level directory of this
+ * distribution.
+ * This file may not be copied, modified, propagated, or distributed
+ * except according to the terms contained in the LICENSE file./
+ */
+
+#include <string.h>
+
+#include <oblibs/log.h>
+#include <oblibs/files.h>
+#include <oblibs/string.h>
+
+#include <skalibs/stralloc.h>
+#include <skalibs/djbunix.h>
+
+#include <66/utils.h>
+
+int read_svfile(stralloc *sasv,char const *name,char const *src)
+{
+    log_flow() ;
+
+    int r ;
+    size_t srclen = strlen(src) ;
+    size_t namelen = strlen(name) ;
+
+    char svtmp[srclen + namelen + 1] ;
+    memcpy(svtmp,src,srclen) ;
+    memcpy(svtmp + srclen, name, namelen) ;
+    svtmp[srclen + namelen] = 0 ;
+
+    size_t filesize=file_get_size(svtmp) ;
+    if (!filesize)
+        log_warn_return(LOG_EXIT_LESSONE,svtmp," is empty") ;
+
+    r = openreadfileclose(svtmp,sasv,filesize) ;
+    if(!r)
+        log_warnusys_return(LOG_EXIT_ZERO,"open ", svtmp) ;
+
+    /** ensure that we have an empty line at the end of the string*/
+    if (!stralloc_cats(sasv,"\n")) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+    if (!stralloc_0(sasv)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+
+    return 1 ;
+}
diff --git a/src/lib66/utils/sa_pointo.c b/src/lib66/utils/sa_pointo.c
new file mode 100644
index 0000000000000000000000000000000000000000..40cfc6bbda35d711100c891afd5c6e8366004848
--- /dev/null
+++ b/src/lib66/utils/sa_pointo.c
@@ -0,0 +1,71 @@
+/*
+ * sa_pointo.c
+ *
+ * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org>
+ *
+ * All rights reserved.
+ *
+ * This file is part of Obarun. It is subject to the license terms in
+ * the LICENSE file found in the top-level directory of this
+ * distribution.
+ * This file may not be copied, modified, propagated, or distributed
+ * except according to the terms contained in the LICENSE file./
+ */
+
+#include <oblibs/log.h>
+#include <oblibs/string.h>
+
+#include <skalibs/stralloc.h>
+#include <skalibs/types.h>
+
+#include <66/ssexec.h>
+#include <66/constants.h>
+#include <66/utils.h>
+
+int sa_pointo(stralloc *sa, ssexec_t *info, int type, unsigned int where)
+{
+    log_flow() ;
+
+    sa->len = 0 ;
+
+    char ownerstr[UID_FMT] ;
+    size_t ownerlen = uid_fmt(ownerstr,info->owner) ;
+    ownerstr[ownerlen] = 0 ;
+
+    if (where == SS_RESOLVE_STATE) {
+
+        if (!auto_stra(sa, info->live.s, SS_STATE + 1, "/", ownerstr, "/", info->treename.s))
+            goto err ;
+
+    } else if (where == SS_RESOLVE_SRC) {
+
+        if (!auto_stra(sa, info->tree.s, SS_SVDIRS))
+            goto err ;
+
+    } else if (where == SS_RESOLVE_BACK) {
+
+        if (!auto_stra(sa, info->base.s, SS_SYSTEM, SS_BACKUP, "/", info->treename.s))
+            goto err ;
+
+    } else if (where == SS_RESOLVE_LIVE) {
+
+        if (!auto_stra(sa, info->live.s, SS_STATE + 1, "/", ownerstr, "/", info->treename.s, SS_SVDIRS))
+            goto err ;
+    }
+
+    if (type >= 0 && where) {
+
+        if (type == TYPE_CLASSIC) {
+
+            if (!auto_stra(sa, SS_SVC))
+                goto err ;
+
+        } else if (!auto_stra(sa, SS_DB))
+            goto err ;
+    }
+
+    return 1 ;
+
+    err:
+        return 0 ;
+}
diff --git a/src/lib66/utils/scandir_ok.c b/src/lib66/utils/scandir_ok.c
new file mode 100644
index 0000000000000000000000000000000000000000..690b3efe9d6e69313a745577567f07da3a9c9d98
--- /dev/null
+++ b/src/lib66/utils/scandir_ok.c
@@ -0,0 +1,50 @@
+/*
+ * scandir_ok.c
+ *
+ * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org>
+ *
+ * All rights reserved.
+ *
+ * This file is part of Obarun. It is subject to the license terms in
+ * the LICENSE file found in the top-level directory of this
+ * distribution.
+ * This file may not be copied, modified, propagated, or distributed
+ * except according to the terms contained in the LICENSE file./
+ */
+
+#include <string.h>
+#include <errno.h>
+
+#include <oblibs/log.h>
+#include <oblibs/string.h>
+
+#include <skalibs/djbunix.h>
+
+#include <66/utils.h>
+
+#include <s6/supervise.h>
+
+/** this following function come from Laurent Bercot
+ * author of s6 library all rights reserved on this author
+ * It was just modified a little bit to be able to scan
+ * a scandir directory instead of a service directory */
+int scandir_ok (char const *dir)
+{
+    log_flow() ;
+
+    size_t dirlen = strlen(dir) ;
+    int fd ;
+    char fn[dirlen + 1 + strlen(S6_SVSCAN_CTLDIR) + 9] ;
+
+    auto_strings(fn, dir, "/", S6_SVSCAN_CTLDIR, "/control") ;
+
+    fd = open_write(fn) ;
+    if (fd < 0)
+    {
+        if ((errno == ENXIO) || (errno == ENOENT)) return 0 ;
+        else return -1 ;
+    }
+    fd_close(fd) ;
+
+    return 1 ;
+}
diff --git a/src/lib66/utils/scandir_send_signal.c b/src/lib66/utils/scandir_send_signal.c
new file mode 100644
index 0000000000000000000000000000000000000000..de636d5deb7ad88e9f0a2365ee29d769dd2298db
--- /dev/null
+++ b/src/lib66/utils/scandir_send_signal.c
@@ -0,0 +1,45 @@
+/*
+ * scandir_send_signal.c
+ *
+ * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org>
+ *
+ * All rights reserved.
+ *
+ * This file is part of Obarun. It is subject to the license terms in
+ * the LICENSE file found in the top-level directory of this
+ * distribution.
+ * This file may not be copied, modified, propagated, or distributed
+ * except according to the terms contained in the LICENSE file./
+ */
+
+#include <string.h>
+
+#include <oblibs/log.h>
+
+#include <66/utils.h>
+
+#include <s6/supervise.h>
+
+int scandir_send_signal(char const *scandir,char const *signal)
+{
+    log_flow() ;
+
+    size_t idlen = strlen(signal) ;
+    char data[idlen + 1] ;
+    size_t datalen = 0 ;
+
+    for (; datalen < idlen ; datalen++)
+        data[datalen] = signal[datalen] ;
+
+    switch (s6_svc_writectl(scandir, S6_SVSCAN_CTLDIR, data, datalen))
+    {
+        case -1: log_warnusys("control: ", scandir) ;
+                return 0 ;
+        case -2: log_warnsys("something is wrong with the ", scandir, "/" S6_SVSCAN_CTLDIR " directory. errno reported") ;
+                return 0 ;
+        case 0: log_warnu("control: ", scandir, ": supervisor not listening") ;
+                return 0 ;
+    }
+
+    return 1 ;
+}
diff --git a/src/lib66/utils/set_livedir.c b/src/lib66/utils/set_livedir.c
new file mode 100644
index 0000000000000000000000000000000000000000..92b4c41f491e0ae25441d24ca0f62f2bdec0b7c5
--- /dev/null
+++ b/src/lib66/utils/set_livedir.c
@@ -0,0 +1,43 @@
+/*
+ * set_livedir.c
+ *
+ * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org>
+ *
+ * All rights reserved.
+ *
+ * This file is part of Obarun. It is subject to the license terms in
+ * the LICENSE file found in the top-level directory of this
+ * distribution.
+ * This file may not be copied, modified, propagated, or distributed
+ * except according to the terms contained in the LICENSE file./
+ */
+
+#include <oblibs/log.h>
+
+#include <skalibs/stralloc.h>
+
+#include <66/constants.h>
+#include <66/utils.h>
+
+int set_livedir(stralloc *live)
+{
+    log_flow() ;
+
+    if (live->len)
+    {
+        if (live->s[0] != '/') return -1 ;
+        if (live->s[live->len - 2] != '/')
+        {
+            live->len-- ;
+            if (!stralloc_cats(live,"/")) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+            if (!stralloc_0(live)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+        }
+    }
+    else
+    {
+        if (!stralloc_cats(live,SS_LIVE)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+        if (!stralloc_0(live)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+    }
+    live->len--;
+    return 1 ;
+}
diff --git a/src/lib66/utils/set_livescan.c b/src/lib66/utils/set_livescan.c
new file mode 100644
index 0000000000000000000000000000000000000000..91980962056c5485a19743280d6b402bf1a1254d
--- /dev/null
+++ b/src/lib66/utils/set_livescan.c
@@ -0,0 +1,44 @@
+/*
+ * set_livescan.c
+ *
+ * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org>
+ *
+ * All rights reserved.
+ *
+ * This file is part of Obarun. It is subject to the license terms in
+ * the LICENSE file found in the top-level directory of this
+ * distribution.
+ * This file may not be copied, modified, propagated, or distributed
+ * except according to the terms contained in the LICENSE file./
+ */
+
+#include <sys/types.h>
+
+#include <oblibs/log.h>
+
+#include <skalibs/stralloc.h>
+#include <skalibs/types.h>
+
+#include <66/utils.h>
+#include <66/constants.h>
+
+int set_livescan(stralloc *scandir,uid_t owner)
+{
+    log_flow() ;
+
+    int r ;
+    char ownerpack[UID_FMT] ;
+
+    r = set_livedir(scandir) ;
+    if (r < 0) return -1 ;
+    if (!r) return 0 ;
+
+    size_t ownerlen = uid_fmt(ownerpack,owner) ;
+    ownerpack[ownerlen] = 0 ;
+
+    if (!stralloc_cats(scandir,SS_SCANDIR "/")) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+    if (!stralloc_cats(scandir,ownerpack)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+    if (!stralloc_0(scandir)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+    scandir->len--;
+    return 1 ;
+}
diff --git a/src/lib66/utils/set_livestate.c b/src/lib66/utils/set_livestate.c
new file mode 100644
index 0000000000000000000000000000000000000000..fab2429f234301ff7e49e905f5887bfb90954aa1
--- /dev/null
+++ b/src/lib66/utils/set_livestate.c
@@ -0,0 +1,45 @@
+/*
+ * set_livestate.c
+ *
+ * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org>
+ *
+ * All rights reserved.
+ *
+ * This file is part of Obarun. It is subject to the license terms in
+ * the LICENSE file found in the top-level directory of this
+ * distribution.
+ * This file may not be copied, modified, propagated, or distributed
+ * except according to the terms contained in the LICENSE file./
+ */
+
+#include <sys/types.h>
+
+#include <oblibs/log.h>
+
+#include <skalibs/types.h>
+#include <skalibs/stralloc.h>
+
+#include <66/constants.h>
+#include <66/utils.h>
+
+int set_livestate(stralloc *livestate,uid_t owner)
+{
+    log_flow() ;
+
+    int r ;
+    char ownerpack[UID_FMT] ;
+
+    r = set_livedir(livestate) ;
+    if (r < 0) return -1 ;
+    if (!r) return 0 ;
+
+    size_t ownerlen = uid_fmt(ownerpack,owner) ;
+    ownerpack[ownerlen] = 0 ;
+
+    if (!stralloc_cats(livestate,SS_STATE + 1)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+    if (!stralloc_cats(livestate,"/")) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+    if (!stralloc_cats(livestate,ownerpack)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+    if (!stralloc_0(livestate)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+    livestate->len--;
+    return 1 ;
+}
diff --git a/src/lib66/utils/set_livetree.c b/src/lib66/utils/set_livetree.c
new file mode 100644
index 0000000000000000000000000000000000000000..0b50e82197a59fd572e4bcb8a145800ac724edf5
--- /dev/null
+++ b/src/lib66/utils/set_livetree.c
@@ -0,0 +1,42 @@
+/*
+ * set_livetree.c
+ *
+ * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org>
+ *
+ * All rights reserved.
+ *
+ * This file is part of Obarun. It is subject to the license terms in
+ * the LICENSE file found in the top-level directory of this
+ * distribution.
+ * This file may not be copied, modified, propagated, or distributed
+ * except according to the terms contained in the LICENSE file./
+ */
+
+#include <oblibs/log.h>
+
+#include <skalibs/types.h>
+#include <skalibs/stralloc.h>
+
+#include <66/utils.h>
+#include <66/constants.h>
+
+int set_livetree(stralloc *livetree,uid_t owner)
+{
+    log_flow() ;
+
+    int r ;
+    char ownerpack[UID_FMT] ;
+
+    r = set_livedir(livetree) ;
+    if (r < 0) return -1 ;
+    if (!r) return 0 ;
+
+    size_t ownerlen = uid_fmt(ownerpack,owner) ;
+    ownerpack[ownerlen] = 0 ;
+
+    if (!stralloc_cats(livetree,SS_TREE "/")) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+    if (!stralloc_cats(livetree,ownerpack)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+    if (!stralloc_0(livetree)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+    livetree->len--;
+    return 1 ;
+}
diff --git a/src/lib66/utils/set_ownerhome.c b/src/lib66/utils/set_ownerhome.c
new file mode 100644
index 0000000000000000000000000000000000000000..1efb0f641bf152b2c263d33f1e7b776b7dd16370
--- /dev/null
+++ b/src/lib66/utils/set_ownerhome.c
@@ -0,0 +1,47 @@
+/*
+ * set_ownerhome.c
+ *
+ * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org>
+ *
+ * All rights reserved.
+ *
+ * This file is part of Obarun. It is subject to the license terms in
+ * the LICENSE file found in the top-level directory of this
+ * distribution.
+ * This file may not be copied, modified, propagated, or distributed
+ * except according to the terms contained in the LICENSE file./
+ */
+
+#include <errno.h>
+#include <sys/types.h>
+#include <pwd.h>
+
+#include <oblibs/log.h>
+
+#include <skalibs/stralloc.h>
+
+#include <66/utils.h>
+
+int set_ownerhome(stralloc *base,uid_t owner)
+{
+    log_flow() ;
+
+    char const *user_home = 0 ;
+    int e = errno ;
+    struct passwd *st = getpwuid(owner) ;
+    errno = 0 ;
+    if (!st)
+    {
+        if (!errno) errno = ESRCH ;
+        return 0 ;
+    }
+    user_home = st->pw_dir ;
+    errno = e ;
+    if (!user_home) return 0 ;
+
+    if (!stralloc_cats(base,user_home)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+    if (!stralloc_cats(base,"/")) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+    if (!stralloc_0(base)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+    base->len--;
+    return 1 ;
+}
diff --git a/src/lib66/utils/set_ownersysdir.c b/src/lib66/utils/set_ownersysdir.c
new file mode 100644
index 0000000000000000000000000000000000000000..d29b87bcea2c04df86423a3cab52363d641e56fb
--- /dev/null
+++ b/src/lib66/utils/set_ownersysdir.c
@@ -0,0 +1,55 @@
+/*
+ * set_ownersysdir.c
+ *
+ * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org>
+ *
+ * All rights reserved.
+ *
+ * This file is part of Obarun. It is subject to the license terms in
+ * the LICENSE file found in the top-level directory of this
+ * distribution.
+ * This file may not be copied, modified, propagated, or distributed
+ * except according to the terms contained in the LICENSE file./
+ */
+
+#include <pwd.h>
+#include <errno.h>
+
+#include <oblibs/log.h>
+
+#include <skalibs/stralloc.h>
+
+#include <66/constants.h>
+#include <66/utils.h>
+
+int set_ownersysdir(stralloc *base, uid_t owner)
+{
+    log_flow() ;
+
+    char const *user_home = NULL ;
+    int e = errno ;
+    struct passwd *st = getpwuid(owner) ;
+    errno = 0 ;
+    if (!st)
+    {
+        if (!errno) errno = ESRCH ;
+        return 0 ;
+    }
+    user_home = st->pw_dir ;
+    errno = e ;
+    if (user_home == NULL) return 0 ;
+
+    if(owner > 0){
+        if (!stralloc_cats(base,user_home)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+        if (!stralloc_cats(base,"/")) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+        if (!stralloc_cats(base,SS_USER_DIR)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+        if (!stralloc_0(base)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+    }
+    else
+    {
+        if (!stralloc_cats(base,SS_SYSTEM_DIR)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+        if (!stralloc_0(base)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
+    }
+    base->len--;
+    return 1 ;
+}
diff --git a/src/lib66/utils/utils.c b/src/lib66/utils/utils.c
deleted file mode 100644
index 838781a6c80661025329c15068d83e67123b8eaf..0000000000000000000000000000000000000000
--- a/src/lib66/utils/utils.c
+++ /dev/null
@@ -1,644 +0,0 @@
-/*
- * utils.c
- *
- * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org>
- *
- * All rights reserved.
- *
- * This file is part of Obarun. It is subject to the license terms in
- * the LICENSE file found in the top-level directory of this
- * distribution.
- * This file may not be copied, modified, propagated, or distributed
- * except according to the terms contained in the LICENSE file./
- */
-
-#include <66/utils.h>
-
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <pwd.h>
-#include <errno.h>
-#include <stdlib.h>
-
-#include <oblibs/log.h>
-#include <oblibs/files.h>
-#include <oblibs/sastr.h>
-#include <oblibs/string.h>
-#include <oblibs/types.h>
-#include <oblibs/directory.h>
-
-#include <skalibs/genalloc.h>
-#include <skalibs/stralloc.h>
-#include <skalibs/types.h>
-#include <skalibs/djbunix.h>
-
-#include <66/config.h>
-#include <66/constants.h>
-#include <66/service.h>
-#include <66/resolve.h>
-#include <66/parser.h>
-
-#include <s6/supervise.h>
-
-sv_alltype const sv_alltype_zero = SV_ALLTYPE_ZERO ;
-sv_name_t const sv_name_zero = SV_NAME_ZERO ;
-keynocheck const keynocheck_zero = KEYNOCHECK_ZERO ;
-
-
-/** this following function come from Laurent Bercot
- * author of s6 library all rights reserved on this author
- * It was just modified a little bit to be able to scan
- * a scandir directory instead of a service directory */
-int scandir_ok (char const *dir)
-{
-    log_flow() ;
-
-    size_t dirlen = strlen(dir) ;
-    int fd ;
-    char fn[dirlen + 1 + strlen(S6_SVSCAN_CTLDIR) + 9 + 1] ;
-    memcpy(fn, dir, dirlen) ;
-    fn[dirlen] = '/' ;
-    memcpy(fn + dirlen + 1, S6_SVSCAN_CTLDIR, strlen(S6_SVSCAN_CTLDIR)) ;
-    memcpy(fn + dirlen + 1 + strlen(S6_SVSCAN_CTLDIR), "/control", 9) ;
-    fn[dirlen + 1 + strlen(S6_SVSCAN_CTLDIR) + 9] = 0 ;
-    fd = open_write(fn) ;
-    if (fd < 0)
-    {
-        if ((errno == ENXIO) || (errno == ENOENT)) return 0 ;
-        else return -1 ;
-    }
-    fd_close(fd) ;
-    return 1 ;
-}
-
-int scandir_send_signal(char const *scandir,char const *signal)
-{
-    log_flow() ;
-
-    size_t idlen = strlen(signal) ;
-    char data[idlen + 1] ;
-    size_t datalen = 0 ;
-
-    for (; datalen < idlen ; datalen++)
-        data[datalen] = signal[datalen] ;
-
-    switch (s6_svc_writectl(scandir, S6_SVSCAN_CTLDIR, data, datalen))
-    {
-        case -1: log_warnusys("control: ", scandir) ;
-                return 0 ;
-        case -2: log_warnsys("something is wrong with the ", scandir, "/" S6_SVSCAN_CTLDIR " directory. errno reported") ;
-                return 0 ;
-        case 0: log_warnu("control: ", scandir, ": supervisor not listening") ;
-                return 0 ;
-    }
-
-    return 1 ;
-}
-
-char const *get_userhome(uid_t myuid)
-{
-    log_flow() ;
-
-    char const *user_home = NULL ;
-    struct passwd *st = getpwuid(myuid) ;
-    int e = errno ;
-    errno = 0 ;
-    if (!st)
-    {
-        if (!errno) errno = ESRCH ;
-        return 0 ;
-    }
-    user_home = st->pw_dir ;
-
-    if (!user_home) return 0 ;
-    errno = e ;
-    return user_home ;
-}
-
-int youruid(uid_t *passto,char const *owner)
-{
-    log_flow() ;
-
-    int e ;
-    e = errno ;
-    errno = 0 ;
-    struct passwd *st ;
-    st = getpwnam(owner) ;
-    if (!st)
-    {
-        if (!errno) errno = ESRCH ;
-        return 0 ;
-    }
-    *passto = st->pw_uid ;
-    errno = e ;
-    return 1 ;
-}
-
-int yourgid(gid_t *passto,uid_t owner)
-{
-    log_flow() ;
-
-    int e ;
-    e = errno ;
-    errno = 0 ;
-    struct passwd *st ;
-    st = getpwuid(owner) ;
-    if (!st)
-    {
-        if (!errno) errno = ESRCH ;
-        return 0 ;
-    }
-    *passto = st->pw_gid ;
-    errno = e ;
-    return 1 ;
-}
-
-int set_livedir(stralloc *live)
-{
-    log_flow() ;
-
-    if (live->len)
-    {
-        if (live->s[0] != '/') return -1 ;
-        if (live->s[live->len - 2] != '/')
-        {
-            live->len-- ;
-            if (!stralloc_cats(live,"/")) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-            if (!stralloc_0(live)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-        }
-    }
-    else
-    {
-        if (!stralloc_cats(live,SS_LIVE)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-        if (!stralloc_0(live)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-    }
-    live->len--;
-    return 1 ;
-}
-
-int set_livescan(stralloc *scandir,uid_t owner)
-{
-    log_flow() ;
-
-    int r ;
-    char ownerpack[UID_FMT] ;
-
-    r = set_livedir(scandir) ;
-    if (r < 0) return -1 ;
-    if (!r) return 0 ;
-
-    size_t ownerlen = uid_fmt(ownerpack,owner) ;
-    ownerpack[ownerlen] = 0 ;
-
-    if (!stralloc_cats(scandir,SS_SCANDIR "/")) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-    if (!stralloc_cats(scandir,ownerpack)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-    if (!stralloc_0(scandir)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-    scandir->len--;
-    return 1 ;
-}
-
-int set_livetree(stralloc *livetree,uid_t owner)
-{
-    log_flow() ;
-
-    int r ;
-    char ownerpack[UID_FMT] ;
-
-    r = set_livedir(livetree) ;
-    if (r < 0) return -1 ;
-    if (!r) return 0 ;
-
-    size_t ownerlen = uid_fmt(ownerpack,owner) ;
-    ownerpack[ownerlen] = 0 ;
-
-    if (!stralloc_cats(livetree,SS_TREE "/")) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-    if (!stralloc_cats(livetree,ownerpack)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-    if (!stralloc_0(livetree)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-    livetree->len--;
-    return 1 ;
-}
-
-int set_livestate(stralloc *livestate,uid_t owner)
-{
-    log_flow() ;
-
-    int r ;
-    char ownerpack[UID_FMT] ;
-
-    r = set_livedir(livestate) ;
-    if (r < 0) return -1 ;
-    if (!r) return 0 ;
-
-    size_t ownerlen = uid_fmt(ownerpack,owner) ;
-    ownerpack[ownerlen] = 0 ;
-
-    if (!stralloc_cats(livestate,SS_STATE + 1)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-    if (!stralloc_cats(livestate,"/")) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-    if (!stralloc_cats(livestate,ownerpack)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-    if (!stralloc_0(livestate)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-    livestate->len--;
-    return 1 ;
-}
-
-int set_ownerhome(stralloc *base,uid_t owner)
-{
-    log_flow() ;
-
-    char const *user_home = 0 ;
-    int e = errno ;
-    struct passwd *st = getpwuid(owner) ;
-    errno = 0 ;
-    if (!st)
-    {
-        if (!errno) errno = ESRCH ;
-        return 0 ;
-    }
-    user_home = st->pw_dir ;
-    errno = e ;
-    if (!user_home) return 0 ;
-
-    if (!stralloc_cats(base,user_home)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-    if (!stralloc_cats(base,"/")) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-    if (!stralloc_0(base)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-    base->len--;
-    return 1 ;
-}
-
-int set_ownersysdir(stralloc *base, uid_t owner)
-{
-    log_flow() ;
-
-    char const *user_home = NULL ;
-    int e = errno ;
-    struct passwd *st = getpwuid(owner) ;
-    errno = 0 ;
-    if (!st)
-    {
-        if (!errno) errno = ESRCH ;
-        return 0 ;
-    }
-    user_home = st->pw_dir ;
-    errno = e ;
-    if (user_home == NULL) return 0 ;
-
-    if(owner > 0){
-        if (!stralloc_cats(base,user_home)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-        if (!stralloc_cats(base,"/")) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-        if (!stralloc_cats(base,SS_USER_DIR)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-        if (!stralloc_0(base)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-    }
-    else
-    {
-        if (!stralloc_cats(base,SS_SYSTEM_DIR)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-        if (!stralloc_0(base)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-    }
-    base->len--;
-    return 1 ;
-}
-
-int read_svfile(stralloc *sasv,char const *name,char const *src)
-{
-    log_flow() ;
-
-    int r ;
-    size_t srclen = strlen(src) ;
-    size_t namelen = strlen(name) ;
-
-    char svtmp[srclen + namelen + 1] ;
-    memcpy(svtmp,src,srclen) ;
-    memcpy(svtmp + srclen, name, namelen) ;
-    svtmp[srclen + namelen] = 0 ;
-
-    size_t filesize=file_get_size(svtmp) ;
-    if (!filesize)
-        log_warn_return(LOG_EXIT_LESSONE,svtmp," is empty") ;
-
-    r = openreadfileclose(svtmp,sasv,filesize) ;
-    if(!r)
-        log_warnusys_return(LOG_EXIT_ZERO,"open ", svtmp) ;
-
-    /** ensure that we have an empty line at the end of the string*/
-    if (!stralloc_cats(sasv,"\n")) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-    if (!stralloc_0(sasv)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-
-    return 1 ;
-}
-
-int module_in_cmdline(genalloc *gares, resolve_service_t *res, char const *dir)
-{
-    log_flow() ;
-
-    int e = 0 ;
-    stralloc tmp = STRALLOC_ZERO ;
-    size_t pos = 0 ;
-    resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, res) ;
-
-    if (!resolve_append(gares,wres)) goto err ;
-
-    if (res->contents)
-    {
-        if (!sastr_clean_string(&tmp,res->sa.s + res->contents))
-            goto err ;
-    }
-    for (; pos < tmp.len ; pos += strlen(tmp.s + pos) + 1)
-    {
-        char *name = tmp.s + pos ;
-        if (!resolve_check(dir,name)) goto err ;
-        if (!resolve_read(wres,dir,name)) goto err ;
-        if (res->type == TYPE_CLASSIC)
-            if (resolve_search(gares,name, DATA_SERVICE) < 0)
-                if (!resolve_append(gares,wres)) goto err ;
-    }
-
-    e = 1 ;
-
-    err:
-        free(wres) ;
-        stralloc_free(&tmp) ;
-        return e ;
-}
-
-int module_search_service(char const *src, genalloc *gares, char const *name,uint8_t *found, char module_name[256])
-{
-    log_flow() ;
-
-    int e = 0 ;
-    size_t srclen = strlen(src), pos = 0, deps = 0 ;
-    stralloc list = STRALLOC_ZERO ;
-    stralloc tmp = STRALLOC_ZERO ;
-    resolve_service_t res = RESOLVE_SERVICE_ZERO ;
-    resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ;
-    char const *exclude[2] = { SS_MASTER + 1, 0 } ;
-
-    char t[srclen + SS_RESOLVE_LEN + 1] ;
-    auto_strings(t,src,SS_RESOLVE) ;
-
-    if (!sastr_dir_get(&list,t,exclude,S_IFREG)) goto err ;
-
-    for (;pos < list.len ; pos += strlen(list.s + pos) + 1)
-    {
-        char *dname = list.s + pos ;
-        if (!resolve_read(wres,src,dname)) goto err ;
-        if (res.type == TYPE_MODULE && res.contents)
-        {
-            if (!sastr_clean_string(&tmp,res.sa.s + res.contents)) goto err ;
-            for (deps = 0 ; deps < tmp.len ; deps += strlen(tmp.s + deps) + 1)
-            {
-                if (!strcmp(name,tmp.s + deps))
-                {
-                    (*found)++ ;
-                    if (strlen(dname) > 255) log_1_warn_return(LOG_EXIT_ZERO,"module name too long") ;
-                    auto_strings(module_name,dname) ;
-                    goto end ;
-                }
-            }
-        }
-    }
-    end:
-    /** search if the service is on the commandline
-     * if not we crash */
-    for(pos = 0 ; pos < genalloc_len(resolve_service_t,gares) ; pos++)
-    {
-        resolve_service_t_ref pres = &genalloc_s(resolve_service_t, gares)[pos] ;
-        char *str = pres->sa.s ;
-        char *name = str + pres->name ;
-        if (!strcmp(name,module_name)) {
-            (*found) = 0 ;
-            break ;
-        }
-    }
-
-    e = 1 ;
-
-    err:
-        stralloc_free(&list) ;
-        stralloc_free(&tmp) ;
-        resolve_free(wres) ;
-        return e ;
-}
-
-/* @sdir -> service dir
- * @mdir -> module dir */
-int module_path(stralloc *sdir, stralloc *mdir, char const *sv,char const *frontend_src, uid_t owner)
-{
-    log_flow() ;
-
-    int r, insta ;
-    stralloc sainsta = STRALLOC_ZERO ;
-    stralloc mhome = STRALLOC_ZERO ; // module user dir
-    stralloc shome = STRALLOC_ZERO ; // service user dir
-    char const *src = 0 ;
-    char const *dest = 0 ;
-
-    insta = instance_check(sv) ;
-    instance_splitname(&sainsta,sv,insta,SS_INSTANCE_TEMPLATE) ;
-
-    if (!owner)
-    {
-        src = SS_MODULE_ADMDIR ;
-        dest = frontend_src ;
-    }
-    else
-    {
-        if (!set_ownerhome(&mhome,owner)) log_warnusys_return(LOG_EXIT_ZERO,"set home directory") ;
-        if (!stralloc_cats(&mhome,SS_MODULE_USERDIR)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-        if (!stralloc_0(&mhome)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-        mhome.len-- ;
-        src = mhome.s ;
-
-        if (!set_ownerhome(&shome,owner)) log_warnusys_return(LOG_EXIT_ZERO,"set home directory") ;
-        if (!stralloc_cats(&shome,SS_SERVICE_USERDIR)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-        if (!stralloc_0(&shome)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-        shome.len-- ;
-        dest = shome.s ;
-
-    }
-    if (!auto_stra(mdir,src,sainsta.s)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-    r = scan_mode(mdir->s,S_IFDIR) ;
-    if (!r || r == -1)
-    {
-        mdir->len = 0 ;
-        src = SS_MODULE_ADMDIR ;
-        if (!auto_stra(mdir,src,sainsta.s)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-        r = scan_mode(mdir->s,S_IFDIR) ;
-        if (!r || r == -1)
-        {
-            mdir->len = 0 ;
-            src = SS_MODULE_SYSDIR ;
-            if (!auto_stra(mdir,src,sainsta.s)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-            r = scan_mode(mdir->s,S_IFDIR) ;
-            if (!r || r == -1) log_warnu_return(LOG_EXIT_ZERO,"find module: ",sv) ;
-        }
-
-    }
-    if (!auto_stra(sdir,dest,sv)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
-
-    stralloc_free(&sainsta) ;
-    stralloc_free(&mhome) ;
-    stralloc_free(&shome) ;
-    return 1 ;
-}
-
-int sa_pointo(stralloc *sa, ssexec_t *info, int type, unsigned int where)
-{
-    log_flow() ;
-
-    sa->len = 0 ;
-
-    char ownerstr[UID_FMT] ;
-    size_t ownerlen = uid_fmt(ownerstr,info->owner) ;
-    ownerstr[ownerlen] = 0 ;
-
-    if (where == SS_RESOLVE_STATE) {
-
-        if (!auto_stra(sa, info->live.s, SS_STATE + 1, "/", ownerstr, "/", info->treename.s))
-            goto err ;
-
-    } else if (where == SS_RESOLVE_SRC) {
-
-        if (!auto_stra(sa, info->tree.s, SS_SVDIRS))
-            goto err ;
-
-    } else if (where == SS_RESOLVE_BACK) {
-
-        if (!auto_stra(sa, info->base.s, SS_SYSTEM, SS_BACKUP, "/", info->treename.s))
-            goto err ;
-
-    } else if (where == SS_RESOLVE_LIVE) {
-
-        if (!auto_stra(sa, info->live.s, SS_STATE + 1, "/", ownerstr, "/", info->treename.s, SS_SVDIRS))
-            goto err ;
-    }
-
-    if (type >= 0 && where) {
-
-        if (type == TYPE_CLASSIC) {
-
-            if (!auto_stra(sa, SS_SVC))
-                goto err ;
-
-        } else if (!auto_stra(sa, SS_DB))
-            goto err ;
-    }
-
-    return 1 ;
-
-    err:
-        return 0 ;
-}
-
-int create_live(ssexec_t *info)
-{
-    log_flow() ;
-
-    int r ;
-    gid_t gidowner ;
-    if (!yourgid(&gidowner,info->owner)) return 0 ;
-    stralloc sares = STRALLOC_ZERO ;
-    stralloc ressrc = STRALLOC_ZERO ;
-
-    if (!sa_pointo(&ressrc,info,SS_NOTYPE,SS_RESOLVE_SRC)) goto err ;
-
-    if (!sa_pointo(&sares,info,SS_NOTYPE,SS_RESOLVE_STATE)) goto err ;
-    r = scan_mode(sares.s,S_IFDIR) ;
-    if (r < 0) goto err ;
-    if (!r)
-    {
-        ssize_t len = get_rlen_until(sares.s,'/',sares.len) ;
-        sares.len-- ;
-        char sym[sares.len + SS_SVDIRS_LEN + 1] ;
-        memcpy(sym,sares.s,sares.len) ;
-        sym[sares.len] = 0 ;
-
-        r = dir_create_parent(sym,0700) ;
-        if (!r) goto err ;
-        sym[len] = 0 ;
-        if (chown(sym,info->owner,gidowner) < 0) goto err ;
-        memcpy(sym,sares.s,sares.len) ;
-        memcpy(sym + sares.len, SS_SVDIRS, SS_SVDIRS_LEN) ;
-        sym[sares.len + SS_SVDIRS_LEN] = 0 ;
-
-        log_trace("point symlink: ",sym," to ",ressrc.s) ;
-        if (symlink(ressrc.s,sym) < 0)
-        {
-            log_warnusys("symlink: ", sym) ;
-            goto err ;
-        }
-    }
-    /** live/state/uid/treename/init file */
-    if (!file_write_unsafe(sares.s,"init","",0)) goto err ;
-
-    stralloc_free(&ressrc) ;
-    stralloc_free(&sares) ;
-
-    return 1 ;
-    err:
-        stralloc_free(&ressrc) ;
-        stralloc_free(&sares) ;
-        return 0 ;
-}
-/*
- *
- *
- * Not used
- *
- *
- *
-
-int sort_byfile_first(stralloc *sort, char const *src)
-{
-    log_flow() ;
-
-    int fdsrc ;
-    stralloc tmp = STRALLOC_ZERO ;
-
-    DIR *dir = opendir(src) ;
-    if (!dir)
-    {
-        log_warnusys("open : ", src) ;
-        goto errstra ;
-    }
-    fdsrc = dir_fd(dir) ;
-
-    for (;;)
-    {
-        tmp.len = 0 ;
-        struct stat st ;
-        direntry *d ;
-        d = readdir(dir) ;
-        if (!d) break ;
-        if (d->d_name[0] == '.')
-        if (((d->d_name[1] == '.') && !d->d_name[2]) || !d->d_name[1])
-            continue ;
-
-        if (stat_at(fdsrc, d->d_name, &st) < 0)
-        {
-            log_warnusys("stat ", src, d->d_name) ;
-            goto errdir ;
-        }
-
-        if (S_ISREG(st.st_mode))
-        {
-            if (!auto_stra(&tmp,src,d->d_name)) goto errdir ;
-            if (!stralloc_insertb(sort,0,tmp.s,strlen(tmp.s) + 1)) goto errdir ;
-        }
-        else if(S_ISDIR(st.st_mode))
-        {
-            if (!auto_stra(&tmp,src,d->d_name,"/")) goto errdir ;
-            if (!stralloc_insertb(sort,sort->len,tmp.s,strlen(tmp.s) + 1)) goto errdir ;
-        }
-    }
-
-    dir_close(dir) ;
-    stralloc_free(&tmp) ;
-
-    return 1 ;
-
-    errdir:
-        dir_close(dir) ;
-    errstra:
-        stralloc_free(&tmp) ;
-        return 0 ;
-}
-*/
diff --git a/src/lib66/utils/yourgid.c b/src/lib66/utils/yourgid.c
new file mode 100644
index 0000000000000000000000000000000000000000..c4845c0fd1b1dae6548e8eceaf67803797ef675c
--- /dev/null
+++ b/src/lib66/utils/yourgid.c
@@ -0,0 +1,40 @@
+/*
+ * yourgid.c
+ *
+ * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org>
+ *
+ * All rights reserved.
+ *
+ * This file is part of Obarun. It is subject to the license terms in
+ * the LICENSE file found in the top-level directory of this
+ * distribution.
+ * This file may not be copied, modified, propagated, or distributed
+ * except according to the terms contained in the LICENSE file./
+ */
+
+#include <sys/types.h>
+#include <errno.h>
+#include <pwd.h>
+
+#include <oblibs/log.h>
+
+#include <66/utils.h>
+
+int yourgid(gid_t *passto,uid_t owner)
+{
+    log_flow() ;
+
+    int e ;
+    e = errno ;
+    errno = 0 ;
+    struct passwd *st ;
+    st = getpwuid(owner) ;
+    if (!st)
+    {
+        if (!errno) errno = ESRCH ;
+        return 0 ;
+    }
+    *passto = st->pw_gid ;
+    errno = e ;
+    return 1 ;
+}
diff --git a/src/lib66/utils/youruid.c b/src/lib66/utils/youruid.c
new file mode 100644
index 0000000000000000000000000000000000000000..dda5164743343e6165a1820432525f2b48080394
--- /dev/null
+++ b/src/lib66/utils/youruid.c
@@ -0,0 +1,39 @@
+/*
+ * youruid.c
+ *
+ * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org>
+ *
+ * All rights reserved.
+ *
+ * This file is part of Obarun. It is subject to the license terms in
+ * the LICENSE file found in the top-level directory of this
+ * distribution.
+ * This file may not be copied, modified, propagated, or distributed
+ * except according to the terms contained in the LICENSE file./
+ */
+
+#include <sys/types.h>
+#include <errno.h>
+#include <pwd.h>
+
+#include <oblibs/log.h>
+#include <66/utils.h>
+
+int youruid(uid_t *passto,char const *owner)
+{
+    log_flow() ;
+
+    int e ;
+    e = errno ;
+    errno = 0 ;
+    struct passwd *st ;
+    st = getpwnam(owner) ;
+    if (!st)
+    {
+        if (!errno) errno = ESRCH ;
+        return 0 ;
+    }
+    *passto = st->pw_uid ;
+    errno = e ;
+    return 1 ;
+}