From 6649b940ad32327427065098e0ad889ac606f748 Mon Sep 17 00:00:00 2001 From: obarun <eric@obarun.org> Date: Mon, 1 Nov 2021 16:32:33 +1100 Subject: [PATCH] add service_isenabled and service_isenabledat function --- src/include/66/service.h | 23 +++++ src/lib66/ss_service.c | 184 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 207 insertions(+) create mode 100644 src/include/66/service.h create mode 100644 src/lib66/ss_service.c diff --git a/src/include/66/service.h b/src/include/66/service.h new file mode 100644 index 00000000..71f150fd --- /dev/null +++ b/src/include/66/service.h @@ -0,0 +1,23 @@ +/* + * service.h + * + * 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./ + */ + +#ifndef SS_SERVICE_H +#define SS_SERVICE_H + +#include <skalibs/stralloc.h> + +int service_isenabled(char const *sv) ; +int service_isenabledat(stralloc *tree, char const *sv) ; + +#endif diff --git a/src/lib66/ss_service.c b/src/lib66/ss_service.c new file mode 100644 index 00000000..cef23c9c --- /dev/null +++ b/src/lib66/ss_service.c @@ -0,0 +1,184 @@ +/* + * ss_service.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 <unistd.h> +#include <sys/stat.h> + +#include <oblibs/log.h> +#include <oblibs/string.h> +#include <oblibs/types.h> +#include <oblibs/sastr.h> + +#include <skalibs/stralloc.h> + +#include <66/utils.h> +#include <66/constants.h> +#include <66/resolve.h> +#include <66/ssexec.h> + +/** @Return 0 if not found + * @Return 1 if found + * @Return 2 if found but marked disabled + * @Return -1 system error */ +int service_isenabled(char const *sv) +{ + + log_flow() ; + + stralloc sa = STRALLOC_ZERO ; + ss_resolve_t res = RESOLVE_ZERO ; + size_t newlen = 0, pos = 0 ; + int e = -1 ; + + if (!set_ownersysdir(&sa, getuid())) { + + log_warnusys("set owner directory") ; + stralloc_free(&sa) ; + return 0 ; + } + + char tmp[sa.len + SS_SYSTEM_LEN + 2] ; + auto_strings(tmp, sa.s, SS_SYSTEM) ; + + // no tree exist yet + if (!scan_mode(tmp, S_IFDIR)) + goto empty ; + + auto_strings(tmp, sa.s, SS_SYSTEM, "/") ; + + newlen = sa.len + SS_SYSTEM_LEN + 1 ; + sa.len = 0 ; + + if (!sastr_dir_get(&sa, tmp, SS_BACKUP + 1, S_IFDIR)) { + + log_warnu("get list of trees from: ", tmp) ; + goto freed ; + } + + FOREACH_SASTR(&sa, pos) { + + char *treename = sa.s + pos ; + + char trees[newlen + strlen(treename) + SS_SVDIRS_LEN + 1] ; + auto_strings(trees, tmp, treename, SS_SVDIRS) ; + + if (ss_resolve_check(trees, sv)) { + + if (!ss_resolve_read(&res, trees, sv)) { + + log_warnu("read resolve file: ", trees, "/", sv) ; + goto freed ; + } + + if (res.disen) { + + log_trace(sv, " enabled at tree: ", treename) ; + + e = 1 ; + goto freed ; + + } else { + + e = 2 ; + goto freed ; + } + } + } + empty: + e = 0 ; + freed: + stralloc_free(&sa) ; + ss_resolve_free(&res) ; + return e ; +} + +/** @Return 0 if not found + * @Return 1 if found + * @Return 2 if found but marked disabled + * @Return -1 system error */ +int service_isenabledat(stralloc *tree, char const *sv) +{ + + log_flow() ; + + stralloc sa = STRALLOC_ZERO ; + ss_resolve_t res = RESOLVE_ZERO ; + size_t newlen = 0, pos = 0 ; + int e = -1 ; + + if (!set_ownersysdir(&sa, getuid())) { + + log_warnusys("set owner directory") ; + stralloc_free(&sa) ; + return 0 ; + } + + char tmp[sa.len + SS_SYSTEM_LEN + 2] ; + auto_strings(tmp, sa.s, SS_SYSTEM) ; + + // no tree exist yet + if (!scan_mode(tmp, S_IFDIR)) + goto empty ; + + auto_strings(tmp, sa.s, SS_SYSTEM, "/") ; + + newlen = sa.len + SS_SYSTEM_LEN + 1 ; + sa.len = 0 ; + + if (!sastr_dir_get(&sa, tmp, SS_BACKUP + 1, S_IFDIR)) { + + log_warnu("get list of trees from: ", tmp) ; + goto freed ; + } + + FOREACH_SASTR(&sa, pos) { + + char *treename = sa.s + pos ; + + char trees[newlen + strlen(treename) + SS_SVDIRS_LEN + 1] ; + auto_strings(trees, tmp, treename, SS_SVDIRS) ; + + if (ss_resolve_check(trees, sv)) { + + if (!ss_resolve_read(&res, trees, sv)) { + + log_warnu("read resolve file: ", trees, "/", sv) ; + goto freed ; + } + + if (res.disen) { + + log_trace(sv, " enabled at tree: ", treename) ; + e = 1 ; + + } else { + + log_trace(sv, " disabled at tree: ", treename) ; + e = 2 ; + } + + if (!auto_stra(tree, treename)) { + e = -1 ; + goto freed ; + } + goto freed ; + } + } + empty: + e = 0 ; + freed: + stralloc_free(&sa) ; + ss_resolve_free(&res) ; + return e ; +} -- GitLab