diff options
Diffstat (limited to 'src/serverlib/s6rc_db_check_revdeps.c')
-rw-r--r-- | src/serverlib/s6rc_db_check_revdeps.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/serverlib/s6rc_db_check_revdeps.c b/src/serverlib/s6rc_db_check_revdeps.c new file mode 100644 index 0000000..0097d06 --- /dev/null +++ b/src/serverlib/s6rc_db_check_revdeps.c @@ -0,0 +1,29 @@ +/* ISC license. */ + +#include <string.h> +#include <skalibs/bitarray.h> +#include <s6-rc/s6rc-db.h> + +int s6rc_db_check_revdeps (s6rc_db_t const *db) +{ + size_t n = db->nshort + db->nlong ; + size_t m = bitarray_div8(n) ; + unsigned char matrix[n * m] ; + unsigned int i = n ; + unsigned char const *p = matrix ; + memset(matrix, 0, n * m) ; + while (i--) + { + 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--) + { + unsigned int j = db->services[i].ndeps[0] ; + while (j--) bitarray_not(matrix + m * db->deps[db->services[i].deps[0] + j], i, 1) ; + } + n *= m ; + while (n--) if (*p++) return 1 ; + return 0 ; +} |