Skip to content
Snippets Groups Projects
Commit 4a0206fd authored by Eric Vidal's avatar Eric Vidal :speech_balloon:
Browse files

service Master resolve file is no longer a service incorporate to the DB. It...

service Master resolve file is no longer a service incorporate to the DB. It was reorganize to provide mandatory field to be a real Master. This file will now be used to known the global state of the services.
parent 7b6bacf6
No related branches found
No related tags found
No related merge requests found
Showing
with 729 additions and 103 deletions
......@@ -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) ;
/**
......
......@@ -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) ;
......
......@@ -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
......
......@@ -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 ;
......
......@@ -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 ;
......
......@@ -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++)
......
/*
* 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 ;
}
/*
* 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 ;
}
......@@ -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 ;
......
......@@ -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) ;
......
......@@ -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 ;
}
......
......@@ -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) ;
......
......@@ -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 ;
}
......
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
......
/*
* 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 ;
}
/*
* 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 ;
......
/*
* 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 ;
}
/*
* 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 ;
}
/*
* 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 ;
}
/*
* 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 ;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment