aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs6rc/s6rc_db_read_sizes.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_read_sizes.c
downloads6-rc-4b31caa9cdaef67c70bc7fb43963ba68b7bf5bb1.tar.gz
Initial commit
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 ;
+}