-
Eric Vidal authoredEric Vidal authored
info_graph_display_service.c 2.80 KiB
/*
* info_graph_display_service.c
*
* Copyright (c) 2018-2023 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 <unistd.h>
#include <oblibs/log.h>
#include <skalibs/lolstdio.h>
#include <skalibs/types.h>
#include <66/service.h>
#include <66/utils.h>
#include <66/resolve.h>
#include <66/config.h>
#include <66/constants.h>
#include <66/state.h>
#include <66/enum.h>
#include <s6/supervise.h>
int info_graph_display_service(char const *name)
{
log_flow() ;
int err = 0 ;
uint8_t pid_color = 0 ;
char str_pid[UINT_FMT] ;
char *ppid ;
ss_state_t sta = STATE_ZERO ;
s6_svstatus_t status = S6_SVSTATUS_ZERO ;
resolve_service_t res = RESOLVE_SERVICE_ZERO ;
resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ;
char base[SS_MAX_PATH_LEN + SS_SYSTEM_LEN + 1] ;
if (!set_ownersysdir_stack(base, getuid()))
log_warn_return(LOG_EXIT_ZERO, "set owner directory") ;
if (resolve_read_g(wres, base, name) <= 0) {
log_warnu("read resolve file of: ",name) ;
goto freed ;
}
if (!state_read(&sta, &res)) {
log_warnusys("read state of: ", name) ;
goto freed ;
}
if (res.type == TYPE_CLASSIC) {
s6_svstatus_read(res.sa.s + res.live.scandir ,&status) ;
pid_color = !status.pid ? 1 : 2 ;
str_pid[uint_fmt(str_pid, status.pid)] = 0 ;
ppid = &str_pid[0] ;
} else {
if (sta.issupervised == STATE_FLAGS_FALSE) {
ppid = "unitialized" ;
goto dis ;
} else if (sta.isup == STATE_FLAGS_FALSE) {
ppid = "down" ;
pid_color = 1 ;
} else {
ppid = "up" ;
pid_color = 2 ;
}
}
dis:
if (!bprintf(buffer_1,"%s (%s%s%s%s%s, %s%s%s%s%s, %s%s%s%s%s, %s%s%s%s%s)", \
name, \
pid_color > 1 ? log_color->valid : pid_color ? log_color->error : log_color->warning, \
"pid", \
log_color->off, \
"=", \
ppid, \
res.enabled ? log_color->valid : log_color->warning, \
"state", \
log_color->off, \
"=", \
res.enabled ? "Enabled" : "Disabled", \
log_color->blue, \
"type",
log_color->off, \
"=", \
get_key_by_enum(ENUM_TYPE,res.type), \
log_color->magenta, \
"tree", \
log_color->off, \
"=", \
res.sa.s + res.treename))
goto freed ;
err = 1 ;
freed:
resolve_free(wres) ;
return err ;
}