aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs6rc/s6rc_db_read_sizes.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs6rc/s6rc_db_read_sizes.c')
-rw-r--r--src/libs6rc/s6rc_db_read_sizes.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/libs6rc/s6rc_db_read_sizes.c b/src/libs6rc/s6rc_db_read_sizes.c
new file mode 100644
index 0000000..4d1537f
--- /dev/null
+++ b/src/libs6rc/s6rc_db_read_sizes.c
@@ -0,0 +1,53 @@
+/* ISC license. */
+
+#include <errno.h>
+#include <skalibs/uint32.h>
+#include <skalibs/allreadwrite.h>
+#include <skalibs/buffer.h>
+#include <skalibs/djbunix.h>
+#include <skalibs/unix-transactional.h>
+#include <s6-rc/s6rc-db.h>
+
+static inline int s6rc_db_read_sizes_buffer (buffer *b, s6rc_db_t *db)
+{
+ uint32 x ;
+ if (!s6rc_db_read_uint32(b, &x)) return 0 ;
+ db->nshort = x ;
+ if (!s6rc_db_read_uint32(b, &x)) return 0 ;
+ db->nlong = x ;
+ if (!s6rc_db_read_uint32(b, &x)) return 0 ;
+ db->stringlen = x ;
+ if (!s6rc_db_read_uint32(b, &x)) return 0 ;
+ db->nargvs = x ;
+ if (!s6rc_db_read_uint32(b, &x)) return 0 ;
+ db->ndeps = x ;
+ return 1 ;
+}
+
+int s6rc_db_read_sizes (int fdcompiled, s6rc_db_t *db)
+{
+ char buf[64] ;
+ buffer b ;
+ int fd = open_readatb(fdcompiled, "n") ;
+ if (fd < 0) return 0 ;
+ buffer_init(&b, &fd_readsv, fd, buf, 64) ;
+ if (!s6rc_db_read_sizes_buffer(&b, db))
+ {
+ fd_close(fd) ;
+ return 0 ;
+ }
+ {
+ char c ;
+ register int r = buffer_get(&b, &c, 1) ;
+ if (r < 0)
+ {
+ r = errno ;
+ fd_close(fd) ;
+ errno = r ;
+ return 0 ;
+ }
+ fd_close(fd) ;
+ if (r) return 0 ;
+ }
+ return 1 ;
+}