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

add graph_compute_visit function and make visit structure public

parent 3680e08d
No related branches found
No related tags found
No related merge requests found
......@@ -29,10 +29,12 @@
extern void graph_build_tree(graph_t *g,char const *base, resolve_tree_master_enum_t field) ;
extern void graph_build_service(graph_t *g, resolve_service_t *ares, unsigned int *areslen, ssexec_t *info, uint32_t flag) ;
extern int graph_compute_dependencies(graph_t *g, char const *vertex, char const *edge, uint8_t requiredby) ;
extern void graph_compute_visit(char const *name, unsigned int *visit, unsigned int *list, graph_t *graph, unsigned int *nservice, uint8_t requiredby) ;
extern int graph_build_service_bytree(graph_t *g, char const *tree, uint8_t what, uint8_t is_supervised) ;
extern int graph_build_service_bytree_from_src(graph_t *g, char const *src, uint8_t what) ;
/** possible remove of it */
extern int graph_build_service_from_sastr(graph_t *graph, stralloc *sa, char const *base) ;
......
......@@ -24,13 +24,22 @@
#include <skalibs/genalloc.h>
#include <66/ssexec.h>
#include <66/service.h>
#define MYUID getuid()
#define YOURUID(passto,owner) youruid(passto,owner)
#define MYGID getgid()
#define YOURGID(passto,owner) yourgid(passto,owner)
typedef enum visit_e visit_t ;
enum visit_e
{
VISIT_WHITE = 0,
VISIT_GRAY,
VISIT_BLACK
} ;
extern void visit_init(visit_t *visit, size_t len) ;
/** ss_utils.c file */
extern char const *get_userhome(uid_t myuid) ;
extern int youruid(uid_t *passto,char const *owner) ;
......@@ -42,10 +51,7 @@ extern int set_livestate(stralloc *live,uid_t owner) ;
extern int set_ownerhome(stralloc *base,uid_t owner) ;
extern int set_ownersysdir(stralloc *base,uid_t owner) ;
extern int read_svfile(stralloc *sasv,char const *name,char const *src) ;
extern int module_in_cmdline(genalloc *gares, resolve_service_t *res, char const *dir) ;
extern int module_search_service(char const *src, genalloc *gares, char const *name,uint8_t *found, char module_name[256]) ;
extern int module_path(stralloc *sdir, stralloc *mdir, char const *sv,char const *frontend_src, uid_t owner) ;
extern int sa_pointo(stralloc *sa, ssexec_t *info, int type, unsigned int where) ;
extern int create_live_state(ssexec_t *info, char const *treename) ;
extern int create_live_tree(ssexec_t *info) ;
......
......@@ -30,6 +30,7 @@
#include <66/graph.h>
#include <66/resolve.h>
#include <66/utils.h>
#include <66/state.h>
int ssexec_disable(int argc, char const *const *argv, ssexec_t *info)
{
......@@ -45,6 +46,9 @@ int ssexec_disable(int argc, char const *const *argv, ssexec_t *info)
unsigned int areslen = 0 ;
resolve_service_t ares[SS_MAX_SERVICE] ;
visit_t visit[SS_MAX_SERVICE] ;
visit_init(visit, SS_MAX_SERVICE) ;
FLAGS_SET(flag, STATE_FLAGS_TOPROPAGATE|STATE_FLAGS_WANTUP) ;
{
......@@ -74,7 +78,7 @@ int ssexec_disable(int argc, char const *const *argv, ssexec_t *info)
case 'R' :
log_1_warn("options -F is deprecated -- use instead 66 service remove <service>") ;
log_1_warn("options -F is deprecated -- use instead 66 remove <service>") ;
break ;
default :
......@@ -94,8 +98,14 @@ int ssexec_disable(int argc, char const *const *argv, ssexec_t *info)
log_die(LOG_EXIT_USER, "services selection is not available -- try to parse it first") ;
for (; n < argc ; n++) {
name_isvalid(argv[n]) ;
service_enable_disable(&graph, info->base.s, argv[n], 0) ;
int aresid = service_resolve_array_search(ares, areslen, argv[n]) ;
if (aresid < 0)
log_die(LOG_EXIT_USER, "service: ", argv[n], " not available -- did you parsed it?") ;
service_enable_disable(&graph, &ares[aresid], ares, areslen, 0, visit) ;
if (!sastr_add_string(&sa, argv[n]))
log_dieu(LOG_EXIT_SYS, "add string") ;
......
......@@ -67,6 +67,9 @@ int ssexec_enable(int argc, char const *const *argv, ssexec_t *info)
unsigned int areslen = 0 ;
resolve_service_t ares[SS_MAX_SERVICE] ;
visit_t visit[SS_MAX_SERVICE] ;
visit_init(visit, SS_MAX_SERVICE) ;
FLAGS_SET(flag, STATE_FLAGS_TOPROPAGATE|STATE_FLAGS_WANTUP) ;
{
......@@ -125,7 +128,11 @@ int ssexec_enable(int argc, char const *const *argv, ssexec_t *info)
for (n = 0 ; n < argc ; n++) {
service_enable_disable(&graph, info->base.s, argv[n], 1) ;
int aresid = service_resolve_array_search(ares, areslen, argv[n]) ;
if (aresid < 0)
log_die(LOG_EXIT_USER, "service: ", argv[n], " not available -- did you parsed it?") ;
service_enable_disable(&graph, &ares[aresid], ares, areslen, 1, visit) ;
if (!sastr_add_string(&sa, argv[n]))
log_dieu(LOG_EXIT_SYS, "add string") ;
......
......@@ -119,25 +119,9 @@ int ssexec_reconfigure(int argc, char const *const *argv, ssexec_t *info)
if (aresid < 0)
log_die(LOG_EXIT_USER, "service: ", argv[n], " not available -- did you parsed it?") ;
unsigned int l[graph.mlen], c = 0, pos = 0, idx = 0 ;
idx = graph_hash_vertex_get_id(&graph, argv[n]) ;
if (!visit[idx]) {
list[nservice++] = idx ;
visit[idx] = 1 ;
}
/** find dependencies of the service from the graph, do it recursively */
c = graph_matrix_get_edge_g_list(l, &graph, argv[n], 1, 1) ;
/** append to the list to deal with */
for (; pos < c ; pos++) {
if (!visit[l[pos]]) {
list[nservice++] = l[pos] ;
visit[l[pos]] = 1 ;
}
}
graph_compute_visit(argv[n], visit, list, &graph, &nservice, 1) ;
}
/** keep list of already running service */
char const *exclude[4] = { SS_FDHOLDER, SS_ONESHOTD, SS_SVSCAN_LOG, 0 } ;
if (!sastr_dir_get(&sa, info->scandir.s, exclude, S_IFDIR))
......@@ -147,6 +131,7 @@ int ssexec_reconfigure(int argc, char const *const *argv, ssexec_t *info)
/** stop service and unsupervise it */
unsigned int m = 0 ;
int nargc = 2 + argc + siglen ;
char const *prog = PROG ;
char const *newargv[nargc] ;
newargv[m++] = "stop" ;
......@@ -158,7 +143,9 @@ int ssexec_reconfigure(int argc, char const *const *argv, ssexec_t *info)
newargv[m++] = 0 ;
PROG = "stop" ;
e = ssexec_stop(nargc, newargv, info) ;
PROG = prog ;
if (e)
goto freed ;
}
......@@ -170,23 +157,22 @@ int ssexec_reconfigure(int argc, char const *const *argv, ssexec_t *info)
{
/** start service */
unsigned int m = 0 ;
int nargc = 2 + nservice + siglen ;
int nargc = 2 + argc + siglen ;
char const *prog = PROG ;
char const *newargv[nargc] ;
newargv[m++] = "start" ;
if (siglen)
newargv[m++] = "-P" ;
for (n = 0 ; n < nservice ; n++) {
char *name = graph.data.s + genalloc_s(graph_hash_t,&graph.hash)[list[n]].vertex ;
if (sastr_cmp(&sa, name) >= 0)
newargv[m++] = name ;
}
for (n = 0 ; n < argc ; n++)
newargv[m++] = argv[n] ;
newargv[m++] = 0 ;
e = ssexec_start(m - 1, newargv, info) ;
PROG= "start" ;
e = ssexec_start(--m, newargv, info) ;
PROG = prog ;
}
freed:
......
......@@ -102,52 +102,8 @@ int ssexec_start(int argc, char const *const *argv, ssexec_t *info)
if (aresid < 0)
log_die(LOG_EXIT_USER, "service: ", argv[n], " not available -- did you parsed it?") ;
unsigned int l[graph.mlen], c = 0, pos = 0, idx = 0 ;
graph_compute_visit(argv[n], visit, list, &graph, &nservice, 0) ;
idx = graph_hash_vertex_get_id(&graph, argv[n]) ;
if (!visit[idx]) {
list[nservice++] = idx ;
visit[idx] = 1 ;
}
/** find dependencies of the service from the graph, do it recursively */
c = graph_matrix_get_edge_g_list(l, &graph, argv[n], 0, 1) ;
/** append to the list to deal with */
for (; pos < c ; pos++) {
if (!visit[l[pos]]) {
list[nservice++] = l[pos] ;
visit[l[pos]] = 1 ;
}
}
if (ares[aresid].type == TYPE_MODULE) {
if (ares[aresid].regex.ncontents) {
stralloc sa = STRALLOC_ZERO ;
if (!sastr_clean_string(&sa, ares[aresid].sa.s + ares[aresid].regex.contents))
log_dieu(LOG_EXIT_SYS, "clean string") ;
{
size_t idx = 0 ;
FOREACH_SASTR(&sa, idx) {
/** find dependencies of the service from the graph, do it recursively */
c = graph_matrix_get_edge_g_list(l, &graph, sa.s + idx, 0, 1) ;
/** append to the list to deal with */
for (pos = 0 ; pos < c ; pos++) {
if (!visit[l[pos]]) {
list[nservice++] = l[pos] ;
visit[l[pos]] = 1 ;
}
}
}
}
}
}
}
/** initiate services at the corresponding scandir */
......
......@@ -17,6 +17,7 @@
#include <oblibs/log.h>
#include <oblibs/types.h>
#include <oblibs/graph.h>
#include <oblibs/sastr.h>
#include <skalibs/sgetopt.h>
#include <skalibs/djbunix.h>
......@@ -28,6 +29,7 @@
#include <66/state.h>
#include <66/svc.h>
#include <66/service.h>
#include <66/enum.h>
int ssexec_stop(int argc, char const *const *argv, ssexec_t *info)
{
......@@ -106,25 +108,7 @@ int ssexec_stop(int argc, char const *const *argv, ssexec_t *info)
if (aresid < 0)
log_die(LOG_EXIT_USER, "service: ", argv[n], " not available -- did you started it?") ;
unsigned int l[graph.mlen], c = 0, pos = 0, idx = 0 ;
idx = graph_hash_vertex_get_id(&graph, argv[n]) ;
if (!visit[idx]) {
list[nservice++] = idx ;
visit[idx] = 1 ;
}
/** find requiredby of the service from the graph, do it recursively */
c = graph_matrix_get_edge_g_list(l, &graph, argv[n], 1, 1) ;
/** append to the list to deal with */
for (; pos < c ; pos++) {
if (!visit[l[pos]]) {
list[nservice++] = l[pos] ;
visit[l[pos]] = 1 ;
}
}
graph_compute_visit(argv[n], visit, list, &graph, &nservice, 1) ;
}
char *sig[siglen] ;
......
......@@ -52,14 +52,6 @@
#define TREE_MAXOPTS 9
#define tree_checkopts(n) if (n >= TREE_MAXOPTS) log_die(LOG_EXIT_USER, "too many -o options")
typedef enum visit_e visit ;
enum visit_e
{
SS_WHITE = 0,
SS_GRAY,
SS_BLACK
} ;
typedef struct tree_opts_map_s tree_opts_map_t ;
struct tree_opts_map_s
{
......@@ -135,16 +127,6 @@ tree_what_t what_init(void)
return what ;
}
void visit_init(visit *v, size_t len)
{
log_flow() ;
size_t pos = 0 ;
for (; pos < len; pos++)
v[pos] = SS_WHITE ;
}
void tree_enable_disable(graph_t *g, char const *base, char const *treename, uint8_t action) ;
static void check_identifier(char const *name)
......@@ -695,7 +677,7 @@ void tree_enable_disable_deps(graph_t *g,char const *base, char const *treename,
log_dieu(LOG_EXIT_SYS, "get ", action ? "dependencies" : "required by" ," of: ", treename) ;
size_t len = sastr_nelement(&sa) ;
visit v[len] ;
visit_t v[len] ;
visit_init(v, len) ;
......@@ -703,13 +685,13 @@ void tree_enable_disable_deps(graph_t *g,char const *base, char const *treename,
FOREACH_SASTR(&sa, pos) {
if (v[element] == SS_WHITE) {
if (v[element] == VISIT_WHITE) {
char *name = sa.s + pos ;
tree_enable_disable(g, base, name, action) ;
v[element] = SS_GRAY ;
v[element] = VISIT_GRAY ;
}
element++ ;
}
......@@ -773,7 +755,7 @@ void tree_depends_requiredby(graph_t *g, char const *base, char const *treename,
log_dieu(LOG_EXIT_SYS,"get sorted ", requiredby ? "required by" : "dependency", " list of tree: ", treename) ;
size_t vlen = sastr_nelement(&sa) ;
visit v[vlen] ;
visit_t v[vlen] ;
visit_init(v, vlen) ;
......@@ -787,7 +769,7 @@ void tree_depends_requiredby(graph_t *g, char const *base, char const *treename,
for(; pos < len ; pos += strlen(t + pos) + 1, element++) {
if (v[element] == SS_WHITE) {
if (v[element] == VISIT_WHITE) {
char *name = t + pos ;
......@@ -800,7 +782,7 @@ void tree_depends_requiredby(graph_t *g, char const *base, char const *treename,
if (deps) {
if (!strcmp(name, deps)) {
v[element] = SS_GRAY ;
v[element] = VISIT_GRAY ;
continue ;
}
}
......@@ -811,7 +793,7 @@ void tree_depends_requiredby(graph_t *g, char const *base, char const *treename,
nb++ ;
}
v[element] = SS_GRAY ;
v[element] = VISIT_GRAY ;
}
}
}
......@@ -868,7 +850,7 @@ void tree_depends_requiredby_deps(graph_t *g, char const *base, char const *tree
log_dieu(LOG_EXIT_SYS,"get sorted ", requiredby ? "required by" : "dependency", " list of tree: ", treename) ;
size_t vlen = sastr_nelement(&sa) ;
visit v[vlen] ;
visit_t v[vlen] ;
visit_init(v, vlen) ;
......@@ -881,13 +863,13 @@ void tree_depends_requiredby_deps(graph_t *g, char const *base, char const *tree
for(; pos < len ; pos += strlen(t + pos) + 1, element++) {
if (v[element] == SS_WHITE) {
if (v[element] == VISIT_WHITE) {
char *name = t + pos ;
tree_depends_requiredby(g, base, name, !requiredby, none, deps) ;
v[element] = SS_GRAY ;
v[element] = VISIT_GRAY ;
}
}
......
graph_build_service.o
graph_build_tree.o
graph_compute_dependencies.o
graph_compute_visit.o
graph_remove_deps.o
-loblibs
-lskarnet
......
/*
* graph_compute_visit_g.c
*
* Copyright (c) 2018-2022 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 <oblibs/log.h>
#include <66/graph.h>
void graph_compute_visit(char const *name, unsigned int *visit, unsigned int *list, graph_t *graph, unsigned int *nservice, uint8_t requiredby)
{
log_flow() ;
unsigned int l[graph->mlen], c = 0, pos = 0, idx = 0 ;
idx = graph_hash_vertex_get_id(graph, name) ;
if (!visit[idx]) {
list[(*nservice)++] = idx ;
visit[idx] = 1 ;
}
/** find dependencies of the service from the graph, do it recursively */
c = graph_matrix_get_edge_g_list(l, graph, name, requiredby, 1) ;
/** append to the list to deal with */
for (; pos < c ; pos++) {
if (!visit[l[pos]]) {
list[(*nservice)++] = l[pos] ;
visit[l[pos]] = 1 ;
}
}
}
get_userhome.o
module_in_cmdline.o
module_path.o
module_search_service.o
name_isvalid.o
read_svfile.o
set_livedir.o
......@@ -9,6 +6,7 @@ set_livescan.o
set_livestate.o
set_ownerhome.o
set_ownersysdir.o
visit.o
yourgid.o
youruid.o
-ls6
......
/*
* visit.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 <66/utils.h>
void visit_init(visit_t *visit, size_t len)
{
log_flow() ;
size_t pos = 0 ;
for (; pos < len; pos++)
visit[pos] = VISIT_WHITE ;
}
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