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