aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs6rc
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2021-07-23 23:12:57 +0000
committerLaurent Bercot <ska@appnovation.com>2021-07-23 23:12:57 +0000
commitd4b826cce5774ded3b859d9a9e1735c25bca50fb (patch)
tree413a7031ab5350cc3cf600f95ae80060e3030cfa /src/libs6rc
parent02486d457def273db80d36c2370fd663511cb82b (diff)
downloads6-rc-d4b826cce5774ded3b859d9a9e1735c25bca50fb.tar.gz
Better cdb management; deps_wanted_closure mostly done
Signed-off-by: Laurent Bercot <ska@appnovation.com>
Diffstat (limited to 'src/libs6rc')
-rw-r--r--src/libs6rc/s6rc_db_free.c2
-rw-r--r--src/libs6rc/s6rc_db_init.c (renamed from src/libs6rc/s6rc_db_load.c)6
-rw-r--r--src/libs6rc/s6rc_service_recheck_instance.c10
-rw-r--r--src/libs6rc/s6rc_service_resolve.c17
4 files changed, 21 insertions, 14 deletions
diff --git a/src/libs6rc/s6rc_db_free.c b/src/libs6rc/s6rc_db_free.c
index 7e7ed54..549cfc8 100644
--- a/src/libs6rc/s6rc_db_free.c
+++ b/src/libs6rc/s6rc_db_free.c
@@ -4,6 +4,7 @@
#include <errno.h>
#include <skalibs/alloc.h>
+#include <skalibs/cdb.h>
#include <s6-rc/db.h>
@@ -11,6 +12,7 @@ void s6rc_db_free (s6rc_db_t *db)
{
int e = errno ;
alloc_free(db->argvs) ;
+ cdb_free(&db->resolve) ;
munmap(db->map, db->size) ;
db->map = 0 ;
errno = e ;
diff --git a/src/libs6rc/s6rc_db_load.c b/src/libs6rc/s6rc_db_init.c
index bcc5f2f..075d0c3 100644
--- a/src/libs6rc/s6rc_db_load.c
+++ b/src/libs6rc/s6rc_db_init.c
@@ -24,7 +24,7 @@ static int gethu32 (buffer *b, SHA256Schedule *ctx, uint32_t *n)
return 1 ;
}
-int s6rc_db_load (char const *dir, s6rc_db_t *db, cdb_t *c)
+int s6rc_db_init (s6rc_db_t *db, char const *dir)
{
SHA256Schedule ctx = SHA256_INIT() ;
uint32_t ntotal, ndeps, nproducers, storagelen, nargv ;
@@ -85,7 +85,7 @@ int s6rc_db_load (char const *dir, s6rc_db_t *db, cdb_t *c)
}
memcpy(fn + len, "/resolve.cdb", 13) ;
- if (!cdb_mapfile(fn, c)) goto err1 ;
+ if (!cdb_init(&db->resolve, fn)) goto err1 ;
{
ssize_t r ;
@@ -122,7 +122,7 @@ int s6rc_db_load (char const *dir, s6rc_db_t *db, cdb_t *c)
eproto2:
errno = EPROTO ;
err2:
- cdb_free(c) ;
+ cdb_free(&db->resolve) ;
err1:
{
int e = errno ;
diff --git a/src/libs6rc/s6rc_service_recheck_instance.c b/src/libs6rc/s6rc_service_recheck_instance.c
index b91ea2e..e8cf42c 100644
--- a/src/libs6rc/s6rc_service_recheck_instance.c
+++ b/src/libs6rc/s6rc_service_recheck_instance.c
@@ -7,14 +7,15 @@
#include <s6-rc/db.h>
-int s6rc_service_recheck_instance (s6rc_db_t const *db, cdb_t *c, uint32_t *id, char const **param)
+int s6rc_service_recheck_instance (s6rc_db_t const *db, uint32_t *id, char const **param)
{
uint8_t type ;
uint32_t num ;
s6rc_service_typenum(db->n, *id) ;
if (type < S6RC_STYPE_N) return 0 ;
- else
{
+ cdb_reader reader = CDB_READER_ZERO ;
+ cdb_data data ;
s6rc_common_t *common = s6rc_service_common(db->n, type, num) ;
size_t namelen = strlen(db->storage + common->name) ;
size_t paramlen = strlen(*param) ;
@@ -22,10 +23,11 @@ int s6rc_service_recheck_instance (s6rc_db_t const *db, cdb_t *c, uint32_t *id,
char tmp[namelen + paramlen] ;
memcpy(tmp, db->storage + common->name, namelen) ;
memcpy(tmp + namelen, *param, paramlen) ;
- r = cdb_find(c, tmp, namelen + paramlen) ;
+ r = cdb_find(c, &reader, &data, tmp, namelen + paramlen) ;
if (r <= 0) return r ;
+ if (data.len != 4) return -1 ;
+ uint32_unpack_big(data.s, id) ;
}
- uint32_unpack_big(cdb_datapos(c), id) ;
*param = 0 ;
return 1 ;
}
diff --git a/src/libs6rc/s6rc_service_resolve.c b/src/libs6rc/s6rc_service_resolve.c
index 52caae7..6868e6b 100644
--- a/src/libs6rc/s6rc_service_resolve.c
+++ b/src/libs6rc/s6rc_service_resolve.c
@@ -1,7 +1,6 @@
/* ISC license. */
#include <string.h>
-#include <errno.h>
#include <skalibs/uint32.h>
#include <skalibs/bytestr.h>
@@ -9,22 +8,26 @@
#include <s6-rc/db.h>
-int s6rc_service_resolve (cdb_t *c, char const *s, uint32_t *id, char const **param)
+int s6rc_service_resolve (s6rc_db_t const *db, char const *s, uint32_t *id, char const **param)
{
size_t len = strlen(s) ;
char const *p = 0 ;
- int r = cdb_find(c, s, len) ;
+ cdb_reader reader = CDB_READER_ZERO ;
+ cdb_data data ;
+ int r = cdb_find(c, &reader, &data, s, len) ;
if (r < 0) return r ;
- if (!r)
+ else if (!r)
{
size_t at = byte_chr(s, len, '@') ;
if (at == len) return 0 ;
- if (at == len - 1) return (errno = EINVAL, -1) ;
- r = cdb_find(c, s, at + 1) ;
+ if (at == len - 1) return -1 ;
+ cdb_findstart(&reader) ;
+ r = cdb_find(c, &reader, &data, s, at + 1) ;
if (r <= 0) return r ;
p = s + at + 1 ;
}
- uint32_unpack_big(cdb_datapos(c), id) ;
+ if (data.len != 4) return -1 ;
+ uint32_unpack_big(data.s, id) ;
*param = p ;
return 1 ;
}