-
Eric Vidal authoredEric Vidal authored
ssexec_restart.c 3.02 KiB
/*
* ssexec_restart.c
*
* Copyright (c) 2018-2024 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/types.h>
#include <oblibs/graph.h>
#include <oblibs/stack.h>
#include <skalibs/sgetopt.h>
#include <66/ssexec.h>
#include <66/config.h>
#include <66/graph.h>
#include <66/state.h>
#include <66/svc.h>
#include <66/sanitize.h>
#include <66/service.h>
#include <66/enum.h>
int ssexec_restart(int argc, char const *const *argv, ssexec_t *info)
{
log_flow() ;
int r, n = 0 ;
uint32_t flag = 0 ;
uint8_t siglen = 3 ;
graph_t graph = GRAPH_ZERO ;
struct resolve_hash_s *hres = NULL ;
ss_state_t sta = STATE_ZERO ;
FLAGS_SET(flag, STATE_FLAGS_TOPROPAGATE|STATE_FLAGS_TORESTART|STATE_FLAGS_WANTUP) ;
{
subgetopt l = SUBGETOPT_ZERO ;
for (;;) {
int opt = subgetopt_r(argc, argv, OPTS_SUBSTART, &l) ;
if (opt == -1) break ;
switch (opt) {
case 'h' :
info_help(info->help, info->usage) ;
return 0 ;
case 'P' :
FLAGS_CLEAR(flag, STATE_FLAGS_TOPROPAGATE) ;
siglen++ ;
break ;
default :
log_usage(info->usage, "\n", info->help) ;
}
}
argc -= l.ind ; argv += l.ind ;
}
if (argc < 1)
log_usage(info->usage, "\n", info->help) ;
if ((svc_scandir_ok(info->scandir.s)) != 1 )
log_diesys(LOG_EXIT_SYS,"scandir: ", info->scandir.s, " is not running") ;
/** build the graph of the entire system */
graph_build_service(&graph, &hres, info, flag) ;
if (!graph.mlen)
log_die(LOG_EXIT_USER, "services selection is not available -- have you already parsed a service?") ;
for (n = 0 ; n < argc ; n++) {
struct resolve_hash_s *hash = hash_search(&hres, argv[n]) ;
if (hash == NULL)
log_die(LOG_EXIT_USER, "service: ", *argv, " not available -- did you parse it?") ;
if (!state_read(&sta, &hash->res))
log_dieu(LOG_EXIT_SYS, "read state file of: ", argv[n]) ;
if (sta.issupervised == STATE_FLAGS_FALSE)
/** nothing to do */
log_warn_return(LOG_EXIT_ZERO, "service: ", argv[n], " is not supervised -- try to start it first using '66 start ", argv[n], "'") ;
}
char *sig[siglen] ;
if (siglen > 3) {
sig[0] = "-P" ;
sig[1] = "-wR" ;
sig[2] = "-ru" ;
sig[3] = 0 ;
} else {
sig[0] = "-wR" ;
sig[1] = "-ru" ;
sig[2] = 0 ;
}
r = svc_send_wait(argv, argc, sig, siglen, info) ;
hash_free(&hres) ;
graph_free_all(&graph) ;
return r ;
}