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