From f47a16a0703e5fbd1977d94b24db2f4eaade26c2 Mon Sep 17 00:00:00 2001
From: obarun <eric@obarun.org>
Date: Sat, 15 Oct 2022 21:08:33 +1100
Subject: [PATCH] adapt resolve function to new format

---
 src/include/66/resolve.h                      | 60 ++++++++------
 src/lib66/resolve/deps-lib/deps               |  9 +-
 src/lib66/resolve/resolve_add_cdb_uint.c      |  1 -
 src/lib66/resolve/resolve_add_string.c        |  1 +
 src/lib66/resolve/resolve_append.c            | 71 ----------------
 src/lib66/resolve/resolve_check.c             | 15 ++--
 src/lib66/resolve/resolve_check_g.c           | 45 ++++++++++
 src/lib66/resolve/resolve_cmp.c               | 83 -------------------
 src/lib66/resolve/resolve_deep_free.c         | 63 --------------
 src/lib66/resolve/resolve_find_cdb.c          |  2 +-
 src/lib66/resolve/resolve_free.c              |  3 +-
 src/lib66/resolve/resolve_get_field_tosa.c    | 31 ++-----
 src/lib66/resolve/resolve_get_field_tosa_g.c  | 70 +++++++---------
 src/lib66/resolve/resolve_init.c              |  2 +-
 src/lib66/resolve/resolve_modify_field.c      | 28 ++-----
 src/lib66/resolve/resolve_modify_field_g.c    | 43 ++--------
 src/lib66/resolve/resolve_read.c              | 14 ++--
 src/lib66/resolve/resolve_read_cdb.c          |  9 +-
 src/lib66/resolve/resolve_read_g.c            | 28 ++++---
 .../{resolve_rmfile.c => resolve_remove.c}    | 20 +++--
 src/lib66/resolve/resolve_remove_g.c          | 50 +++++++++++
 src/lib66/resolve/resolve_search.c            | 79 ------------------
 src/lib66/resolve/resolve_write.c             | 13 ++-
 src/lib66/resolve/resolve_write_cdb.c         | 16 ++--
 src/lib66/resolve/resolve_write_g.c           | 43 ++++++++++
 25 files changed, 282 insertions(+), 517 deletions(-)
 delete mode 100644 src/lib66/resolve/resolve_append.c
 create mode 100644 src/lib66/resolve/resolve_check_g.c
 delete mode 100644 src/lib66/resolve/resolve_cmp.c
 delete mode 100644 src/lib66/resolve/resolve_deep_free.c
 rename src/lib66/resolve/{resolve_rmfile.c => resolve_remove.c} (60%)
 create mode 100644 src/lib66/resolve/resolve_remove_g.c
 delete mode 100644 src/lib66/resolve/resolve_search.c
 create mode 100644 src/lib66/resolve/resolve_write_g.c

diff --git a/src/include/66/resolve.h b/src/include/66/resolve.h
index 894aaa4b..7503d2b7 100644
--- a/src/include/66/resolve.h
+++ b/src/include/66/resolve.h
@@ -18,23 +18,23 @@
 #include <stddef.h>
 #include <stdint.h>
 
-#include <skalibs/genalloc.h>
 #include <skalibs/stralloc.h>
 #include <skalibs/cdb.h>
 #include <skalibs/cdbmake.h>
 
-#include <66/graph.h>
 
-#define SS_RESOLVE "/.resolve"
-#define SS_RESOLVE_LEN (sizeof SS_RESOLVE - 1)
 #define SS_RESOLVE_LIVE 0
 #define SS_RESOLVE_SRC 1
-#define SS_RESOLVE_BACK 2
-#define SS_RESOLVE_STATE 3
+#define SS_RESOLVE_STATE 2
 #define SS_NOTYPE -1
 #define SS_SIMPLE 0
 #define SS_DOUBLE 1
 
