aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs6f
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs6f')
-rw-r--r--src/libs6f/deps-exe/s6f1
-rw-r--r--src/libs6f/deps-lib/s6f5
-rw-r--r--src/libs6f/s6f_confdir_open.c38
-rw-r--r--src/libs6f/s6f_lock.c20
-rw-r--r--src/libs6f/s6f_mkdirp.c17
-rw-r--r--src/libs6f/s6f_report_state_change.c64
-rw-r--r--src/libs6f/s6f_user_get_confdirs.c8
7 files changed, 151 insertions, 2 deletions
diff --git a/src/libs6f/deps-exe/s6f b/src/libs6f/deps-exe/s6f
deleted file mode 100644
index e77c0cc..0000000
--- a/src/libs6f/deps-exe/s6f
+++ /dev/null
@@ -1 +0,0 @@
-s6f_user_get_confdirs.o
diff --git a/src/libs6f/deps-lib/s6f b/src/libs6f/deps-lib/s6f
index c792b84..ab20410 100644
--- a/src/libs6f/deps-lib/s6f
+++ b/src/libs6f/deps-lib/s6f
@@ -1,4 +1,9 @@
+s6f_confdir_open.o
+s6f_lock.o
+s6f_mkdirp.o
+s6f_report_state_change.o
s6f_user_get_confdirs.o
${LIBNSSS}
+-ls6rc
-lskarnet
${MAYBEPTHREAD_LIB}
diff --git a/src/libs6f/s6f_confdir_open.c b/src/libs6f/s6f_confdir_open.c
new file mode 100644
index 0000000..8e0838f
--- /dev/null
+++ b/src/libs6f/s6f_confdir_open.c
@@ -0,0 +1,38 @@
+/* ISC license. */
+
+#include <skalibs/bsdsnowflake.h>
+
+#include <unistd.h>
+#include <errno.h>
+
+#include <skalibs/stat.h>
+#include <skalibs/strerr.h>
+#include <skalibs/djbunix.h>
+#include <skalibs/unix-transactional.h>
+
+#include "s6f.h"
+
+int s6f_confdir_open (char const *s, int flagcreate)
+{
+ struct stat st ;
+ int fd = open_read(s) ;
+ if (fd == -1)
+ {
+ if (errno != ENOENT || !flagcreate)
+ strerr_diefu3sys(111, "open ", s, " for reading") ;
+ if (flagcreate)
+ {
+ s6f_mkdirp(s, 02755) ;
+ fd = open_read(s) ;
+ if (fd == -1)
+ strerr_diefu3sys(111, "open ", s, " for reading") ;
+ }
+ }
+ if (fstat(fd, &st) == -1)
+ strerr_diefu2sys(111, "fstat ", s) ;
+ if (!S_ISDIR(st.st_mode))
+ strerr_dief2x(111, s, " is not a directory") ;
+ if (access_at(fd, ".", R_OK|W_OK, 1) == -1)
+ strerr_diefu2sys(111, "access ", s) ;
+ return fd ;
+}
diff --git a/src/libs6f/s6f_lock.c b/src/libs6f/s6f_lock.c
new file mode 100644
index 0000000..1ef1718
--- /dev/null
+++ b/src/libs6f/s6f_lock.c
@@ -0,0 +1,20 @@
+/* ISC license. */
+
+#include <string.h>
+
+#include <skalibs/strerr.h>
+#include <skalibs/djbunix.h>
+#include <skalibs/unix-transactional.h>
+
+#include "s6f.h"
+
+int s6f_lock (char const *stmpdir, int w)
+{
+ int fdstmp = s6f_confdir_open(stmpdir, 1) ;
+ int fd = openc_truncat(fdstmp, "lock") ;
+ if (fd == -1) strerr_diefu4sys(111, "open ", stmpdir, "/lock", " for writing") ;
+ fd_close(fdstmp) ;
+ if (fd_lock(fd, w, 0) < 1)
+ strerr_diefu3sys(111, "lock ", stmpdir, "/lock") ;
+ return fd ;
+}
diff --git a/src/libs6f/s6f_mkdirp.c b/src/libs6f/s6f_mkdirp.c
new file mode 100644
index 0000000..e8b6be8
--- /dev/null
+++ b/src/libs6f/s6f_mkdirp.c
@@ -0,0 +1,17 @@
+/* ISC license. */
+
+#include <string.h>
+
+#include <skalibs/posixplz.h>
+#include <skalibs/strerr.h>
+
+#include "s6f.h"
+
+void s6f_mkdirp (char const *s, mode_t mode)
+{
+ size_t len = strlen(s) ;
+ char tmp[len + 1] ;
+ memcpy(tmp, s, len + 1) ;
+ if (mkdirp(tmp, mode) == -1)
+ strerr_diefu2sys(111, "mkdir ", tmp) ;
+}
diff --git a/src/libs6f/s6f_report_state_change.c b/src/libs6f/s6f_report_state_change.c
new file mode 100644
index 0000000..70d2cd1
--- /dev/null
+++ b/src/libs6f/s6f_report_state_change.c
@@ -0,0 +1,64 @@
+/* ISC license. */
+
+#include <string.h>
+
+#include <skalibs/prog.h>
+#include <skalibs/strerr.h>
+#include <skalibs/djbunix.h>
+
+#include <s6-rc/s6rc-db.h>
+
+#include "s6f.h"
+
+void s6f_report_state_change (uint32_t n, unsigned char const *oldstate, unsigned char const *newstate, char const *compiled)
+{
+ if (!memcmp(oldstate, newstate, n))
+ {
+ if (buffer_puts(buffer_1, PROG) < 0
+ || buffer_puts(buffer_1, ": info: ") < 0
+ || buffer_putsflush(buffer_1, "the global state has not changed.\n") < 0)
+ strerr_diefu1sys(111, "write to stdout") ;
+ }
+ else
+ {
+ s6rc_db_t db ;
+ int fd = openc_readb(compiled) ;
+ if (fd == -1) strerr_diefu2sys(111, "open ", compiled) ;
+ if (!s6rc_db_read_sizes(fd, &db))
+ strerr_diefu2sys(111, "read db sizes for ", compiled) ;
+
+ {
+ s6rc_service_t serviceblob[n] ;
+ char const *argvblob[db.nargvs] ;
+ uint32_t depsblob[db.ndeps << 1] ;
+ uint32_t producersblob[db.nproducers] ;
+ int r ;
+ char stringblob[db.stringlen] ;
+ db.services = serviceblob ;
+ db.argvs = argvblob ;
+ db.deps = depsblob ;
+ db.producers = producersblob ;
+ db.string = stringblob ;
+
+ r = s6rc_db_read(fd, &db) ;
+ if (r < 0) strerr_diefu3sys(111, "read ", compiled, "/db") ;
+ if (!r) strerr_dief3x(4, "invalid service database in ", compiled, "/db") ;
+
+ if (buffer_puts(buffer_1, PROG) < 0
+ || buffer_puts(buffer_1, ": info: the following atomic services have changed state:\n") < 0)
+ strerr_diefu1sys(111, "write to stdout") ;
+ for (uint32_t i = 0 ; i < n ; i++)
+ {
+ if ((oldstate[i] & 1) != (newstate[i] & 1))
+ {
+ if (buffer_puts(buffer_1, db.string + db.services[i].name) < 0
+ || buffer_put(buffer_1, "\n", 1) < 1)
+ strerr_diefu1sys(111, "write to stdout") ;
+ }
+ }
+ if (!buffer_flush(buffer_1))
+ strerr_diefu1sys(111, "write to stdout") ;
+ }
+ fd_close(fd) ;
+ }
+}
diff --git a/src/libs6f/s6f_user_get_confdirs.c b/src/libs6f/s6f_user_get_confdirs.c
index badbea0..b062650 100644
--- a/src/libs6f/s6f_user_get_confdirs.c
+++ b/src/libs6f/s6f_user_get_confdirs.c
@@ -16,7 +16,7 @@
void s6f_user_get_confdirs (s6f_confdirs *dirs, stralloc *storage)
{
- size_t scanpos, livepos, repopos, bootpos ;
+ size_t scanpos, livepos, repopos, bootpos, stmppos ;
size_t homelen = 0 ;
struct passwd *pw = 0 ;
char const *home = 0 ;
@@ -71,10 +71,16 @@ void s6f_user_get_confdirs (s6f_confdirs *dirs, stralloc *storage)
|| !stralloc_cats(storage, "/s6-rc")
|| !stralloc_0(storage)) dienomem() ;
+ stmppos = storage->len ;
+ if (!stralloc_cats(storage, runtime)
+ || !stralloc_cats(storage, "/s6-frontend")
+ || !stralloc_0(storage)) dienomem() ;
+
/* Don't add to storage past this point */
dirs->scan = storage->s + scanpos ;
dirs->live = storage->s + livepos ;
dirs->repo = storage->s + repopos ;
dirs->boot = storage->s + bootpos ;
+ dirs->stmp = storage->s + stmppos ;
}