diff --git a/src/include/66/resolve.h b/src/include/66/resolve.h index cfab72ea0fec25606a7e803cb22e02cdda8e0d79..894aaa4bb96401f5312b7325b0519d8b582182e3 100644 --- a/src/include/66/resolve.h +++ b/src/include/66/resolve.h @@ -46,6 +46,7 @@ struct resolve_wrapper_s #define RESOLVE_SET_SAWRES(wres) \ stralloc_ref sawres = 0 ; \ if (wres->type == DATA_SERVICE) sawres = (&((resolve_service_t *)wres->obj)->sa) ; \ + else if (wres->type == DATA_SERVICE_MASTER) sawres = (&((resolve_service_master_t *)wres->obj)->sa) ; \ else if (wres->type == DATA_TREE) sawres = (&((resolve_tree_t *)wres->obj)->sa) ; \ else if (wres->type == DATA_TREE_MASTER) sawres = (&((resolve_tree_master_t *)wres->obj)->sa) ; #endif @@ -74,6 +75,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_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) ; /** diff --git a/src/include/66/service.h b/src/include/66/service.h index bf495bf3f3a75e5468b226d405ee15d9aa47227c..116cb80af132b90673500e4d400aee791d6d5310 100644 --- a/src/include/66/service.h +++ b/src/include/66/service.h @@ -26,6 +26,14 @@ #include <66/ssexec.h> #include <66/resolve.h> +/** + * + * + * obsolete functions + * + * + * + * */ /** Graph struct */ typedef struct ss_resolve_graph_ndeps_s ss_resolve_graph_ndeps_t ; @@ -53,6 +61,9 @@ enum visit_e SS_BLACK } ; +#define DATA_SERVICE 0 +#define DATA_SERVICE_MASTER 3 + typedef struct resolve_service_s resolve_service_t, *resolve_service_t_ref ; struct resolve_service_s { @@ -135,7 +146,48 @@ enum resolve_service_enum_e SERVICE_ENUM_ENDOFKEY } ; +typedef struct resolve_service_master_s resolve_service_master_t, *resolve_service_master_t_ref ; +struct resolve_service_master_s +{ + uint32_t salen ; + stralloc sa ; + + uint32_t name ; + + uint32_t classic ; + uint32_t bundle ; + uint32_t longrun ; + uint32_t oneshot ; + uint32_t module ; + + uint32_t nclassic ; + uint32_t nbundle ; + uint32_t nlongrun ; + uint32_t noneshot ; + uint32_t nmodule ; + +} ; +#define RESOLVE_SERVICE_MASTER_ZERO { 0,STRALLOC_ZERO,0,0,0,0,0,0,0,0,0,0,0 } + +typedef enum resolve_service_master_enum_e resolve_service_master_enum_t, *resolve_service_master_enum_t_ref; +enum resolve_service_master_enum_e +{ + SERVICE_ENUM_MASTER_NAME = 0, + SERVICE_ENUM_MASTER_CLASSIC, + SERVICE_ENUM_MASTER_BUNDLE, + SERVICE_ENUM_MASTER_LONGRUN, + SERVICE_ENUM_MASTER_ONESHOT, + SERVICE_ENUM_MASTER_MODULE, + SERVICE_ENUM_MASTER_NCLASSIC, + SERVICE_ENUM_MASTER_NBUNDLE, + SERVICE_ENUM_MASTER_NLONGRUN, + SERVICE_ENUM_MASTER_NONESHOT, + SERVICE_ENUM_MASTER_NMODULE, + SERVICE_ENUM_MASTER_ENDOFKEY +} ; + extern resolve_field_table_t resolve_service_field_table[] ; +extern resolve_field_table_t resolve_service_master_field_table[] ; extern int service_isenabled(char const *sv) ; extern int service_isenabledat(stralloc *tree, char const *sv) ; @@ -151,22 +203,32 @@ extern int service_intree(stralloc *svtree, char const *svname, char const *tree * * */ -extern int service_read_cdb(cdb *c, resolve_service_t *res) ; -extern int service_write_cdb(cdbmaker *c, resolve_service_t *sres) ; +/** Service */ extern int service_resolve_copy(resolve_service_t *dst, resolve_service_t *res) ; -extern int service_resolve_sort_bytype(stralloc *list, char const *src) ; -extern int service_resolve_setnwrite(sv_alltype *services, ssexec_t *info, char const *dst) ; +extern int service_resolve_get_field_tosa(stralloc *sa, resolve_service_t *res, resolve_service_enum_t field) ; +extern int service_resolve_modify_field(resolve_service_t *res, resolve_service_enum_t field, char const *data) ; +extern int service_resolve_read_cdb(cdb *c, resolve_service_t *res) ; extern int service_resolve_setlognwrite(resolve_service_t *sv, char const *dst) ; +extern int service_resolve_setnwrite(sv_alltype *services, ssexec_t *info, char const *dst) ; +extern int service_resolve_sort_bytype(stralloc *list, char const *src) ; +extern int service_resolve_write_cdb(cdbmaker *c, resolve_service_t *sres) ; + +/** Master */ +extern int service_resolve_master_copy(resolve_service_master_t *dst, resolve_service_master_t *mres) ; extern int service_resolve_master_create(char const *base, char const *treename) ; -extern int service_resolve_master_write(ssexec_t *info, ss_resolve_graph_t *graph, char const *dir, unsigned int reverse) ; -extern int service_resolve_modify_field(resolve_service_t *res, resolve_service_enum_t field, char const *data) ; -extern int service_resolve_field_tosa(stralloc *sa, resolve_service_t *res, resolve_service_enum_t field) ; +extern int service_resolve_master_get_field_tosa(stralloc *sa, resolve_service_master_t *mres, resolve_service_master_enum_t field) ; +extern int service_resolve_master_modify_field(resolve_service_master_t *mres, uint8_t field, char const *data) ; +extern int service_resolve_master_read_cdb(cdb *c, resolve_service_master_t *tres) ; +extern int service_resolve_master_write(graph_t *graph, char const *dest) ; +extern int service_resolve_master_write_cdb(cdbmaker *c, resolve_service_master_t *mres) ; + /** * - * obsolete function * + * obsolete function * * */ + extern int service_resolve_add_deps(genalloc *tokeep, resolve_service_t *res, char const *src) ; extern int service_resolve_add_rdeps(genalloc *tokeep, resolve_service_t *res, char const *src) ; extern int service_resolve_add_logger(genalloc *ga,char const *src) ; diff --git a/src/lib66/resolve/deps-lib/deps b/src/lib66/resolve/deps-lib/deps index d4474c594f6deb3803ce31c9cb7cf64820e93707..7ae6192b218df693e43cb537a1aa626cb6feef13 100644 --- a/src/lib66/resolve/deps-lib/deps +++ b/src/lib66/resolve/deps-lib/deps @@ -7,11 +7,14 @@ resolve_cmp.o resolve_deep_free.o resolve_find_cdb.o resolve_free.o +resolve_get_field_tosa.o +resolve_get_field_tosa_g.o resolve_init.o resolve_modify_field.o resolve_modify_field_g.o resolve_read.o resolve_read_cdb.o +resolve_read_g.o resolve_rmfile.o resolve_search.o resolve_set_struct.o diff --git a/src/lib66/resolve/resolve_append.c b/src/lib66/resolve/resolve_append.c index 15dd80ab5a6c479989043802129b9d44a7970a7e..083af9fe32a09bb59bc266e77e795a010c32f463 100644 --- a/src/lib66/resolve/resolve_append.c +++ b/src/lib66/resolve/resolve_append.c @@ -36,6 +36,15 @@ int resolve_append(genalloc *ga, resolve_wrapper_t *wres) 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 ; diff --git a/src/lib66/resolve/resolve_cmp.c b/src/lib66/resolve/resolve_cmp.c index f175563a51a237130abecae201c16a7c1d29183f..8ddee7918525fe7b20e843e965835b08d9f93f24 100644 --- a/src/lib66/resolve/resolve_cmp.c +++ b/src/lib66/resolve/resolve_cmp.c @@ -42,6 +42,18 @@ int resolve_cmp(genalloc *ga, char const *name, uint8_t type) 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) ; @@ -53,6 +65,18 @@ int resolve_cmp(genalloc *ga, char const *name, uint8_t type) 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 index cdab670c8a8e16ec15bce3e4f9d15be2305126a9..e6446e01ec32908d4704c99080abceb4b993a236 100644 --- a/src/lib66/resolve/resolve_deep_free.c +++ b/src/lib66/resolve/resolve_deep_free.c @@ -38,6 +38,13 @@ void resolve_deep_free(uint8_t type, genalloc *g) 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++) diff --git a/src/lib66/resolve/resolve_get_field_tosa.c b/src/lib66/resolve/resolve_get_field_tosa.c new file mode 100644 index 0000000000000000000000000000000000000000..eae251164c5c0768e1fbe66318738d901f8a8c24 --- /dev/null +++ b/src/lib66/resolve/resolve_get_field_tosa.c @@ -0,0 +1,73 @@ +/* + * resolve_get_field_tosa.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 <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> + +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 ; + + } 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 ; + + } 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 ; + + } 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 ; + +} diff --git a/src/lib66/resolve/resolve_get_field_tosa_g.c b/src/lib66/resolve/resolve_get_field_tosa_g.c new file mode 100644 index 0000000000000000000000000000000000000000..f2c6aa02cc4fd534f710490084556decfa3278e9 --- /dev/null +++ b/src/lib66/resolve/resolve_get_field_tosa_g.c @@ -0,0 +1,96 @@ +/* + * resolve_get_field_tosa_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 <oblibs/log.h> +#include <oblibs/string.h> +#include <oblibs/sastr.h> + +#include <skalibs/stralloc.h> + +#include <66/constants.h> +#include <66/tree.h> +#include <66/service.h> +#include <66/resolve.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) +{ + log_flow() ; + 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) ; + + } else if (data_type == DATA_SERVICE_MASTER) { + + wres = resolve_set_struct(data_type, &mres) ; + } + + auto_strings(solve, base, SS_SYSTEM, "/", treename, SS_SVDIRS) ; + + } else if (data_type == DATA_TREE || data_type == DATA_TREE_MASTER) { + + if (data_type == DATA_TREE) { + + 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)) + 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)) + goto err ; + } + e = 1 ; + + err: + resolve_free(wres) ; + return e ; +} diff --git a/src/lib66/resolve/resolve_modify_field.c b/src/lib66/resolve/resolve_modify_field.c index b40c5c1750bab4f2b7e50d4129463ba251818bcb..312cc750aecc62212d3639ce0c4d64f34112675e 100644 --- a/src/lib66/resolve/resolve_modify_field.c +++ b/src/lib66/resolve/resolve_modify_field.c @@ -40,6 +40,16 @@ int resolve_modify_field(resolve_wrapper_t_ref wres, uint8_t field, char const * if (!service_resolve_modify_field(res, field, by)) goto err ; + } 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 ; + } else if (wres->type == DATA_TREE) { resolve_tree_t_ref res = (resolve_tree_t *)wres->obj ; @@ -55,7 +65,7 @@ int resolve_modify_field(resolve_wrapper_t_ref wres, uint8_t field, char const * 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 inner resolve file of trees with value: ", by) ; + 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 ; diff --git a/src/lib66/resolve/resolve_modify_field_g.c b/src/lib66/resolve/resolve_modify_field_g.c index 7f06301cf1bfa330f327090380a90a83c7302541..2af339b3e268b860c7fa91778dabfba17677974d 100644 --- a/src/lib66/resolve/resolve_modify_field_g.c +++ b/src/lib66/resolve/resolve_modify_field_g.c @@ -32,7 +32,8 @@ int resolve_modify_field_g(resolve_wrapper_t_ref wres, char const *base, char co 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) ; @@ -42,7 +43,7 @@ int resolve_modify_field_g(resolve_wrapper_t_ref wres, char const *base, char co char solve[tot] ; - if (wres->type == DATA_SERVICE) { + if (wres->type == DATA_SERVICE || wres->type == DATA_SERVICE_MASTER) { auto_strings(solve, base, SS_SYSTEM, "/", treename, SS_SVDIRS) ; diff --git a/src/lib66/resolve/resolve_read_cdb.c b/src/lib66/resolve/resolve_read_cdb.c index 16f71de376332b9fd414c72cac9efabc624270b1..8b6a602d5fa55e9cd24de780bae2f0c1d46bc7f6 100644 --- a/src/lib66/resolve/resolve_read_cdb.c +++ b/src/lib66/resolve/resolve_read_cdb.c @@ -44,7 +44,12 @@ int resolve_read_cdb(resolve_wrapper_t *wres, char const *name) if (wres->type == DATA_SERVICE) { - if (!service_read_cdb(&c, ((resolve_service_t *)wres->obj))) + if (!service_resolve_read_cdb(&c, ((resolve_service_t *)wres->obj))) + goto err ; + + } else if (wres->type == DATA_SERVICE_MASTER) { + + if (!service_resolve_master_read_cdb(&c, ((resolve_service_master_t *)wres->obj))) goto err ; } else if (wres->type == DATA_TREE){ @@ -54,7 +59,7 @@ int resolve_read_cdb(resolve_wrapper_t *wres, char const *name) } else if (wres->type == DATA_TREE_MASTER) { - if (!tree_resolve_read_master_cdb(&c, ((resolve_tree_master_t *)wres->obj))) + if (!tree_resolve_master_read_cdb(&c, ((resolve_tree_master_t *)wres->obj))) goto err ; } diff --git a/src/lib66/resolve/resolve_search.c b/src/lib66/resolve/resolve_search.c index 912ca31ec7f4bacf72ebf0c66f6bf5d9c77634b4..8a43b4bca01e805c5b49c9b7e015e0aceb3c2d8c 100644 --- a/src/lib66/resolve/resolve_search.c +++ b/src/lib66/resolve/resolve_search.c @@ -41,6 +41,17 @@ int resolve_search(genalloc *ga, char const *name, uint8_t type) 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) ; diff --git a/src/lib66/resolve/resolve_write_cdb.c b/src/lib66/resolve/resolve_write_cdb.c index 562558a3468bb35a5bf940c5765013082c878846..48935ccf1dd0f9648614177e81846521d38d9e61 100644 --- a/src/lib66/resolve/resolve_write_cdb.c +++ b/src/lib66/resolve/resolve_write_cdb.c @@ -57,7 +57,12 @@ int resolve_write_cdb(resolve_wrapper_t *wres, char const *dst, char const *name if (wres->type == DATA_SERVICE) { - if (!service_write_cdb(&c, ((resolve_service_t *)wres->obj))) + if (!service_resolve_write_cdb(&c, ((resolve_service_t *)wres->obj))) + goto err ; + + } else if (wres->type == DATA_SERVICE_MASTER) { + + if (!service_resolve_master_write_cdb(&c, ((resolve_service_master_t *)wres->obj))) goto err ; } else if (wres->type == DATA_TREE) { @@ -67,7 +72,7 @@ int resolve_write_cdb(resolve_wrapper_t *wres, char const *dst, char const *name } else if (wres->type == DATA_TREE_MASTER) { - if (!tree_resolve_write_master_cdb(&c, ((resolve_tree_master_t *)wres->obj))) + if (!tree_resolve_master_write_cdb(&c, ((resolve_tree_master_t *)wres->obj))) goto err ; } diff --git a/src/lib66/service/deps-lib/deps b/src/lib66/service/deps-lib/deps index 03c49606505f02aab33c68eaaf4ef384578cd44b..8b763257ca840d9b8cabe1cbea9dee8095401f94 100644 --- a/src/lib66/service/deps-lib/deps +++ b/src/lib66/service/deps-lib/deps @@ -1,21 +1,26 @@ -resolve_frontend_path.o service.o service_cmp_basedir.o service_endof_dir.o +service_frontend_path.o service_frontend_src.o service_intree.o service_isenabled.o service_isenabledat.o -service_read_cdb.o service_resolve_copy.o -service_resolve_field_to_sa.o +service_resolve_get_field_tosa.o +service_resolve_master_copy.o service_resolve_master_create.o +service_resolve_master_get_field_tosa.o +service_resolve_master_modify_field.o +service_resolve_master_read_cdb.o service_resolve_master_write.o +service_resolve_master_write_cdb.o service_resolve_modify_field.o +service_resolve_read_cdb.o service_resolve_setlognwrite.o service_resolve_setnwrite.o service_resolve_sort_bytype.o -service_write_cdb.o +service_resolve_write_cdb.o -ls6rc -ls6 -loblibs diff --git a/src/lib66/service/service_resolve_master_copy.c b/src/lib66/service/service_resolve_master_copy.c new file mode 100644 index 0000000000000000000000000000000000000000..b305ce82667209c3df7c2e92a8d9f19859840e89 --- /dev/null +++ b/src/lib66/service/service_resolve_master_copy.c @@ -0,0 +1,51 @@ +/* + * service_resolve_master_copy.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 <stddef.h> + +#include <oblibs/log.h> + +#include <skalibs/stralloc.h> + +#include <66/service.h> + +int service_resolve_master_copy(resolve_service_master_t *dst, resolve_service_master_t *mres) +{ + log_flow() ; + + stralloc_free(&dst->sa) ; + + size_t len = mres->sa.len - 1 ; + dst->salen = mres->salen ; + + if (!stralloc_catb(&dst->sa,mres->sa.s,len) || + !stralloc_0(&dst->sa)) + return 0 ; + + dst->name = mres->name ; + dst->classic = mres->classic ; + dst->bundle = mres->bundle ; + dst->longrun = mres->longrun ; + dst->oneshot = mres->oneshot ; + dst->module = mres->module ; + + dst->nclassic = mres->nclassic ; + dst->nbundle = mres->nbundle ; + dst->nlongrun = mres->nlongrun ; + dst->noneshot = mres->noneshot ; + dst->nmodule = mres->nmodule ; + + return 1 ; + +} diff --git a/src/lib66/service/service_resolve_master_create.c b/src/lib66/service/service_resolve_master_create.c index 10726504a10e4073bc28189737d3e4d9e2cefd23..a17eb177b4c3c51612629e0866f7f2484e3ffa8a 100644 --- a/src/lib66/service/service_resolve_master_create.c +++ b/src/lib66/service/service_resolve_master_create.c @@ -1,5 +1,5 @@ /* - * service.c + * service_resolve_master_create.c * * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org> * @@ -18,34 +18,27 @@ #include <oblibs/string.h> #include <66/constants.h> -#include <66/enum.h> #include <66/resolve.h> #include <66/service.h> int service_resolve_master_create(char const *base, char const *treename) { + log_flow() ; int e = 0 ; size_t baselen = strlen(base), treelen = strlen(treename) ; - resolve_service_t res = RESOLVE_SERVICE_ZERO ; - resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ; + resolve_service_master_t mres = RESOLVE_SERVICE_MASTER_ZERO ; + resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE_MASTER, &mres) ; char dst[baselen + SS_SYSTEM_LEN + 1 + treelen + SS_SVDIRS_LEN + 1] ; - auto_strings(dst, base, SS_SYSTEM, "/", treename) ; - resolve_init(wres) ; - res.name = resolve_add_string(wres, SS_MASTER + 1) ; - res.description = resolve_add_string(wres, "inner bundle - do not use it") ; - res.tree = resolve_add_string(wres, dst) ; - res.treename = resolve_add_string(wres, treename) ; - res.type = TYPE_BUNDLE ; - res.disen = 1 ; + mres.name = resolve_add_string(wres, SS_MASTER + 1) ; - auto_strings(dst + baselen + SS_SYSTEM_LEN + 1 + treelen, SS_SVDIRS) ; + auto_strings(dst, base, SS_SYSTEM, "/", treename, SS_SVDIRS) ; - log_trace("write resolve file of inner bundle") ; + log_trace("write Master resolve file of services") ; if (!resolve_write(wres, dst, SS_MASTER + 1)) goto err ; diff --git a/src/lib66/service/service_resolve_master_get_field_tosa.c b/src/lib66/service/service_resolve_master_get_field_tosa.c new file mode 100644 index 0000000000000000000000000000000000000000..0c1f30936e5102af51f58e133e60e2d3deac0672 --- /dev/null +++ b/src/lib66/service/service_resolve_master_get_field_tosa.c @@ -0,0 +1,89 @@ +/* + * service_resolve_master_get_field_tosa.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>//UINT_FMT + +#include <66/service.h> + +int service_resolve_master_get_field_tosa(stralloc *sa, resolve_service_master_t *mres, resolve_service_master_enum_t field) +{ + log_flow() ; + + char fmt[UINT32_FMT] ; + char const *str = 0 ; + + switch(field) { + + case SERVICE_ENUM_MASTER_NAME: + str = mres->sa.s + mres->name ; + break ; + + case SERVICE_ENUM_MASTER_CLASSIC: + str = mres->sa.s + mres->classic ; + break ; + + case SERVICE_ENUM_MASTER_LONGRUN: + str = mres->sa.s + mres->longrun ; + break ; + + case SERVICE_ENUM_MASTER_BUNDLE: + str = mres->sa.s + mres->bundle ; + break ; + + case SERVICE_ENUM_MASTER_ONESHOT: + str = mres->sa.s + mres->oneshot ; + break ; + + case SERVICE_ENUM_MASTER_MODULE: + str = mres->sa.s + mres->module ; + break ; + + case SERVICE_ENUM_MASTER_NCLASSIC: + fmt[uint32_fmt(fmt,mres->nclassic)] = 0 ; + str = fmt ; + break ; + + case SERVICE_ENUM_MASTER_NBUNDLE: + fmt[uint32_fmt(fmt,mres->nbundle)] = 0 ; + str = fmt ; + break ; + + case SERVICE_ENUM_MASTER_NLONGRUN: + fmt[uint32_fmt(fmt,mres->nlongrun)] = 0 ; + str = fmt ; + break ; + + case SERVICE_ENUM_MASTER_NONESHOT: + fmt[uint32_fmt(fmt,mres->noneshot)] = 0 ; + str = fmt ; + break ; + + case SERVICE_ENUM_MASTER_NMODULE: + fmt[uint32_fmt(fmt,mres->nmodule)] = 0 ; + str = fmt ; + break ; + + default: + return 0 ; + } + + if (!auto_stra(sa,str)) + return 0 ; + + return 1 ; +} diff --git a/src/lib66/service/service_resolve_master_modify_field.c b/src/lib66/service/service_resolve_master_modify_field.c new file mode 100644 index 0000000000000000000000000000000000000000..591c40bf63c168b1572657702cdf72d7346739f7 --- /dev/null +++ b/src/lib66/service/service_resolve_master_modify_field.c @@ -0,0 +1,114 @@ +/* + * service_resolve_master_modify_field.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 <stdlib.h> + +#include <oblibs/log.h> + +#include <skalibs/types.h> + +#include <66/tree.h> +#include <66/resolve.h> + +#include <66/service.h> + +resolve_field_table_t resolve_service_master_field_table[] = { + + [SERVICE_ENUM_MASTER_NAME] = { .field = "name" }, + [SERVICE_ENUM_MASTER_CLASSIC] = { .field = "classic" }, + [SERVICE_ENUM_MASTER_BUNDLE] = { .field = "bundle" }, + [SERVICE_ENUM_MASTER_LONGRUN] = { .field = "longrun" }, + [SERVICE_ENUM_MASTER_ONESHOT] = { .field = "oneshot" }, + [SERVICE_ENUM_MASTER_MODULE] = { .field = "module" }, + + [SERVICE_ENUM_MASTER_NCLASSIC] = { .field = "nclassic" }, + [SERVICE_ENUM_MASTER_NBUNDLE] = { .field = "nbundle" }, + [SERVICE_ENUM_MASTER_NLONGRUN] = { .field = "nlongrun" }, + [SERVICE_ENUM_MASTER_NONESHOT] = { .field = "noneshot" }, + [SERVICE_ENUM_MASTER_NMODULE] = { .field = "nmodule" }, + [SERVICE_ENUM_MASTER_ENDOFKEY] = { .field = 0 }, +} ; + +int service_resolve_master_modify_field(resolve_service_master_t *mres, uint8_t field, char const *data) +{ + log_flow() ; + + uint32_t ifield ; + int e = 0 ; + + resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE_MASTER, mres) ; + + switch(field) { + + case SERVICE_ENUM_MASTER_NAME: + mres->name = resolve_add_string(wres,data) ; + break ; + + case SERVICE_ENUM_MASTER_CLASSIC: + mres->classic = resolve_add_string(wres,data) ; + break ; + + case SERVICE_ENUM_MASTER_BUNDLE: + mres->bundle = resolve_add_string(wres,data) ; + break ; + + case SERVICE_ENUM_MASTER_LONGRUN: + mres->longrun = resolve_add_string(wres,data) ; + break ; + + case SERVICE_ENUM_MASTER_ONESHOT: + mres->oneshot = resolve_add_string(wres,data) ; + break ; + + case SERVICE_ENUM_MASTER_MODULE: + mres->module = resolve_add_string(wres,data) ; + break ; + + case SERVICE_ENUM_MASTER_NCLASSIC: + if (!uint0_scan(data, &ifield)) goto err ; + mres->nclassic= ifield ; + break ; + + case SERVICE_ENUM_MASTER_NBUNDLE: + if (!uint0_scan(data, &ifield)) goto err ; + mres->nbundle = ifield ; + break ; + + case SERVICE_ENUM_MASTER_NLONGRUN: + if (!uint0_scan(data, &ifield)) goto err ; + mres->nlongrun = ifield ; + break ; + + case SERVICE_ENUM_MASTER_NONESHOT: + if (!uint0_scan(data, &ifield)) goto err ; + mres->noneshot = ifield ; + break ; + + case SERVICE_ENUM_MASTER_NMODULE: + if (!uint0_scan(data, &ifield)) goto err ; + mres->nmodule = ifield ; + break ; + + default: + break ; + } + + e = 1 ; + + err: + free(wres) ; + return e ; + +} diff --git a/src/lib66/service/service_resolve_master_read_cdb.c b/src/lib66/service/service_resolve_master_read_cdb.c new file mode 100644 index 0000000000000000000000000000000000000000..0e86fa91775f3810b4165a834fd102cc7168442d --- /dev/null +++ b/src/lib66/service/service_resolve_master_read_cdb.c @@ -0,0 +1,86 @@ +/* + * service_resolve_master_read_cdb.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 <stdlib.h>//free + +#include <oblibs/log.h> + +#include <skalibs/stralloc.h> +#include <skalibs/cdb.h> + +#include <66/resolve.h> +#include <66/service.h> + +int service_resolve_master_read_cdb(cdb *c, resolve_service_master_t *tres) +{ + log_flow() ; + + stralloc tmp = STRALLOC_ZERO ; + resolve_wrapper_t_ref wres ; + uint32_t x ; + + wres = resolve_set_struct(DATA_SERVICE_MASTER, tres) ; + + resolve_init(wres) ; + + /* name */ + resolve_find_cdb(&tmp,c,"name") ; + tres->name = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ; + + /* classic */ + resolve_find_cdb(&tmp,c,"classic") ; + tres->classic = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ; + + /* bundle */ + resolve_find_cdb(&tmp,c,"bundle") ; + tres->bundle = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ; + + /* longrun */ + resolve_find_cdb(&tmp,c,"longrun") ; + tres->longrun = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ; + + /* oneshot */ + resolve_find_cdb(&tmp,c,"oneshot") ; + tres->oneshot = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ; + + /* modules */ + resolve_find_cdb(&tmp,c,"module") ; + tres->module = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ; + + /* nclassic */ + x = resolve_find_cdb(&tmp,c,"nclassic") ; + tres->nclassic = x ; + + /* nbundle */ + x = resolve_find_cdb(&tmp,c,"nbundle") ; + tres->nbundle = x ; + + /* nlongrun */ + x = resolve_find_cdb(&tmp,c,"nlongrun") ; + tres->nlongrun = x ; + + /* noneshot */ + x = resolve_find_cdb(&tmp,c,"noneshot") ; + tres->noneshot = x ; + + /* nmodule */ + x = resolve_find_cdb(&tmp,c,"nmodule") ; + tres->nmodule = x ; + + free(wres) ; + stralloc_free(&tmp) ; + + return 1 ; +} diff --git a/src/lib66/service/service_resolve_master_write.c b/src/lib66/service/service_resolve_master_write.c index c89cc8bd41da421a1de9592874486d0f08f719a4..1addc66506b7ad90b8067cf2b17ac13507e3fa63 100644 --- a/src/lib66/service/service_resolve_master_write.c +++ b/src/lib66/service/service_resolve_master_write.c @@ -1,5 +1,5 @@ /* - * service.c + * service_resolve_master_write.c * * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org> * @@ -16,108 +16,87 @@ #include <oblibs/log.h> #include <oblibs/string.h> -#include <oblibs/files.h> -#include <oblibs/sastr.h> -#include <skalibs/types.h> -#include <skalibs/stralloc.h> #include <skalibs/genalloc.h> -#include <skalibs/djbunix.h>//openreadnclose #include <66/constants.h> -#include <66/ssexec.h> #include <66/resolve.h> +#include <66/graph.h> #include <66/service.h> -int service_resolve_master_write(ssexec_t *info, ss_resolve_graph_t *graph,char const *dir, unsigned int reverse) +int service_resolve_master_write(graph_t *graph, char const *dest) { log_flow() ; - int r, e = 0 ; - size_t i = 0 ; - char ownerstr[UID_FMT] ; - size_t ownerlen = uid_fmt(ownerstr,info->owner) ; - ownerstr[ownerlen] = 0 ; + int e = 0 ; + unsigned int pos = 0 ; + + resolve_service_master_t mres = RESOLVE_SERVICE_MASTER_ZERO ; + resolve_wrapper_t_ref mwres = resolve_set_struct(DATA_SERVICE_MASTER, &mres) ; - stralloc in = STRALLOC_ZERO ; - stralloc inres = STRALLOC_ZERO ; - stralloc gain = STRALLOC_ZERO ; resolve_service_t res = RESOLVE_SERVICE_ZERO ; resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ; - size_t dirlen = strlen(dir) ; + resolve_init(mwres) ; - resolve_init(wres) ; + { + for (; pos < graph->sort_count ; pos++) { - char runat[info->livetree.len + 1 + info->treename.len + SS_SVDIRS_LEN + SS_MASTER_LEN + 1] ; - auto_strings(runat, info->livetree.s, "/", info->treename.s, SS_SVDIRS, SS_MASTER) ; + char *name = graph->data.s + genalloc_s(graph_hash_t,&graph->hash)[graph->sort[pos]].vertex ; - char dst[dirlen + SS_DB_LEN + SS_SRC_LEN + SS_MASTER_LEN + 1] ; - auto_strings(dst, dir, SS_DB, SS_SRC, SS_MASTER) ; + if (resolve_read_g(wres, dest, name) <= 0) { + log_warnu("read resolve file of: ", dest, name) ; + goto err ; + } - size_t livelen = info->live.len - 1 ; - char state[livelen + SS_STATE_LEN + 1 + ownerlen + 1 + info->treename.len + 1] ; - auto_strings(state, info->live.s, SS_STATE, "/", ownerstr, "/", info->treename.s) ; + switch (res.type) { - if (reverse) - { - size_t dstlen = strlen(dst) ; - char file[dstlen + 1 + SS_CONTENTS_LEN + 1] ; - auto_strings(file, dst, "/", SS_CONTENTS) ; + case TYPE_CLASSIC: - size_t filesize=file_get_size(file) ; + mres.classic = resolve_add_string(mwres, res.sa.s + res.name) ; + mres.nclassic++ ; + break ; - r = openreadfileclose(file,&gain,filesize) ; - if(!r) goto err ; - /** ensure that we have an empty line at the end of the string*/ - if (!auto_stra(&gain,"\n")) goto err ; - if (!sastr_clean_element(&gain)) goto err ; - } + case TYPE_BUNDLE: - for (; i < genalloc_len(resolve_service_t,&graph->sorted); i++) - { - char *string = genalloc_s(resolve_service_t,&graph->sorted)[i].sa.s ; - char *name = string + genalloc_s(resolve_service_t,&graph->sorted)[i].name ; - if (reverse) - if (sastr_cmp(&gain,name) == -1) continue ; + mres.bundle = resolve_add_string(mwres, res.sa.s + res.name) ; + mres.nbundle++ ; + break ; - if (!stralloc_cats(&in,name)) goto err ; - if (!stralloc_cats(&in,"\n")) goto err ; + case TYPE_LONGRUN: - if (!stralloc_cats(&inres,name)) goto err ; - if (!stralloc_cats(&inres," ")) goto err ; - } + mres.longrun = resolve_add_string(mwres, res.sa.s + res.name) ; + mres.nlongrun++ ; + break ; - if (inres.len) inres.len--; - if (!stralloc_0(&inres)) goto err ; - r = file_write_unsafe(dst,SS_CONTENTS,in.s,in.len) ; - if (!r) - { - log_warnusys("write: ",dst,"contents") ; - goto err ; - } + case TYPE_ONESHOT: + + mres.oneshot = resolve_add_string(mwres, res.sa.s + res.name) ; + mres.noneshot++ ; + break ; + + case TYPE_MODULE: - res.name = resolve_add_string(wres,SS_MASTER+1) ; - res.description = resolve_add_string(wres,"inner bundle - do not use it") ; - res.treename = resolve_add_string(wres,info->treename.s) ; - res.tree = resolve_add_string(wres,info->tree.s) ; - res.live = resolve_add_string(wres,info->live.s) ; - res.type = TYPE_BUNDLE ; - res.depends = resolve_add_string(wres,inres.s) ; - res.ndepends = genalloc_len(resolve_service_t,&graph->sorted) ; - res.runat = resolve_add_string(wres,runat) ; - res.state = resolve_add_string(wres,state) ; + mres.module = resolve_add_string(mwres, res.sa.s + res.name) ; + mres.nmodule++ ; + break ; - if (!resolve_write(wres,dir,SS_MASTER+1)) goto err ; + default: + log_warn("unknown type") ; + goto err ; + } + } + } + + if (!resolve_write(mwres, dest, SS_MASTER + 1)) + goto err ; e = 1 ; err: resolve_free(wres) ; - stralloc_free(&in) ; - stralloc_free(&inres) ; - stralloc_free(&gain) ; + resolve_free(mwres) ; return e ; } diff --git a/src/lib66/service/service_resolve_master_write_cdb.c b/src/lib66/service/service_resolve_master_write_cdb.c new file mode 100644 index 0000000000000000000000000000000000000000..4b84bf2a03c35da5d5af7af7a20d0a57b18e5367 --- /dev/null +++ b/src/lib66/service/service_resolve_master_write_cdb.c @@ -0,0 +1,62 @@ +/* + * service_resolve_master_write_cdb.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/cdbmake.h> + +#include <66/service.h> +#include <66/resolve.h> + +int service_resolve_master_write_cdb(cdbmaker *c, resolve_service_master_t *mres) +{ + log_flow() ; + + char *str = mres->sa.s ; + + /* name */ + if (!resolve_add_cdb(c,"name",str + mres->name) || + + /* classic */ + !resolve_add_cdb(c,"classic",str + mres->classic) || + + /* bundle */ + !resolve_add_cdb(c,"bundle",str + mres->bundle) || + + /* longrun */ + !resolve_add_cdb(c,"longrun",str + mres->longrun) || + + /* oneshot */ + !resolve_add_cdb(c,"oneshot",str + mres->oneshot) || + + /* module */ + !resolve_add_cdb(c,"module",str + mres->module) || + + /* nclassic */ + !resolve_add_cdb_uint(c,"nclassic",mres->nclassic) || + + /* nbundle */ + !resolve_add_cdb_uint(c,"nbundle",mres->nbundle) || + + /* nlongrun */ + !resolve_add_cdb_uint(c,"nlongrun",mres->nlongrun) || + + /* noneshot */ + !resolve_add_cdb_uint(c,"noneshot",mres->noneshot) || + + /* nmodule */ + !resolve_add_cdb_uint(c,"nmodule",mres->nmodule)) return 0 ; + + return 1 ; +}