diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/include/s6-rc/s6rc-utils.h | 3 | ||||
| -rw-r--r-- | src/libs6rc/deps-lib/s6rc | 2 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_get_major.c | 21 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_read_major.c | 30 | ||||
| -rw-r--r-- | src/s6-rc/s6-rc-compile.c | 16 |
5 files changed, 72 insertions, 0 deletions
diff --git a/src/include/s6-rc/s6rc-utils.h b/src/include/s6-rc/s6rc-utils.h index 15a3b74..e453ade 100644 --- a/src/include/s6-rc/s6rc-utils.h +++ b/src/include/s6-rc/s6rc-utils.h @@ -24,4 +24,7 @@ extern int s6rc_livedir_canon (char const **) ; extern int s6rc_live_state_size (char const *, uint32_t *, uint32_t *) ; extern int s6rc_live_state_read (char const *, unsigned char *, uint32_t) ; +extern uint32_t s6rc_get_major (char const *) ; /* always pass S6RC_VERSION */ +extern uint32_t s6rc_read_major (char const *) ; /* the major a db was compiled with */ + #endif diff --git a/src/libs6rc/deps-lib/s6rc b/src/libs6rc/deps-lib/s6rc index f1a8370..c16ccdf 100644 --- a/src/libs6rc/deps-lib/s6rc +++ b/src/libs6rc/deps-lib/s6rc @@ -4,6 +4,7 @@ s6rc_db_check_revdeps.o s6rc_db_read.o s6rc_db_read_sizes.o s6rc_db_read_uint32.o +s6rc_get_major.o s6rc_graph_closure.o s6rc_graph_clean.o s6rc_live_state_size.o @@ -13,6 +14,7 @@ s6rc_livedir_create.o s6rc_livedir_prefix.o s6rc_livedir_prefixsize.o s6rc_lock.o +s6rc_read_major.o s6rc_read_uint.o s6rc_sanitize_dir.o s6rc_servicedir_internal.o diff --git a/src/libs6rc/s6rc_get_major.c b/src/libs6rc/s6rc_get_major.c new file mode 100644 index 0000000..3bb9fb1 --- /dev/null +++ b/src/libs6rc/s6rc_get_major.c @@ -0,0 +1,21 @@ +/* ISC license. */ + +#include <stdint.h> + +#include <skalibs/uint16.h> + +#include <s6-rc/s6rc-utils.h> + +uint32_t s6rc_get_major (char const *s) +{ + size_t len = 0, l ; + uint32_t acc = 0 ; + uint16_t u ; + l = uint16_scan(s + len, &u) ; + if (!l || s[len + l++] != '.') return 0 ; + len += l ; acc = acc << 16 | u ; + l = uint16_scan(s + len, &u) ; + if (!l || s[len + l++] != '.') return 0 ; + len += l ; acc = acc << 16 | u ; + return acc ; +} diff --git a/src/libs6rc/s6rc_read_major.c b/src/libs6rc/s6rc_read_major.c new file mode 100644 index 0000000..978f29c --- /dev/null +++ b/src/libs6rc/s6rc_read_major.c @@ -0,0 +1,30 @@ +/* ISC license. */ + +#include <string.h> +#include <stdint.h> +#include <errno.h> + +#include <skalibs/uint32.h> +#include <skalibs/djbunix.h> + +#include <s6-rc/s6rc-utils.h> + +#include <skalibs/posixishard.h> + +uint32_t s6rc_read_major (char const *compiled) +{ + size_t clen = strlen(compiled) ; + ssize_t r ; + uint32_t res ; + char tmp[UINT32_FMT] ; + char fn[clen + 7] ; + memcpy(fn, compiled, clen) ; + memcpy(fn + clen, "/major", 7) ; + r = openreadnclose(fn, tmp, UINT32_FMT) ; + if (r == -1) return errno == ENOENT ? 6 : 0 ; /* up to 0.6.x.y doesn't have db/major */ + if (!r) return 0 ; + if (tmp[r] != '\n') return (errno = EPROTO, 0) ; + tmp[r] = 0 ; + if (uint320_scan(tmp, &res) != r) return (errno = EPROTO, 0) ; + return res ; +} diff --git a/src/s6-rc/s6-rc-compile.c b/src/s6-rc/s6-rc-compile.c index 62b9aef..0d4e208 100644 --- a/src/s6-rc/s6-rc-compile.c +++ b/src/s6-rc/s6-rc-compile.c @@ -1573,6 +1573,21 @@ static inline void write_db (char const *compiled, s6rc_db_t const *db) strerr_diefusys(111, "write to ", dbfn) ; } +static inline void write_major (char const *compiled) +{ + uint32_t version = s6rc_get_major(S6RC_VERSION) ; + size_t len ; + char fmt[UINT32_FMT] ; + if (!version) + { + cleanup(compiled) ; + strerr_dief(101, "invalid software version: ", S6RC_VERSION) ; + } + len = uint32_fmt(fmt, version) ; + fmt[len++] = '\n' ; + auto_file(compiled, "major", fmt, len) ; +} + static inline void write_compiled ( char const *compiled, s6rc_db_t const *db, @@ -1585,6 +1600,7 @@ static inline void write_compiled ( { if (verbosity >= 2) strerr_warni("writing compiled information to ", compiled) ; init_compiled(compiled) ; + write_major(compiled) ; write_sizes(compiled, db) ; write_resolve(compiled, db, bundles, nbundles, bdeps) ; stralloc_free(&data) ; |
