summaryrefslogtreecommitdiff
path: root/src/libs6rc/s6rc_db_check_revdeps.c
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2015-06-04 20:48:10 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2015-06-04 20:48:10 +0000
commit4b31caa9cdaef67c70bc7fb43963ba68b7bf5bb1 (patch)
treeb9d634a9199d7f69ae4e1f35d88edac63d04abcf /src/libs6rc/s6rc_db_check_revdeps.c
downloads6-rc-4b31caa9cdaef67c70bc7fb43963ba68b7bf5bb1.tar.xz
Initial commit
Diffstat (limited to 'src/libs6rc/s6rc_db_check_revdeps.c')
-rw-r--r--src/libs6rc/s6rc_db_check_revdeps.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/libs6rc/s6rc_db_check_revdeps.c b/src/libs6rc/s6rc_db_check_revdeps.c
new file mode 100644
index 0000000..0cb2845
--- /dev/null
+++ b/src/libs6rc/s6rc_db_check_revdeps.c
@@ -0,0 +1,30 @@
+/* ISC license. */
+
+#include <skalibs/uint32.h>
+#include <skalibs/bytestr.h>
+#include <skalibs/bitarray.h>
+#include <s6-rc/s6rc-db.h>
+
+int s6rc_db_check_revdeps (s6rc_db_t const *db)
+{
+ unsigned int n = db->nshort + db->nlong ;
+ unsigned int m = bitarray_div8(n) ;
+ unsigned char matrix[n * m] ;
+ register unsigned int i = n ;
+ register unsigned char const *p = matrix ;
+ byte_zero(matrix, n * m) ;
+ while (i--)
+ {
+ register unsigned int j = db->services[i].ndeps[1] ;
+ while (j--) bitarray_not(matrix + m * i, db->deps[db->ndeps + db->services[i].deps[1] + j], 1) ;
+ }
+ i = n ;
+ while (i--)
+ {
+ register unsigned int j = db->services[i].ndeps[0] ;
+ while (j--) bitarray_not(matrix + m * db->deps[db->services[i].deps[0] + j], i, 1) ;
+ }
+ i = n * m ;
+ while (i--) if (*p++) return 0 ;
+ return 1 ;
+}