From d26256f4393566c5e65e56619c971bc0905415c1 Mon Sep 17 00:00:00 2001 From: obarun <eric@obarun.org> Date: Mon, 10 Jan 2022 19:02:15 +1100 Subject: [PATCH] add resolve_modify_field and resolve_modify_field_g function. Rename SERVICE_STRUCT and TREE_STRUCT to DATA_SERVICE and DATA_TREE respectively --- src/include/66/resolve.h | 10 ++-- src/lib66/resolve.c | 109 ++++++++++++++++++++++++++++++++++----- 2 files changed, 101 insertions(+), 18 deletions(-) diff --git a/src/include/66/resolve.h b/src/include/66/resolve.h index 0d542dce..c4ddcc8c 100644 --- a/src/include/66/resolve.h +++ b/src/include/66/resolve.h @@ -48,11 +48,12 @@ struct resolve_wrapper_s void *obj ; } ; +#ifndef RESOLVE_SET_SAWRES #define RESOLVE_SET_SAWRES(wres) \ stralloc_ref sawres = 0 ; \ - if (wres->type == SERVICE_STRUCT) sawres = (&((resolve_service_t *)wres->obj)->sa) ; \ - else if (wres->type == TREE_STRUCT) sawres = (&((resolve_tree_t *)wres->obj)->sa) ; - + if (wres->type == DATA_SERVICE) sawres = (&((resolve_service_t *)wres->obj)->sa) ; \ + else if (wres->type == DATA_TREE) sawres = (&((resolve_tree_t *)wres->obj)->sa) ; +#endif /** * * General API @@ -69,7 +70,8 @@ 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_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 diff --git a/src/lib66/resolve.c b/src/lib66/resolve.c index 177fdb28..214c2164 100644 --- a/src/lib66/resolve.c +++ b/src/lib66/resolve.c @@ -22,6 +22,7 @@ #include <oblibs/log.h> #include <oblibs/string.h> #include <oblibs/types.h> +#include <oblibs/sastr.h> #include <skalibs/stralloc.h> #include <skalibs/genalloc.h> @@ -34,6 +35,8 @@ #include <66/resolve.h> #include <66/service.h> #include <66/tree.h> +#include <66/constants.h> +#include <66/graph.h> /** * @@ -52,6 +55,7 @@ resolve_wrapper_t *resolve_set_struct(uint8_t type, void *s) return wres ; } ; + int resolve_init(resolve_wrapper_t *wres) { log_flow() ; @@ -119,7 +123,7 @@ int resolve_append(genalloc *ga, resolve_wrapper_t *wres) int e = 0 ; - if (wres->type == SERVICE_STRUCT) { + if (wres->type == DATA_SERVICE) { resolve_service_t cp = RESOLVE_SERVICE_ZERO ; if (!service_resolve_copy(&cp, ((resolve_service_t *)wres->obj))) @@ -128,7 +132,7 @@ int resolve_append(genalloc *ga, resolve_wrapper_t *wres) if (!genalloc_append(resolve_service_t, ga, &cp)) goto err ; - } else if (wres->type == TREE_STRUCT) { + } else if (wres->type == DATA_TREE) { resolve_tree_t cp = RESOLVE_TREE_ZERO ; if (!tree_resolve_copy(&cp, ((resolve_tree_t *)wres->obj))) @@ -150,7 +154,7 @@ int resolve_search(genalloc *ga, char const *name, uint8_t type) size_t len, pos = 0 ; - if (type == SERVICE_STRUCT) { + if (type == DATA_SERVICE) { len = genalloc_len(resolve_service_t, ga) ; @@ -161,7 +165,7 @@ int resolve_search(genalloc *ga, char const *name, uint8_t type) return pos ; } - } else if (type == TREE_STRUCT) { + } else if (type == DATA_TREE) { len = genalloc_len(resolve_tree_t, ga) ; @@ -182,7 +186,7 @@ int resolve_cmp(genalloc *ga, char const *name, uint8_t type) size_t len, pos = 0 ; - if (type == SERVICE_STRUCT) { + if (type == DATA_SERVICE) { len = genalloc_len(resolve_service_t, ga) ; @@ -194,7 +198,7 @@ int resolve_cmp(genalloc *ga, char const *name, uint8_t type) return 1 ; } - } else if (type == TREE_STRUCT) { + } else if (type == DATA_TREE) { len = genalloc_len(resolve_tree_t, ga) ; @@ -247,6 +251,84 @@ ssize_t resolve_add_string(resolve_wrapper_t *wres, char const *data) return baselen ; } +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 ; + + } 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 ; + + } + e = 1 ; + err: + free(mwres) ; + return e ; +} + +int resolve_modify_field_g(resolve_wrapper_t_ref wres, char const *base, char const *element, uint8_t field, char const *value) +{ + + log_flow() ; + + size_t baselen = strlen(base), tot = 0, treelen = 0 ; + char *treename = 0 ; + + if (wres->type == DATA_SERVICE) { + + treelen = strlen(((resolve_service_t *)wres->obj)->sa.s + ((resolve_service_t *)wres->obj)->treename) ; + tot = baselen + SS_SYSTEM_LEN + 1 + treelen + SS_SVDIRS_LEN + 1 ; + + } else { + + tot = baselen + SS_SYSTEM_LEN + 1 ; + } + + char solve[tot] ; + + if (wres->type == DATA_SERVICE) { + + treename = ((resolve_service_t *)wres->obj)->sa.s + ((resolve_service_t *)wres->obj)->treename ; + auto_strings(solve, base, SS_SYSTEM, "/", treename, SS_SVDIRS) ; + + } else { + + 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_modify_field(wres, field, value)) + log_warnusys_return(LOG_EXIT_ZERO, "modify resolve file of: ", solve, "/", element) ; + + if (!resolve_write(wres, solve, element)) + log_warnusys_return(LOG_EXIT_ZERO, "write resolve file of :", solve, "/", element) ; + + return 1 ; + +} + /** * * FREED @@ -270,14 +352,14 @@ void resolve_deep_free(uint8_t type, genalloc *g) size_t pos = 0 ; - if (type == SERVICE_STRUCT) { + 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 == TREE_STRUCT) { + } else if (type == DATA_TREE) { for (; pos < genalloc_len(resolve_tree_t, g) ; pos++) stralloc_free(&genalloc_s(resolve_tree_t, g)[pos].sa) ; @@ -311,12 +393,12 @@ int resolve_read_cdb(resolve_wrapper_t *wres, char const *name) goto err ; } - if (wres->type == SERVICE_STRUCT) { + if (wres->type == DATA_SERVICE) { if (!service_read_cdb(&c, ((resolve_service_t *)wres->obj))) goto err ; - } else if (wres->type == TREE_STRUCT){ + } else if (wres->type == DATA_TREE){ if (!tree_read_cdb(&c, ((resolve_tree_t *)wres->obj))) goto err ; @@ -357,12 +439,12 @@ int resolve_write_cdb(resolve_wrapper_t *wres, char const *dst, char const *name goto err ; } - if (wres->type == SERVICE_STRUCT) { + if (wres->type == DATA_SERVICE) { if (!service_write_cdb(&c, ((resolve_service_t *)wres->obj))) goto err ; - } else if (wres->type == TREE_STRUCT) { + } else if (wres->type == DATA_TREE) { if (!tree_write_cdb(&c, ((resolve_tree_t *)wres->obj))) goto err ; @@ -432,7 +514,7 @@ int resolve_find_cdb(stralloc *result, cdb const *c, char const *key) log_warnusys_return(LOG_EXIT_LESSONE,"search on cdb key: ",key) ; if (!r) - log_warnusys_return(LOG_EXIT_ZERO,"unknown cdb key: ",key) ; + log_warn_return(LOG_EXIT_ZERO,"unknown cdb key: ",key) ; char pack[cdata.len + 1] ; memcpy(pack,cdata.s, cdata.len) ; @@ -446,4 +528,3 @@ int resolve_find_cdb(stralloc *result, cdb const *c, char const *key) return x ; } - -- GitLab