From f166bcd98f58675b2c3675e7c0ed73d630483dac Mon Sep 17 00:00:00 2001 From: obarun <eric@obarun.org> Date: Tue, 21 Nov 2023 23:22:21 +1100 Subject: [PATCH] add svc_init_array function --- src/lib66/svc/svc_init_array.c | 112 +++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 src/lib66/svc/svc_init_array.c diff --git a/src/lib66/svc/svc_init_array.c b/src/lib66/svc/svc_init_array.c new file mode 100644 index 00000000..fde27ec2 --- /dev/null +++ b/src/lib66/svc/svc_init_array.c @@ -0,0 +1,112 @@ +/* + * svc_init_array.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 <oblibs/log.h> +#include <oblibs/graph.h> +#include <oblibs/types.h> +#include <oblibs/stack.h> + +#include <66/svc.h> +#include <66/service.h> +#include <66/ssexec.h> +#include <66/state.h> +#include <66/enum.h> + +#include <s6/supervise.h> + +static pidservice_t pidservice_init(unsigned int len) +{ + log_flow() ; + + pidservice_t pids = PIDSERVICE_ZERO ; + + if (len > SS_MAX_SERVICE) + log_die(LOG_EXIT_SYS, "too many services") ; + + memset(pids.edge, 0, len * sizeof(unsigned int)) ; + memset(pids.notif, 0, len * sizeof(unsigned int)) ; + + return pids ; +} + +void svc_init_array(unsigned int *list, unsigned int listlen, pidservice_t *apids, graph_t *g, resolve_service_t *ares, unsigned int areslen, ssexec_t *info, uint8_t requiredby, uint32_t flag) +{ + log_flow() ; + + int r = 0 ; + unsigned int pos = 0 ; + + for (; pos < listlen ; pos++) { + + pidservice_t pids = pidservice_init(g->mlen) ; + + char *name = g->data.s + genalloc_s(graph_hash_t,&g->hash)[list[pos]].vertex ; + + pids.aresid = service_resolve_array_search(ares, areslen, name) ; + + if (pids.aresid < 0) + log_dieu(LOG_EXIT_SYS,"find ares id of: ", name, " -- please make a bug reports") ; + + + if (FLAGS_ISSET(flag, STATE_FLAGS_TOPROPAGATE)) { + + pids.nedge = graph_matrix_get_edge_g_sorted_list(pids.edge, g, name, requiredby, 1) ; + + if (pids.nedge < 0) + log_dieu(LOG_EXIT_SYS,"get sorted ", requiredby ? "required by" : "dependency", " list of service: ", name) ; + + pids.nnotif = graph_matrix_get_edge_g_sorted_list(pids.notif, g, name, !requiredby, 1) ; + + if (pids.nnotif < 0) + log_dieu(LOG_EXIT_SYS,"get sorted ", !requiredby ? "required by" : "dependency", " list of service: ", name) ; + } + + pids.vertex = graph_hash_vertex_get_id(g, name) ; + + if (pids.vertex < 0) + log_dieu(LOG_EXIT_SYS, "get vertex id -- please make a bug report") ; + + if (ares[pids.aresid].type != TYPE_CLASSIC) { + + ss_state_t sta = STATE_ZERO ; + + if (!state_read(&sta, &ares[pids.aresid])) + log_dieusys(LOG_EXIT_SYS, "read state file of: ", name) ; + + if (sta.isup == STATE_FLAGS_TRUE) + FLAGS_SET(pids.state, SVC_FLAGS_UP) ; + else + FLAGS_SET(pids.state, SVC_FLAGS_DOWN) ; + + } else { + + s6_svstatus_t status ; + + r = s6_svstatus_read(ares[pids.aresid].sa.s + ares[pids.aresid].live.scandir, &status) ; + + pid_t pid = !r ? 0 : status.pid ; + + if (pid > 0) { + + FLAGS_SET(pids.state, SVC_FLAGS_UP) ; + } + else + FLAGS_SET(pids.state, SVC_FLAGS_DOWN) ; + } + + apids[pos] = pids ; + } +} \ No newline at end of file -- GitLab