+#define DATA_TREE 1
+#define DATA_TREE_MASTER 2
+#define DATA_SERVICE 0
+#define DATA_SERVICE_MASTER 3
+
 typedef struct resolve_wrapper_s resolve_wrapper_t, *resolve_wrapper_t_ref ;
 struct resolve_wrapper_s
 {
@@ -59,43 +59,49 @@ struct resolve_field_table_s
 
 /**
  *
- * General API
+ * Freed
+ *
+ * */
+
+extern void resolve_free(resolve_wrapper_t *wres) ;
+
+/**
+ *
+ * Initiate
  *
  * */
 
 extern resolve_wrapper_t *resolve_set_struct(uint8_t type, void *s) ;
 extern int resolve_init(resolve_wrapper_t *wres) ;
-extern int resolve_check(char const *src, char const *name) ;
-extern int resolve_read(resolve_wrapper_t *wres, char const *src, char const *name) ;
-/* convenient API: do a resolve_check then a resolve_read */
-extern int resolve_read_g(resolve_wrapper_t *wres, char const *src, char const *name) ;
-extern int resolve_write(resolve_wrapper_t *wres, char const *dst, char const *name) ;
-extern int resolve_append(genalloc *ga, resolve_wrapper_t *wres) ;
-extern int resolve_search(genalloc *ga, char const *name, uint8_t type) ;
-extern int resolve_cmp(genalloc *ga, char const *name, uint8_t type) ;
-extern void resolve_rmfile(char const *src,char const *name) ;
-extern ssize_t resolve_add_string(resolve_wrapper_t *wres, char const *data) ;
-extern int resolve_get_field_tosa_g(stralloc *sa, char const *base, char const *treename, char const *element, uint8_t data_type, uint8_t field) ;
-extern int resolve_get_field_tosa(stralloc *sa, resolve_wrapper_t_ref wres, uint8_t field) ;
-extern int resolve_modify_field(resolve_wrapper_t_ref wres, uint8_t field, char const *by) ;
-extern int resolve_modify_field_g(resolve_wrapper_t_ref wres, char const *base, char const *element, uint8_t field, char const *value) ;
+
 /**
  *
- * Freed
+ * General API
  *
  * */
 
-extern void resolve_free(resolve_wrapper_t *wres) ;
-extern void resolve_deep_free(uint8_t type, genalloc *g) ;
+extern int resolve_check_g(resolve_wrapper_t *wres, char const *base, char const *name) ;
+extern int resolve_read_g(resolve_wrapper_t *wres, char const *base, char const *name) ;
+extern int resolve_write_g(resolve_wrapper_t *wres, char const *base, char const *name) ;
+extern void resolve_remove_g(char const *base, char const *name, uint8_t data_type) ;
+extern int resolve_get_field_tosa_g(stralloc *sa, char const *base, char const *name, uint8_t data_type, uint8_t field) ;
+extern int resolve_modify_field_g(resolve_wrapper_t_ref wres, char const *base, char const *name, uint8_t field, char const *value) ;
+extern ssize_t resolve_add_string(resolve_wrapper_t *wres, char const *data) ;
 
 /**
  *
- * CDB
+ * Sub-functions
  *
  * */
 
-extern int resolve_read_cdb(resolve_wrapper_t *wres, char const *name) ;
-extern int resolve_write_cdb(resolve_wrapper_t *wres, char const *dst, char const *name) ;
+extern int resolve_check(char const *base, char const *name) ;
+extern int resolve_read(resolve_wrapper_t *wres, char const *base, char const *name) ;
+extern int resolve_write(resolve_wrapper_t *wres, char const *base, char const *name) ;
+extern void resolve_remove(char const *base, char const *name) ;
+extern int resolve_get_field_tosa(stralloc *sa, resolve_wrapper_t_ref wres, uint8_t field) ;
+extern int resolve_modify_field(resolve_wrapper_t_ref wres, uint8_t field, char const *by) ;
+extern int resolve_read_cdb(resolve_wrapper_t *wres, char const *file) ;
+extern int resolve_write_cdb(resolve_wrapper_t *wres, char const *file) ;
 extern int resolve_add_cdb(cdbmaker *c, char const *key, char const *data) ;
 extern int resolve_add_cdb_uint(cdbmaker *c, char const *key, uint32_t data) ;
 extern int resolve_find_cdb(stralloc *result, cdb const *c, char const *key) ;
diff --git a/src/lib66/resolve/deps-lib/deps b/src/lib66/resolve/deps-lib/deps
index 1e5516c8..d260271d 100644
--- a/src/lib66/resolve/deps-lib/deps
+++ b/src/lib66/resolve/deps-lib/deps
@@ -1,10 +1,8 @@
 resolve_add_cdb.o
 resolve_add_cdb_uint.o
 resolve_add_string.o
-resolve_append.o
 resolve_check.o
-resolve_cmp.o
-resolve_deep_free.o
+resolve_check_g.o
 resolve_find_cdb.o
 resolve_free.o
 resolve_get_field_tosa.o
@@ -15,11 +13,12 @@ resolve_modify_field_g.o
 resolve_read.o
 resolve_read_cdb.o
 resolve_read_g.o
-resolve_rmfile.o
-resolve_search.o
+resolve_remove.o
+resolve_remove_g.o
 resolve_set_struct.o
 resolve_write.o
 resolve_write_cdb.o
+resolve_write_g.o
 -loblibs
 -lskarnet
 
diff --git a/src/lib66/resolve/resolve_add_cdb_uint.c b/src/lib66/resolve/resolve_add_cdb_uint.c
index 215cacf7..bba210d8 100644
--- a/src/lib66/resolve/resolve_add_cdb_uint.c
+++ b/src/lib66/resolve/resolve_add_cdb_uint.c
@@ -16,7 +16,6 @@
 #include <stdint.h>
 
 #include <oblibs/log.h>
-#include <oblibs/string.h>
 
 #include <skalibs/cdbmake.h>
 #include <skalibs/types.h>//uint##_pack
diff --git a/src/lib66/resolve/resolve_add_string.c b/src/lib66/resolve/resolve_add_string.c
index 6f497d2b..ddd67da9 100644
--- a/src/lib66/resolve/resolve_add_string.c
+++ b/src/lib66/resolve/resolve_add_string.c
@@ -20,6 +20,7 @@
 #include <skalibs/stralloc.h>
 
 #include <66/resolve.h>
+#include <66/constants.h>
 #include <66/service.h>
 #include <66/tree.h>
 
diff --git a/src/lib66/resolve/resolve_append.c b/src/lib66/resolve/resolve_append.c
deleted file mode 100644
index 083af9fe..00000000
--- a/src/lib66/resolve/resolve_append.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * resolve_append.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/genalloc.h>
-
-#include <66/resolve.h>
-#include <66/graph.h>
-#include <66/service.h>
-#include <66/tree.h>
-
-int resolve_append(genalloc *ga, resolve_wrapper_t *wres)
-{
-    log_flow() ;
-
-    int e = 0 ;
-
-    if (wres->type == DATA_SERVICE) {
-
-        resolve_service_t cp = RESOLVE_SERVICE_ZERO ;
-        if (!service_resolve_copy(&cp, ((resolve_service_t *)wres->obj)))
-            goto err ;
-
-        if (!genalloc_append(resolve_service_t, ga, &cp))
-            goto err ;
-
-    } else if (wres->type == DATA_SERVICE_MASTER) {
-
-        resolve_service_master_t cp = RESOLVE_SERVICE_MASTER_ZERO ;
-        if (!service_resolve_master_copy(&cp, ((resolve_service_master_t *)wres->obj)))
-            goto err ;
-
-        if (!genalloc_append(resolve_service_master_t, ga, &cp))
-            goto err ;
-
-    } else if (wres->type == DATA_TREE) {
-
-        resolve_tree_t cp = RESOLVE_TREE_ZERO ;
-        if (!tree_resolve_copy(&cp, ((resolve_tree_t *)wres->obj)))
-            goto err ;
-
-        if (!genalloc_append(resolve_tree_t, ga, &cp))
-            goto err ;
-
-    } else if (wres->type == DATA_TREE_MASTER) {
-
-            resolve_tree_master_t cp = RESOLVE_TREE_MASTER_ZERO ;
-
-            if (!tree_resolve_master_copy(&cp, ((resolve_tree_master_t *)wres->obj)))
-                goto err ;
-
-            if (!genalloc_append(resolve_tree_master_t, ga, &cp))
-                goto err ;
-    }
-
-    e = 1 ;
-    err:
-        return e ;
-}
diff --git a/src/lib66/resolve/resolve_check.c b/src/lib66/resolve/resolve_check.c
index 497773bc..2e29482f 100644
--- a/src/lib66/resolve/resolve_check.c
+++ b/src/lib66/resolve/resolve_check.c
@@ -13,28 +13,25 @@
  */
 
 #include <string.h>
-#include <sys/stat.h>
+#include <unistd.h>
 
 #include <oblibs/log.h>
-#include <oblibs/types.h>
 #include <oblibs/string.h>
 
 #include <66/resolve.h>
 #include <66/constants.h>
 
-int resolve_check(char const *src, char const *name)
+int resolve_check(char const *base, char const *name)
 {
     log_flow() ;
 
-    int r ;
-    size_t srclen = strlen(src) ;
+    size_t baselen = strlen(base) ;
     size_t namelen = strlen(name) ;
 
-    char tmp[srclen + SS_RESOLVE_LEN + 1 + namelen + 1] ;
-    auto_strings(tmp, src, SS_RESOLVE, "/", name) ;
+    char file[baselen + SS_RESOLVE_LEN + 1 + namelen + 1] ;
+    auto_strings(file, base, SS_RESOLVE, "/", name) ;
 
-    r = scan_mode(tmp,S_IFREG) ;
-    if (r <= 0)
+    if (access(file, F_OK) < 0)
         return 0 ;
 
     return 1 ;
diff --git a/src/lib66/resolve/resolve_check_g.c b/src/lib66/resolve/resolve_check_g.c
new file mode 100644
index 00000000..98eccee8
--- /dev/null
+++ b/src/lib66/resolve/resolve_check_g.c
@@ -0,0 +1,45 @@
+/*
+ * resolve_check_g.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/string.h>
+
+#include <66/resolve.h>
+#include <66/constants.h>
+
+int resolve_check_g(resolve_wrapper_t *wres, char const *base, char const *name)
+{
+
+    log_flow() ;
+
+    size_t baselen = strlen(base) ;
+    size_t namelen = strlen(name) ;
+
+    char path[baselen + SS_SYSTEM_LEN + SS_RESOLVE_LEN + 1 + SS_SERVICE_LEN + 1 + SS_SERVICE_LEN + 1 + namelen + 1] ;
+
+    if (wres->type == DATA_SERVICE || wres->type == DATA_SERVICE_MASTER) {
+
+        auto_strings(path, base, SS_SYSTEM, SS_RESOLVE, "/", SS_SERVICE, "/", name) ;
+
+    } else if (wres->type == DATA_TREE || wres->type == DATA_TREE_MASTER) {
+
+        auto_strings(path, base, SS_SYSTEM) ;
+
+    } else return 0 ;
+
+    return resolve_check(path, name) ;
+
+}
diff --git a/src/lib66/resolve/resolve_cmp.c b/src/lib66/resolve/resolve_cmp.c
deleted file mode 100644
index 8ddee791..00000000
--- a/src/lib66/resolve/resolve_cmp.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * resolve_cmp.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 <stdint.h>
-
-#include <oblibs/log.h>
-
-#include <skalibs/genalloc.h>
-
-#include <66/resolve.h>
-#include <66/graph.h>
-#include <66/service.h>
-#include <66/tree.h>
-
-int resolve_cmp(genalloc *ga, char const *name, uint8_t type)
-{
-    log_flow() ;
-
-    size_t len, pos = 0 ;
-
-    if (type == DATA_SERVICE) {
-
-        len = genalloc_len(resolve_service_t, ga) ;
-
-        for (;pos < len ; pos++) {
-
-            char *str = genalloc_s(resolve_service_t, ga)[pos].sa.s ;
-            char *s = str + genalloc_s(resolve_service_t, ga)[pos].name ;
-            if (!strcmp(name,s))
-                return 1 ;
-        }
-
-    } else if (type == DATA_SERVICE_MASTER) {
-
-        len = genalloc_len(resolve_service_master_t, ga) ;
-
-        for (;pos < len ; pos++) {
-
-            char *str = genalloc_s(resolve_service_master_t, ga)[pos].sa.s ;
-            char *s = str + genalloc_s(resolve_service_master_t, ga)[pos].name ;
-            if (!strcmp(name,s))
-                return 1 ;
-        }
-
-    } else if (type == DATA_TREE) {
-
-        len = genalloc_len(resolve_tree_t, ga) ;
-
-        for (;pos < len ; pos++) {
-
-            char *str = genalloc_s(resolve_tree_t, ga)[pos].sa.s ;
-            char *s = str + genalloc_s(resolve_tree_t, ga)[pos].name ;
-            if (!strcmp(name,s))
-                return 1 ;
-        }
-
-    } else if (type == DATA_TREE_MASTER) {
-
-        len = genalloc_len(resolve_tree_master_t, ga) ;
-
-        for (;pos < len ; pos++) {
-
-            char *str = genalloc_s(resolve_tree_master_t, ga)[pos].sa.s ;
-            char *s = str + genalloc_s(resolve_tree_master_t, ga)[pos].name ;
-            if (!strcmp(name,s))
-                return 1 ;
-        }
-    }
-
-    return 0 ;
-}
diff --git a/src/lib66/resolve/resolve_deep_free.c b/src/lib66/resolve/resolve_deep_free.c
deleted file mode 100644
index e6446e01..00000000
--- a/src/lib66/resolve/resolve_deep_free.c
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * resolve_deep_free.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 <stdint.h>
-#include <stddef.h>
-
-#include <oblibs/log.h>
-
-#include <skalibs/stralloc.h>
-#include <skalibs/genalloc.h>
-
-#include <66/resolve.h>
-#include <66/service.h>
-#include <66/tree.h>
-#include <66/graph.h>
-
-void resolve_deep_free(uint8_t type, genalloc *g)
-{
-    log_flow() ;
-
-    size_t pos = 0 ;
-
-    if (type == DATA_SERVICE) {
-
-        for (; pos < genalloc_len(resolve_service_t, g) ; pos++)
-            stralloc_free(&genalloc_s(resolve_service_t, g)[pos].sa) ;
-
-        genalloc_free(resolve_service_t, g) ;
-
-    } else if (type == DATA_SERVICE_MASTER) {
-
-        for (; pos < genalloc_len(resolve_service_master_t, g) ; pos++)
-            stralloc_free(&genalloc_s(resolve_service_master_t, g)[pos].sa) ;
-
-        genalloc_free(resolve_service_master_t, g) ;
-
-    } else if (type == DATA_TREE) {
-
-        for (; pos < genalloc_len(resolve_tree_t, g) ; pos++)
-            stralloc_free(&genalloc_s(resolve_tree_t, g)[pos].sa) ;
-
-         genalloc_free(resolve_tree_t, g) ;
-
-    } else if (type == DATA_TREE_MASTER) {
-
-        for (; pos < genalloc_len(resolve_tree_master_t, g) ; pos++)
-            stralloc_free(&genalloc_s(resolve_tree_master_t, g)[pos].sa) ;
-
-         genalloc_free(resolve_tree_master_t, g) ;
-    }
-
-}
diff --git a/src/lib66/resolve/resolve_find_cdb.c b/src/lib66/resolve/resolve_find_cdb.c
index 188fe0a0..dd277c2d 100644
--- a/src/lib66/resolve/resolve_find_cdb.c
+++ b/src/lib66/resolve/resolve_find_cdb.c
@@ -26,7 +26,7 @@
 
 int resolve_find_cdb(stralloc *result, cdb const *c, char const *key)
 {
-    log_flow() ;
+    //log_flow() ;
 
     uint32_t x = 0 ;
     size_t klen = strlen(key) ;
diff --git a/src/lib66/resolve/resolve_free.c b/src/lib66/resolve/resolve_free.c
index 32b04054..c58b4d99 100644
--- a/src/lib66/resolve/resolve_free.c
+++ b/src/lib66/resolve/resolve_free.c
@@ -19,8 +19,9 @@
 #include <skalibs/stralloc.h>
 
 #include <66/resolve.h>
-#include <66/service.h>
+#include <66/constants.h>
 #include <66/tree.h>
+#include <66/service.h>
 
 void resolve_free(resolve_wrapper_t *wres)
 {
diff --git a/src/lib66/resolve/resolve_get_field_tosa.c b/src/lib66/resolve/resolve_get_field_tosa.c
index eae25116..51fa494d 100644
--- a/src/lib66/resolve/resolve_get_field_tosa.c
+++ b/src/lib66/resolve/resolve_get_field_tosa.c
@@ -12,62 +12,43 @@
  * except according to the terms contained in the LICENSE file./
  */
 
-#include <string.h>
 #include <stdint.h>
-#include <stdlib.h>
 
 #include <oblibs/log.h>
 
 #include <skalibs/stralloc.h>
 
 #include <66/resolve.h>
-#include <66/tree.h>
 #include <66/service.h>
-#include <66/constants.h>
+#include <66/tree.h>
 
 int resolve_get_field_tosa(stralloc *sa, resolve_wrapper_t_ref wres, uint8_t field)
 {
     log_flow() ;
 
-    int e = 0 ;
-    resolve_wrapper_t_ref mwres = 0 ;
-
     if (wres->type == DATA_SERVICE) {
 
         resolve_service_t_ref res = (resolve_service_t *)wres->obj  ;
-        mwres = resolve_set_struct(DATA_SERVICE, res) ;
 
-        if (!service_resolve_get_field_tosa(sa, res, field))
-            goto err ;
+        return service_resolve_get_field_tosa(sa, res, field) ;
 
     } else if (wres->type == DATA_SERVICE_MASTER) {
 
         resolve_service_master_t_ref res = (resolve_service_master_t *)wres->obj  ;
-        mwres = resolve_set_struct(DATA_SERVICE_MASTER, res) ;
 
-        if (!service_resolve_master_get_field_tosa(sa, res, field))
-            goto err ;
+        return service_resolve_master_get_field_tosa(sa, res, field) ;
 
     } else if (wres->type == DATA_TREE) {
 
         resolve_tree_t_ref res = (resolve_tree_t *)wres->obj  ;
-        mwres = resolve_set_struct(DATA_TREE, res) ;
 
-        if (!tree_resolve_get_field_tosa(sa, res, field))
-            goto err ;
+        return tree_resolve_get_field_tosa(sa, res, field) ;
 
     } else if (wres->type == DATA_TREE_MASTER) {
 
         resolve_tree_master_t_ref res = (resolve_tree_master_t *)wres->obj  ;
-        mwres = resolve_set_struct(DATA_TREE_MASTER, res) ;
-
-        if (!tree_resolve_master_get_field_tosa(sa, res, field))
-            goto err ;
-    }
 
-    e = 1 ;
-    err:
-        free(mwres) ;
-        return e ;
+        return tree_resolve_master_get_field_tosa(sa, res, field) ;
 
+    } else return 0 ;
 }
diff --git a/src/lib66/resolve/resolve_get_field_tosa_g.c b/src/lib66/resolve/resolve_get_field_tosa_g.c
index f2c6aa02..5039ef81 100644
--- a/src/lib66/resolve/resolve_get_field_tosa_g.c
+++ b/src/lib66/resolve/resolve_get_field_tosa_g.c
@@ -22,74 +22,64 @@
 #include <skalibs/stralloc.h>
 
 #include <66/constants.h>
-#include <66/tree.h>
-#include <66/service.h>
 #include <66/resolve.h>
+#include <66/service.h>
+#include <66/tree.h>
 
-int resolve_get_field_tosa_g(stralloc *sa, char const *base, char const *treename, char const *element, uint8_t data_type, uint8_t field)
+int resolve_get_field_tosa_g(stralloc *sa, char const *base, char const *name, uint8_t data_type, uint8_t field)
 {
     log_flow() ;
+
+    if (!name)
+        return 0 ;
+
     int e = 0 ;
-    size_t baselen = strlen(base), tot = baselen + SS_SYSTEM_LEN + 1, treelen = 0 ;
 
     resolve_service_t res = RESOLVE_SERVICE_ZERO ;
     resolve_service_master_t mres = RESOLVE_SERVICE_MASTER_ZERO ;
     resolve_tree_t tres = RESOLVE_TREE_ZERO ;
     resolve_tree_master_t tmres = RESOLVE_TREE_MASTER_ZERO ;
-
     resolve_wrapper_t_ref wres = 0 ;
 
     if (data_type == DATA_SERVICE) {
-        treelen = strlen(treename) ;
-        tot += treelen + SS_SVDIRS_LEN + 1 ;
-    }
-
-    char solve[tot] ;
-
-    if (data_type == DATA_SERVICE || data_type == DATA_SERVICE_MASTER) {
 
-        if (data_type == DATA_SERVICE) {
+        wres = resolve_set_struct(data_type, &res) ;
 
-            wres = resolve_set_struct(data_type, &res) ;
+    } else if (data_type == DATA_SERVICE_MASTER) {
 
-        } else if (data_type == DATA_SERVICE_MASTER) {
+        wres = resolve_set_struct(data_type, &mres) ;
 
-            wres = resolve_set_struct(data_type, &mres) ;
-        }
+    } else if (data_type == DATA_TREE) {
 
-        auto_strings(solve, base, SS_SYSTEM, "/", treename, SS_SVDIRS) ;
+        wres = resolve_set_struct(data_type, &tres) ;
 
-    } else if (data_type == DATA_TREE || data_type == DATA_TREE_MASTER) {
+    } else if (data_type == DATA_TREE_MASTER) {
 
-        if (data_type == DATA_TREE) {
+        wres = resolve_set_struct(data_type, &tmres) ;
 
-            wres = resolve_set_struct(data_type, &tres) ;
-
-        } else if (data_type == DATA_TREE_MASTER) {
-
-            wres = resolve_set_struct(data_type, &tmres) ;
-        }
-
-        auto_strings(solve, base, SS_SYSTEM) ;
-    }
-
-    if (!resolve_read(wres, solve, element))
+    } else return 0 ;
+    /***
+     *
+     *
+     *  need to be review for resolve Master file of trees
+     * the resolve_read_g will not work on this case
+     *
+     *
+     * */
+    if (!resolve_read_g(wres, base, name))
         goto err ;
 
     if (!resolve_get_field_tosa(sa, wres, field))
         goto err ;
 
-    {
-        char t[sa->len + 1] ;
-        auto_strings(t, sa->s) ;
-
-        sa->len = 0 ;
-
-        if (!sastr_clean_string(sa, t))
+    /**
+     * check if field isn't empty
+     * */
+    if (sa->len)
+        if (!sastr_clean_string_flush_sa(sa, sa->s))
             goto err ;
-    }
-    e = 1 ;
 
+    e = 1 ;
     err:
         resolve_free(wres) ;
         return e ;
diff --git a/src/lib66/resolve/resolve_init.c b/src/lib66/resolve/resolve_init.c
index cd1168a5..7b1e47ba 100644
--- a/src/lib66/resolve/resolve_init.c
+++ b/src/lib66/resolve/resolve_init.c
@@ -17,8 +17,8 @@
 #include <skalibs/stralloc.h>
 
 #include <66/resolve.h>
-#include <66/tree.h>
 #include <66/service.h>
+#include <66/tree.h>
 
 int resolve_init(resolve_wrapper_t *wres)
 {
diff --git a/src/lib66/resolve/resolve_modify_field.c b/src/lib66/resolve/resolve_modify_field.c
index 312cc750..101dbe50 100644
--- a/src/lib66/resolve/resolve_modify_field.c
+++ b/src/lib66/resolve/resolve_modify_field.c
@@ -13,66 +13,48 @@
  */
 
 #include <stdint.h>
-#include <stdlib.h>
 
 #include <oblibs/log.h>
 
 #include <66/resolve.h>
 #include <66/service.h>
 #include <66/tree.h>
-#include <66/graph.h>
 
 int resolve_modify_field(resolve_wrapper_t_ref wres, uint8_t field, char const *by)
 {
     log_flow() ;
 
-    int e = 0 ;
-
-    resolve_wrapper_t_ref mwres = 0 ;
-
     if (wres->type == DATA_SERVICE) {
 
         resolve_service_t_ref res = (resolve_service_t *)wres->obj  ;
-        mwres = resolve_set_struct(DATA_SERVICE, res) ;
 
         log_trace("modify field ", resolve_service_field_table[field].field," of service ", res->sa.s + res->name, " with value: ", by) ;
 
-        if (!service_resolve_modify_field(res, field, by))
-            goto err ;
+        return service_resolve_modify_field(res, field, by) ;
 
     } else if (wres->type == DATA_SERVICE_MASTER) {
 
         resolve_service_master_t_ref res = (resolve_service_master_t *)wres->obj  ;
-        mwres = resolve_set_struct(DATA_SERVICE_MASTER, res) ;
 
         log_trace("modify field ", resolve_service_master_field_table[field].field," of resolve Master file of services with value: ", by) ;
 
-        if (!service_resolve_master_modify_field(res, field, by))
-            goto err ;
+        return service_resolve_master_modify_field(res, field, by) ;
 
     } else if (wres->type == DATA_TREE) {
 
         resolve_tree_t_ref res = (resolve_tree_t *)wres->obj  ;
-        mwres = resolve_set_struct(DATA_TREE, res) ;
 
         log_trace("modify field ", resolve_tree_field_table[field].field," of tree ", res->sa.s + res->name, " with value: ", by) ;
 
-        if (!tree_resolve_modify_field(res, field, by))
-            goto err ;
+        return tree_resolve_modify_field(res, field, by) ;
 
     } else if (wres->type == DATA_TREE_MASTER) {
 
         resolve_tree_master_t_ref res = (resolve_tree_master_t *)wres->obj  ;
-        mwres = resolve_set_struct(DATA_TREE_MASTER, res) ;
 
         log_trace("modify field ", resolve_tree_master_field_table[field].field," of resolve Master file of trees with value: ", by) ;
 
-        if (!tree_resolve_master_modify_field(res, field, by))
-            goto err ;
-    }
+        return tree_resolve_master_modify_field(res, field, by) ;
 
-    e = 1 ;
-    err:
-        free(mwres) ;
-        return e ;
+    } else return 0 ;
 }
diff --git a/src/lib66/resolve/resolve_modify_field_g.c b/src/lib66/resolve/resolve_modify_field_g.c
index 2af339b3..e882bfdf 100644
--- a/src/lib66/resolve/resolve_modify_field_g.c
+++ b/src/lib66/resolve/resolve_modify_field_g.c
@@ -12,55 +12,24 @@
  * except according to the terms contained in the LICENSE file./
  */
 
-#include <string.h>
 #include <stdint.h>
 
 #include <oblibs/log.h>
-#include <oblibs/string.h>
 
 #include <66/resolve.h>
-#include <66/service.h>
-#include <66/tree.h>
-#include <66/constants.h>
-#include <66/graph.h>
 
-
-int resolve_modify_field_g(resolve_wrapper_t_ref wres, char const *base, char const *element, uint8_t field, char const *value)
+int resolve_modify_field_g(resolve_wrapper_t_ref wres, char const *base, char const *name, uint8_t field, char const *value)
 {
-
     log_flow() ;
 
-    size_t baselen = strlen(base), tot = baselen + SS_SYSTEM_LEN + 1, treelen = 0 ;
-    char *treename = 0 ;
-    /** The master is at the same as any service on that tree.
-     * Use the same wres type for service Master*/
-    if (wres->type == DATA_SERVICE) {
-        treename = ((resolve_service_t *)wres->obj)->sa.s + ((resolve_service_t *)wres->obj)->treename ;
-        treelen = strlen(treename) ;
-        tot += treelen + SS_SVDIRS_LEN + 1 ;
-
-    }
-
-    char solve[tot] ;
-
-    if (wres->type == DATA_SERVICE || wres->type == DATA_SERVICE_MASTER) {
-
-        auto_strings(solve, base, SS_SYSTEM, "/", treename, SS_SVDIRS) ;
-
-    } else if (wres->type == DATA_TREE || wres->type == DATA_TREE_MASTER) {
-
-        auto_strings(solve, base, SS_SYSTEM) ;
-    }
-
-    if (!resolve_read(wres, solve, element))
-        log_warnusys_return(LOG_EXIT_ZERO, "read resolve file of: ", solve, "/", element) ;
+    if (!resolve_read_g(wres, base, name))
+        return 0 ;
 
     if (!resolve_modify_field(wres, field, value))
-        log_warnusys_return(LOG_EXIT_ZERO, "modify resolve file of: ", solve, "/", element) ;
+        return 0 ;
 
-    if (!resolve_write(wres, solve, element))
-        log_warnusys_return(LOG_EXIT_ZERO, "write resolve file of :", solve, "/", element) ;
+    if (!resolve_write_g(wres, base, name))
+        return 0 ;
 
     return 1 ;
-
 }
diff --git a/src/lib66/resolve/resolve_read.c b/src/lib66/resolve/resolve_read.c
index 2b32fde4..9390e3f2 100644
--- a/src/lib66/resolve/resolve_read.c
+++ b/src/lib66/resolve/resolve_read.c
@@ -18,19 +18,17 @@
 #include <oblibs/string.h>
 
 #include <66/resolve.h>
+#include <66/constants.h>
 
-int resolve_read(resolve_wrapper_t *wres, char const *src, char const *name)
+int resolve_read(resolve_wrapper_t *wres, char const *base, char const *name)
 {
     log_flow() ;
 
-    size_t srclen = strlen(src) ;
+    size_t baselen = strlen(base) ;
     size_t namelen = strlen(name) ;
 
-    char tmp[srclen + SS_RESOLVE_LEN + 1 + namelen + 1] ;
-    auto_strings(tmp,src,SS_RESOLVE,"/",name) ;
+    char file[baselen + SS_RESOLVE_LEN + 1 + namelen + 1] ;
+    auto_strings(file, base, SS_RESOLVE, "/", name) ;
 
-    if (!resolve_read_cdb(wres,tmp))
-        return 0 ;
-
-    return 1 ;
+    return resolve_read_cdb(wres, file) ;
 }
diff --git a/src/lib66/resolve/resolve_read_cdb.c b/src/lib66/resolve/resolve_read_cdb.c
index 8b6a602d..43dde9d2 100644
--- a/src/lib66/resolve/resolve_read_cdb.c
+++ b/src/lib66/resolve/resolve_read_cdb.c
@@ -20,25 +20,24 @@
 #include <skalibs/djbunix.h>
 
 #include <66/resolve.h>
-#include <66/graph.h>
 #include <66/service.h>
 #include <66/tree.h>
 
-int resolve_read_cdb(resolve_wrapper_t *wres, char const *name)
+int resolve_read_cdb(resolve_wrapper_t *wres, char const *file)
 {
     log_flow() ;
 
     int fd, e = 0 ;
     cdb c = CDB_ZERO ;
 
-    fd = open_readb(name) ;
+    fd = open_readb(file) ;
     if (fd < 0) {
-        log_warnusys("open: ",name) ;
+        log_warnusys("open: ",file) ;
         goto err_fd ;
     }
 
     if (!cdb_init_fromfd(&c, fd)) {
-        log_warnusys("cdb_init: ", name) ;
+        log_warnusys("cdb_init: ", file) ;
         goto err ;
     }
 
diff --git a/src/lib66/resolve/resolve_read_g.c b/src/lib66/resolve/resolve_read_g.c
index 6cc93e13..aaff2e63 100644
--- a/src/lib66/resolve/resolve_read_g.c
+++ b/src/lib66/resolve/resolve_read_g.c
@@ -16,29 +16,31 @@
 
 #include <oblibs/log.h>
 #include <oblibs/string.h>
-#include <oblibs/types.h>
 
 #include <66/resolve.h>
+#include <66/constants.h>
 
-int resolve_read_g(resolve_wrapper_t *wres, char const *src, char const *name)
+int resolve_read_g(resolve_wrapper_t *wres, char const *base, char const *name)
 {
     log_flow() ;
 
-    size_t srclen = strlen(src) ;
+    if (!resolve_check_g(wres, base, name))
+        return 0 ;
+
+    size_t baselen = strlen(base) ;
     size_t namelen = strlen(name) ;
 
-    char tmp[srclen + SS_RESOLVE_LEN + 1 + namelen + 1] ;
-    auto_strings(tmp,src,SS_RESOLVE,"/",name) ;
+    char path[baselen + SS_SYSTEM_LEN + SS_RESOLVE_LEN + 1 + SS_SERVICE_LEN + 1 + namelen + 1] ;
 
-    int r = scan_mode(tmp,S_IFREG) ;
-    if (r < 0)
-        return -1 ;
+    if (wres->type == DATA_SERVICE || wres->type == DATA_SERVICE_MASTER) {
 
-    if (!r)
-        return 0 ;
+        auto_strings(path, base, SS_SYSTEM, SS_RESOLVE, "/", SS_SERVICE, "/", name) ;
+
+    } else if (wres->type == DATA_TREE || wres->type == DATA_TREE_MASTER) {
+
+        auto_strings(path, base, SS_SYSTEM) ;
 
-    if (!resolve_read_cdb(wres,tmp))
-        return -1 ;
+    } else return 0 ;
 
-    return 1 ;
+    return resolve_read(wres, path, name) ;
 }
diff --git a/src/lib66/resolve/resolve_rmfile.c b/src/lib66/resolve/resolve_remove.c
similarity index 60%
rename from src/lib66/resolve/resolve_rmfile.c
rename to src/lib66/resolve/resolve_remove.c
index 71cf85e3..0e37faa7 100644
--- a/src/lib66/resolve/resolve_rmfile.c
+++ b/src/lib66/resolve/resolve_remove.c
@@ -1,5 +1,5 @@
 /*
- * resolve_rmfile.c
+ * resolve_remove.c
  *
  * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org>
  *
@@ -13,23 +13,27 @@
  */
 
 #include <string.h>
+#include <unistd.h>
+#include <errno.h>
 
 #include <oblibs/log.h>
 #include <oblibs/string.h>
 
-#include <skalibs/posixplz.h>
-
 #include <66/resolve.h>
+#include <66/constants.h>
 
-void resolve_rmfile(char const *src,char const *name)
+void resolve_remove(char const *base, char const *name)
 {
     log_flow() ;
 
-    size_t srclen = strlen(src) ;
+    int e = errno ;
+    size_t baselen = strlen(base) ;
     size_t namelen = strlen(name) ;
 
-    char tmp[srclen + SS_RESOLVE_LEN + 1 + namelen +1] ;
-    auto_strings(tmp, src, SS_RESOLVE, "/", name) ;
+    char file[baselen + SS_RESOLVE_LEN + 1 + namelen +1] ;
+    auto_strings(file, base, SS_RESOLVE, "/", name) ;
 
-    unlink_void(tmp) ;
+    unlink(file) ;
+    errno = e ;
 }
+
diff --git a/src/lib66/resolve/resolve_remove_g.c b/src/lib66/resolve/resolve_remove_g.c
new file mode 100644
index 00000000..7bb4087a
--- /dev/null
+++ b/src/lib66/resolve/resolve_remove_g.c
@@ -0,0 +1,50 @@
+/*
+ * resolve_remove_g.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 <stdint.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include <oblibs/log.h>
+#include <oblibs/string.h>
+
+#include <66/resolve.h>
+#include <66/constants.h>
+
+void resolve_remove_g(char const *base, char const *name, uint8_t data_type)
+{
+    log_flow() ;
+
+    int e = errno ;
+    size_t baselen = strlen(base) ;
+    size_t namelen = strlen(name) ;
+    char path[baselen + SS_SYSTEM_LEN + SS_RESOLVE_LEN + 1 + SS_SERVICE_LEN + 1 + namelen + 1] ;
+
+    if (data_type == DATA_SERVICE || data_type == DATA_SERVICE_MASTER) {
+
+        auto_strings(path, base, SS_SYSTEM, SS_RESOLVE, "/", SS_SERVICE, "/", name) ;
+
+        resolve_remove(path, name) ;
+
+        unlink(path) ;
+        errno = e ;
+
+    } else if (data_type == DATA_TREE || data_type == DATA_TREE_MASTER) {
+
+        auto_strings(path, base, SS_SYSTEM) ;
+
+        resolve_remove(path, name) ;
+    }
+}
diff --git a/src/lib66/resolve/resolve_search.c b/src/lib66/resolve/resolve_search.c
deleted file mode 100644
index 8a43b4bc..00000000
--- a/src/lib66/resolve/resolve_search.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * resolve_search.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 <stdint.h>
-
-#include <oblibs/log.h>
-
-#include <skalibs/genalloc.h>
-
-#include <66/resolve.h>
-#include <66/service.h>
-#include <66/tree.h>
-#include <66/graph.h>
-
-int resolve_search(genalloc *ga, char const *name, uint8_t type)
-{
-    log_flow() ;
-
-    size_t len, pos = 0 ;
-
-    if (type == DATA_SERVICE) {
-
-        len = genalloc_len(resolve_service_t, ga) ;
-
-        for (;pos < len ; pos++) {
-
-            char *s = genalloc_s(resolve_service_t,ga)[pos].sa.s + genalloc_s(resolve_service_t,ga)[pos].name ;
-            if (!strcmp(name,s))
-                return pos ;
-        }
-
-    } else if (type == DATA_SERVICE_MASTER) {
-
-        len = genalloc_len(resolve_service_master_t, ga) ;
-
-        for (;pos < len ; pos++) {
-
-            char *s = genalloc_s(resolve_service_master_t,ga)[pos].sa.s + genalloc_s(resolve_service_master_t,ga)[pos].name ;
-            if (!strcmp(name,s))
-                return pos ;
-        }
-
-    } else if (type == DATA_TREE) {
-
-        len = genalloc_len(resolve_tree_t, ga) ;
-
-        for (;pos < len ; pos++) {
-
-            char *s = genalloc_s(resolve_tree_t,ga)[pos].sa.s + genalloc_s(resolve_tree_t,ga)[pos].name ;
-            if (!strcmp(name,s))
-                return pos ;
-        }
-
-    } else if (type == DATA_TREE_MASTER) {
-
-        len = genalloc_len(resolve_tree_master_t, ga) ;
-
-        for (;pos < len ; pos++) {
-
-            char *s = genalloc_s(resolve_tree_master_t,ga)[pos].sa.s + genalloc_s(resolve_tree_master_t,ga)[pos].name ;
-            if (!strcmp(name,s))
-                return pos ;
-        }
-    }
-
-    return -1 ;
-}
diff --git a/src/lib66/resolve/resolve_write.c b/src/lib66/resolve/resolve_write.c
index 830f09a9..6e36c908 100644
--- a/src/lib66/resolve/resolve_write.c
+++ b/src/lib66/resolve/resolve_write.c
@@ -18,19 +18,18 @@
 #include <oblibs/string.h>
 
 #include <66/resolve.h>
+#include <66/constants.h>
 
-int resolve_write(resolve_wrapper_t *wres, char const *dst, char const *name)
+int resolve_write(resolve_wrapper_t *wres, char const *base, char const *name)
 {
     log_flow() ;
 
-    size_t dstlen = strlen(dst) ;
+    size_t baselen = strlen(base) ;
     size_t namelen = strlen(name) ;
 
-    char tmp[dstlen + SS_RESOLVE_LEN + 1 + namelen + 1] ;
-    auto_strings(tmp,dst,SS_RESOLVE,"/") ;
+    char file[baselen + SS_RESOLVE_LEN + 1 + namelen + 1] ;
+    auto_strings(file, base, SS_RESOLVE, "/", name) ;
 
-    if (!resolve_write_cdb(wres,tmp,name))
-        return 0 ;
+    return resolve_write_cdb(wres, file) ;
 
-    return 1 ;
 }
diff --git a/src/lib66/resolve/resolve_write_cdb.c b/src/lib66/resolve/resolve_write_cdb.c
index 48935ccf..2f6d88d7 100644
--- a/src/lib66/resolve/resolve_write_cdb.c
+++ b/src/lib66/resolve/resolve_write_cdb.c
@@ -28,21 +28,17 @@
 #include <66/resolve.h>
 #include <66/service.h>
 #include <66/tree.h>
-#include <66/graph.h>
 
-int resolve_write_cdb(resolve_wrapper_t *wres, char const *dst, char const *name)
+int resolve_write_cdb(resolve_wrapper_t *wres, char const *file)
 {
     log_flow() ;
 
     int fd ;
-    size_t dstlen = strlen(dst), namelen = strlen(name);
+    size_t filelen = strlen(file);
     cdbmaker c = CDBMAKER_ZERO ;
-    char tfile[dstlen + 1 + namelen + namelen + 9] ;
-    char dfile[dstlen + 1 + namelen + 1] ;
+    char tfile[filelen + 9] ;
 
-    auto_strings(dfile,dst,"/",name) ;
-
-    auto_strings(tfile,dst,"/",name,":",name,":","XXXXXX") ;
+    auto_strings(tfile, file, ":", "XXXXXX") ;
 
     fd = mkstemp(tfile) ;
     if (fd < 0 || ndelay_off(fd)) {
@@ -84,8 +80,8 @@ int resolve_write_cdb(resolve_wrapper_t *wres, char const *dst, char const *name
 
     close(fd) ;
 
-    if (rename(tfile, dfile) < 0) {
-        log_warnusys("rename ", tfile, " to ", dfile) ;
+    if (rename(tfile, file) < 0) {
+        log_warnusys("rename ", tfile, " to ", file) ;
         goto err_fd ;
     }
 
diff --git a/src/lib66/resolve/resolve_write_g.c b/src/lib66/resolve/resolve_write_g.c
new file mode 100644
index 00000000..5d9d9e61
--- /dev/null
+++ b/src/lib66/resolve/resolve_write_g.c
@@ -0,0 +1,43 @@
+/*
+ * resolve_write_g.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/string.h>
+
+#include <66/resolve.h>
+#include <66/constants.h>
+
+int resolve_write_g(resolve_wrapper_t *wres, char const *base, char const *name)
+{
+    log_flow() ;
+
+    size_t baselen = strlen(base) ;
+    size_t namelen = strlen(name) ;
+
+    char path[baselen + SS_SYSTEM_LEN + SS_RESOLVE_LEN + 1 + SS_SERVICE_LEN + 1 + SS_SERVICE_LEN + 1 + namelen + 1] ;
+
+    if (wres->type == DATA_SERVICE || wres->type == DATA_SERVICE_MASTER) {
+
+        auto_strings(path, base, SS_SYSTEM, SS_RESOLVE, "/", SS_SERVICE, "/", name) ;
+
+    } else if (wres->type == DATA_TREE || wres->type == DATA_TREE_MASTER) {
+
+        auto_strings(path, base, SS_SYSTEM) ;
+
+    } else return 0 ;
+
+    return resolve_write(wres, path, name) ;
+}
-- 
GitLab