-
Eric Vidal authoredEric Vidal authored
ssexec_state.c 3.77 KiB
/*
* ssexec_state.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 <wchar.h>
#include <stdint.h>
#include <oblibs/log.h>
#include <skalibs/types.h>
#include <skalibs/lolstdio.h>
#include <skalibs/buffer.h>
#include <skalibs/sgetopt.h>
#include <66/info.h>
#include <66/resolve.h>
#include <66/service.h>
#include <66/state.h>
#include <66/config.h>
#include <66/ssexec.h>
#define MAXOPTS 12
static wchar_t const field_suffix[] = L" :" ;
static char fields[INFO_NKEY][INFO_FIELD_MAXLEN] = {{ 0 }} ;
static void info_display_string(char const *field,char const *str)
{
info_display_field_name(field) ;
if (!*str)
{
if (!bprintf(buffer_1,"%s%s",log_color->warning,"None"))
log_dieusys(LOG_EXIT_SYS,"write to stdout") ;
}
else
{
if (!buffer_puts(buffer_1,str))
log_dieusys(LOG_EXIT_SYS,"write to stdout") ;
}
if (buffer_putsflush(buffer_1,"\n") == -1)
log_dieusys(LOG_EXIT_SYS,"write to stdout") ;
}
static void info_display_int(char const *field, unsigned int id)
{
char *str = "0" ;
if (id == STATE_FLAGS_TRUE)
str = "1" ;
info_display_string(field, str) ;
}
int ssexec_state(int argc, char const *const *argv, ssexec_t *info)
{
int r = -1 ;
uint8_t m = 0 ;
resolve_service_t res = RESOLVE_SERVICE_ZERO ;
resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ;
ss_state_t sta = STATE_ZERO ;
char const *svname = 0 ;
char buf[MAXOPTS][INFO_FIELD_MAXLEN] = {
"toinit",
"toreload",
"torestart",
"tounsupervise",
"toparse",
"isdownfile",
"isearlier" ,
"isenabled" ,
"isparsed" ,
"issupervised",
"isup" } ;
{
subgetopt l = SUBGETOPT_ZERO ;
for (;;)
{
int opt = subgetopt_r(argc, argv, OPTS_STATE, &l) ;
if (opt == -1) break ;
switch (opt) {
case 'h' :
info_help(info->help, info->usage) ;
return 0 ;
default :
log_usage(info->usage, "\n", info->help) ;
}
}
argc -= l.ind ; argv += l.ind ;
}
if (!argc)
log_usage(info->usage, "\n", info->help) ;
svname = *argv ;
r = service_is_g(svname, STATE_FLAGS_ISPARSED) ;
if (r == -1)
log_dieusys(LOG_EXIT_SYS, "get information of service: ", svname, " -- please a bug report") ;
else if (!r || r == STATE_FLAGS_FALSE)
log_die(LOG_EXIT_USER, "service: ", svname, " is not parsed -- try to parse it using '66 parse ", svname, "'") ;
r = resolve_read_g(wres, info->base.s, svname) ;
if (r <= 0)
log_dieu(LOG_EXIT_SYS, "read resolve file: ", svname) ;
info_field_align(buf,fields,field_suffix,MAXOPTS) ;
if (!state_read(&sta, &res))
log_dieusys(111,"read state file of: ", svname) ;
info_display_int(fields[m++],sta.toinit) ;
info_display_int(fields[m++],sta.toreload) ;
info_display_int(fields[m++],sta.torestart) ;
info_display_int(fields[m++],sta.tounsupervise) ;
info_display_int(fields[m++],sta.toparse) ;
info_display_int(fields[m++],sta.isdownfile) ;
info_display_int(fields[m++],sta.isearlier) ;
info_display_int(fields[m++],sta.isenabled) ;
info_display_int(fields[m++],sta.isparsed) ;
info_display_int(fields[m++],sta.issupervised) ;
info_display_int(fields[m],sta.isup) ;
resolve_free(wres) ;
return 0 ;
}