about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2023-02-11 08:13:14 +0000
committerLaurent Bercot <ska@appnovation.com>2023-02-11 08:13:14 +0000
commit2f8984613e17f9e5971ec338240b0bb6d2dd1cc6 (patch)
tree4061a64dc5ee8c415ca249ec1852cfc666e1468b
parent3caba3fd8f3825544c065ec62e4298c6edc76b28 (diff)
downloads6-linux-utils-2f8984613e17f9e5971ec338240b0bb6d2dd1cc6.tar.gz
s6-linux-utils-2f8984613e17f9e5971ec338240b0bb6d2dd1cc6.tar.xz
s6-linux-utils-2f8984613e17f9e5971ec338240b0bb6d2dd1cc6.zip
Code refactor; only s6-ps has remaining globals now
Signed-off-by: Laurent Bercot <ska@appnovation.com>
-rw-r--r--.gitignore5
-rw-r--r--package/deps.mak67
-rw-r--r--package/targets.mak1
-rw-r--r--src/include-local/mount-constants.h (renamed from src/minutils/mount-constants.h)37
-rw-r--r--src/include-local/s6-ps.h (renamed from src/minutils/s6-ps.h)10
-rw-r--r--src/libps/deps-lib/s6ps (renamed from src/minutils/deps-exe/s6-ps)7
-rw-r--r--src/libps/s6ps_grcache.c (renamed from src/minutils/s6ps_grcache.c)2
-rw-r--r--src/libps/s6ps_otree.c (renamed from src/minutils/s6ps_otree.c)2
-rw-r--r--src/libps/s6ps_pfield.c (renamed from src/minutils/s6ps_pfield.c)3
-rw-r--r--src/libps/s6ps_pwcache.c (renamed from src/minutils/s6ps_pwcache.c)1
-rw-r--r--src/libps/s6ps_statparse.c (renamed from src/minutils/s6ps_statparse.c)8
-rw-r--r--src/libps/s6ps_ttycache.c (renamed from src/minutils/s6ps_ttycache.c)2
-rw-r--r--src/libps/s6ps_wchan.c (renamed from src/minutils/s6ps_wchan.c)2
-rw-r--r--src/minutils/s6-mount.c149
-rw-r--r--src/multicall/deps-exe/s6-linux-utils5
-rw-r--r--src/s6-linux-utils/deps-exe/rngseed (renamed from src/minutils/deps-exe/rngseed)0
-rw-r--r--src/s6-linux-utils/deps-exe/s6-chroot (renamed from src/minutils/deps-exe/s6-chroot)0
-rw-r--r--src/s6-linux-utils/deps-exe/s6-freeramdisk (renamed from src/minutils/deps-exe/s6-freeramdisk)0
-rw-r--r--src/s6-linux-utils/deps-exe/s6-hostname (renamed from src/minutils/deps-exe/s6-hostname)0
-rw-r--r--src/s6-linux-utils/deps-exe/s6-logwatch (renamed from src/minutils/deps-exe/s6-logwatch)0
-rw-r--r--src/s6-linux-utils/deps-exe/s6-mount (renamed from src/minutils/deps-exe/s6-mount)0
-rw-r--r--src/s6-linux-utils/deps-exe/s6-pivotchroot (renamed from src/minutils/deps-exe/s6-pivotchroot)0
-rw-r--r--src/s6-linux-utils/deps-exe/s6-ps4
-rw-r--r--src/s6-linux-utils/deps-exe/s6-swapoff (renamed from src/minutils/deps-exe/s6-swapoff)0
-rw-r--r--src/s6-linux-utils/deps-exe/s6-swapon (renamed from src/minutils/deps-exe/s6-swapon)0
-rw-r--r--src/s6-linux-utils/deps-exe/s6-umount (renamed from src/minutils/deps-exe/s6-umount)0
-rw-r--r--src/s6-linux-utils/rngseed.c (renamed from src/minutils/rngseed.c)22
-rw-r--r--src/s6-linux-utils/s6-chroot.c (renamed from src/minutils/s6-chroot.c)0
-rw-r--r--src/s6-linux-utils/s6-freeramdisk.c (renamed from src/minutils/s6-freeramdisk.c)1
-rw-r--r--src/s6-linux-utils/s6-hostname.c (renamed from src/minutils/s6-hostname.c)11
-rw-r--r--src/s6-linux-utils/s6-logwatch.c (renamed from src/minutils/s6-logwatch.c)69
-rw-r--r--src/s6-linux-utils/s6-mount.c166
-rw-r--r--src/s6-linux-utils/s6-pivotchroot.c (renamed from src/minutils/s6-pivotchroot.c)0
-rw-r--r--src/s6-linux-utils/s6-ps.c (renamed from src/minutils/s6-ps.c)1
-rw-r--r--src/s6-linux-utils/s6-swapoff.c (renamed from src/minutils/s6-swapoff.c)9
-rw-r--r--src/s6-linux-utils/s6-swapon.c (renamed from src/minutils/s6-swapon.c)3
-rw-r--r--src/s6-linux-utils/s6-umount.c (renamed from src/minutils/s6-umount.c)15
37 files changed, 319 insertions, 283 deletions
diff --git a/.gitignore b/.gitignore
index 43ea92b..4ca416f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,8 +1,7 @@
 *.o
-*.a
+*.a.xyzzy
 *.lo
-*.so
-*.so.*
+*.so.xyzzy
 /config.mak
 /src/include/s6-linux-utils/config.h
 /rngseed
diff --git a/package/deps.mak b/package/deps.mak
index 3150147..0dac63f 100644
--- a/package/deps.mak
+++ b/package/deps.mak
@@ -2,44 +2,53 @@
 # This file has been generated by tools/gen-deps.sh
 #
 
-src/minutils/rngseed.o src/minutils/rngseed.lo: src/minutils/rngseed.c src/include/s6-linux-utils/config.h
-src/minutils/s6-chroot.o src/minutils/s6-chroot.lo: src/minutils/s6-chroot.c
-src/minutils/s6-freeramdisk.o src/minutils/s6-freeramdisk.lo: src/minutils/s6-freeramdisk.c
-src/minutils/s6-hostname.o src/minutils/s6-hostname.lo: src/minutils/s6-hostname.c
-src/minutils/s6-logwatch.o src/minutils/s6-logwatch.lo: src/minutils/s6-logwatch.c
-src/minutils/s6-mount.o src/minutils/s6-mount.lo: src/minutils/s6-mount.c src/minutils/mount-constants.h
-src/minutils/s6-pivotchroot.o src/minutils/s6-pivotchroot.lo: src/minutils/s6-pivotchroot.c
-src/minutils/s6-ps.o src/minutils/s6-ps.lo: src/minutils/s6-ps.c src/minutils/s6-ps.h
-src/minutils/s6-swapoff.o src/minutils/s6-swapoff.lo: src/minutils/s6-swapoff.c
-src/minutils/s6-swapon.o src/minutils/s6-swapon.lo: src/minutils/s6-swapon.c
-src/minutils/s6-umount.o src/minutils/s6-umount.lo: src/minutils/s6-umount.c
-src/minutils/s6ps_grcache.o src/minutils/s6ps_grcache.lo: src/minutils/s6ps_grcache.c src/minutils/s6-ps.h
-src/minutils/s6ps_otree.o src/minutils/s6ps_otree.lo: src/minutils/s6ps_otree.c src/minutils/s6-ps.h
-src/minutils/s6ps_pfield.o src/minutils/s6ps_pfield.lo: src/minutils/s6ps_pfield.c src/minutils/s6-ps.h
-src/minutils/s6ps_pwcache.o src/minutils/s6ps_pwcache.lo: src/minutils/s6ps_pwcache.c src/minutils/s6-ps.h
-src/minutils/s6ps_statparse.o src/minutils/s6ps_statparse.lo: src/minutils/s6ps_statparse.c src/minutils/s6-ps.h
-src/minutils/s6ps_ttycache.o src/minutils/s6ps_ttycache.lo: src/minutils/s6ps_ttycache.c src/minutils/s6-ps.h
-src/minutils/s6ps_wchan.o src/minutils/s6ps_wchan.lo: src/minutils/s6ps_wchan.c src/minutils/s6-ps.h
+src/libps/s6ps_grcache.o src/libps/s6ps_grcache.lo: src/libps/s6ps_grcache.c src/include-local/s6-ps.h
+src/libps/s6ps_otree.o src/libps/s6ps_otree.lo: src/libps/s6ps_otree.c src/include-local/s6-ps.h
+src/libps/s6ps_pfield.o src/libps/s6ps_pfield.lo: src/libps/s6ps_pfield.c src/include-local/s6-ps.h
+src/libps/s6ps_pwcache.o src/libps/s6ps_pwcache.lo: src/libps/s6ps_pwcache.c src/include-local/s6-ps.h
+src/libps/s6ps_statparse.o src/libps/s6ps_statparse.lo: src/libps/s6ps_statparse.c src/include-local/s6-ps.h
+src/libps/s6ps_ttycache.o src/libps/s6ps_ttycache.lo: src/libps/s6ps_ttycache.c src/include-local/s6-ps.h
+src/libps/s6ps_wchan.o src/libps/s6ps_wchan.lo: src/libps/s6ps_wchan.c src/include-local/s6-ps.h
+src/s6-linux-utils/rngseed.o src/s6-linux-utils/rngseed.lo: src/s6-linux-utils/rngseed.c src/include/s6-linux-utils/config.h
+src/s6-linux-utils/s6-chroot.o src/s6-linux-utils/s6-chroot.lo: src/s6-linux-utils/s6-chroot.c
+src/s6-linux-utils/s6-freeramdisk.o src/s6-linux-utils/s6-freeramdisk.lo: src/s6-linux-utils/s6-freeramdisk.c
+src/s6-linux-utils/s6-hostname.o src/s6-linux-utils/s6-hostname.lo: src/s6-linux-utils/s6-hostname.c
+src/s6-linux-utils/s6-logwatch.o src/s6-linux-utils/s6-logwatch.lo: src/s6-linux-utils/s6-logwatch.c
+src/s6-linux-utils/s6-mount.o src/s6-linux-utils/s6-mount.lo: src/s6-linux-utils/s6-mount.c src/include-local/mount-constants.h
+src/s6-linux-utils/s6-pivotchroot.o src/s6-linux-utils/s6-pivotchroot.lo: src/s6-linux-utils/s6-pivotchroot.c
+src/s6-linux-utils/s6-ps.o src/s6-linux-utils/s6-ps.lo: src/s6-linux-utils/s6-ps.c src/include-local/s6-ps.h
+src/s6-linux-utils/s6-swapoff.o src/s6-linux-utils/s6-swapoff.lo: src/s6-linux-utils/s6-swapoff.c
+src/s6-linux-utils/s6-swapon.o src/s6-linux-utils/s6-swapon.lo: src/s6-linux-utils/s6-swapon.c
+src/s6-linux-utils/s6-umount.o src/s6-linux-utils/s6-umount.lo: src/s6-linux-utils/s6-umount.c
 
+ifeq ($(strip $(STATIC_LIBS_ARE_PIC)),)
+libs6ps.a.xyzzy: src/libps/s6ps_grcache.o src/libps/s6ps_otree.o src/libps/s6ps_pfield.o src/libps/s6ps_pwcache.o src/libps/s6ps_statparse.o src/libps/s6ps_ttycache.o src/libps/s6ps_wchan.o
+else
+libs6ps.a.xyzzy: src/libps/s6ps_grcache.lo src/libps/s6ps_otree.lo src/libps/s6ps_pfield.lo src/libps/s6ps_pwcache.lo src/libps/s6ps_statparse.lo src/libps/s6ps_ttycache.lo src/libps/s6ps_wchan.lo
+endif
+libs6ps.so.xyzzy: EXTRA_LIBS :=
+libs6ps.so.xyzzy: src/libps/s6ps_grcache.lo src/libps/s6ps_otree.lo src/libps/s6ps_pfield.lo src/libps/s6ps_pwcache.lo src/libps/s6ps_statparse.lo src/libps/s6ps_ttycache.lo src/libps/s6ps_wchan.lo
+s6-linux-utils: EXTRA_LIBS := -lskarnet ${SYSCLOCK_LIB} ${MAYBEPTHREAD_LIB}
+s6-linux-utils: src/multicall/s6-linux-utils.o libs6ps.a.xyzzy ${LIBNSSS}
 rngseed: EXTRA_LIBS := -lskarnet ${SYSCLOCK_LIB}
-rngseed: src/minutils/rngseed.o
+rngseed: src/s6-linux-utils/rngseed.o
 s6-chroot: EXTRA_LIBS := -lskarnet
-s6-chroot: src/minutils/s6-chroot.o
+s6-chroot: src/s6-linux-utils/s6-chroot.o
 s6-freeramdisk: EXTRA_LIBS := -lskarnet
-s6-freeramdisk: src/minutils/s6-freeramdisk.o
+s6-freeramdisk: src/s6-linux-utils/s6-freeramdisk.o
 s6-hostname: EXTRA_LIBS := -lskarnet
-s6-hostname: src/minutils/s6-hostname.o
+s6-hostname: src/s6-linux-utils/s6-hostname.o
 s6-logwatch: EXTRA_LIBS := -lskarnet
-s6-logwatch: src/minutils/s6-logwatch.o
+s6-logwatch: src/s6-linux-utils/s6-logwatch.o
 s6-mount: EXTRA_LIBS := -lskarnet
-s6-mount: src/minutils/s6-mount.o
+s6-mount: src/s6-linux-utils/s6-mount.o
 s6-pivotchroot: EXTRA_LIBS := -lskarnet
-s6-pivotchroot: src/minutils/s6-pivotchroot.o
+s6-pivotchroot: src/s6-linux-utils/s6-pivotchroot.o
 s6-ps: EXTRA_LIBS := -lskarnet ${MAYBEPTHREAD_LIB}
-s6-ps: src/minutils/s6-ps.o src/minutils/s6ps_statparse.o src/minutils/s6ps_otree.o src/minutils/s6ps_pfield.o src/minutils/s6ps_pwcache.o src/minutils/s6ps_grcache.o src/minutils/s6ps_ttycache.o src/minutils/s6ps_wchan.o ${LIBNSSS}
+s6-ps: src/s6-linux-utils/s6-ps.o libs6ps.a.xyzzy ${LIBNSSS}
 s6-swapoff: EXTRA_LIBS := -lskarnet
-s6-swapoff: src/minutils/s6-swapoff.o
+s6-swapoff: src/s6-linux-utils/s6-swapoff.o
 s6-swapon: EXTRA_LIBS := -lskarnet
-s6-swapon: src/minutils/s6-swapon.o
+s6-swapon: src/s6-linux-utils/s6-swapon.o
 s6-umount: EXTRA_LIBS := -lskarnet
-s6-umount: src/minutils/s6-umount.o
+s6-umount: src/s6-linux-utils/s6-umount.o
diff --git a/package/targets.mak b/package/targets.mak
index f42cb5a..fb7af4c 100644
--- a/package/targets.mak
+++ b/package/targets.mak
@@ -12,4 +12,3 @@ s6-swapon \
 s6-umount
 
 LIBEXEC_TARGETS :=
-
diff --git a/src/minutils/mount-constants.h b/src/include-local/mount-constants.h
index 1e6f3c0..3b30035 100644
--- a/src/minutils/mount-constants.h
+++ b/src/include-local/mount-constants.h
@@ -3,7 +3,7 @@
 #ifndef MOUNT_CONSTANTS_H
 #define MOUNT_CONSTANTS_H
 
-/* taken from util-linux-ng */
+/* taken from util-linux */
 
 #ifndef MS_RDONLY
 #define MS_RDONLY	 1	/* Mount read-only */
@@ -29,6 +29,9 @@
 #ifndef MS_DIRSYNC
 #define MS_DIRSYNC	128	/* Directory modifications are synchronous */
 #endif
+#ifndef MS_NOSYMFOLLOW
+#define MS_NOSYMFOLLOW	256	/* Don't follow symlinks */
+#endif
 #ifndef MS_NOATIME
 #define MS_NOATIME	0x400	/* 1024: Do not update access times. */
 #endif
@@ -44,38 +47,32 @@
 #ifndef MS_REC
 #define MS_REC		0x4000	/* 16384: Recursive loopback */
 #endif
-#ifndef MS_VERBOSE
-#define MS_VERBOSE	0x8000	/* 32768 */
-#endif
-#ifndef MS_RELATIME
-#define MS_RELATIME	0x200000 /* 200000: Update access times relative to mtime/ctime */
+#ifndef MS_SILENT
+#define MS_SILENT	0x8000	/* 32768: Don't emit certain kernel messages */
 #endif
 #ifndef MS_UNBINDABLE
-#define MS_UNBINDABLE	(1<<17)	/* 131072 unbindable */
+#define MS_UNBINDABLE	(1<<17)	/* 131072: Make unbindable */
 #endif
 #ifndef MS_PRIVATE
-#define MS_PRIVATE	(1<<18)	/* 262144 Private */
+#define MS_PRIVATE	(1<<18)	/* 262144: Make private */
 #endif
 #ifndef MS_SLAVE
-#define MS_SLAVE	(1<<19)	/* 524288 Slave */
+#define MS_SLAVE	(1<<19)	/* 524288: Make slave */
 #endif
 #ifndef MS_SHARED
-#define MS_SHARED	(1<<20)	/* 1048576 Shared */
+#define MS_SHARED	(1<<20)	/* 1048576: Make shared */
+#endif
+#ifndef MS_RELATIME
+#define MS_RELATIME	(1<<21) /* 2097152: Update atime relative to mtime/ctime */
 #endif
 #ifndef MS_I_VERSION
-#define MS_I_VERSION	(1<<23)	/* update inode I_version field */
+#define MS_I_VERSION	(1<<23)	/* Update the inode I_version field */
 #endif
 #ifndef MS_STRICTATIME
-#define MS_STRICTATIME	(1<<24) /* strict atime semantics */
-#endif
-/*
- * Magic mount flag number. Had to be or-ed to the flag values.
- */
-#ifndef MS_MGC_VAL
-#define MS_MGC_VAL 0xC0ED0000	/* magic flag number to indicate "new" flags */
+#define MS_STRICTATIME	(1<<24) /* Always perform atime updates */
 #endif
-#ifndef MS_MGC_MSK
-#define MS_MGC_MSK 0xffff0000	/* magic flag number mask */
+#ifndef MS_LAZYTIME
+#define MS_LAZYTIME     (1<<25) /* Update the on-disk [acm]times lazily */
 #endif
 
 #endif
diff --git a/src/minutils/s6-ps.h b/src/include-local/s6-ps.h
index eb56dc1..7c963f1 100644
--- a/src/minutils/s6-ps.h
+++ b/src/include-local/s6-ps.h
@@ -1,10 +1,11 @@
 /* ISC license. */
 
-#ifndef _S6PS_H_
-#define _S6PS_H_
+#ifndef S6PS_H
+#define S6PS_H
 
 #include <sys/types.h>
 #include <stdint.h>
+
 #include <skalibs/uint64.h>
 #include <skalibs/stralloc.h>
 #include <skalibs/tai.h>
@@ -19,9 +20,6 @@ struct dius_s
 } ;
 #define DIUS_ZERO { .left = 0, .right = 0 }
 
-
- /* pfield: the output fields */
-
 typedef enum pfield_e pfield_t, *pfield_t_ref ;
 enum pfield_e
 {
@@ -64,8 +62,6 @@ enum pfield_e
 extern char const *const *s6ps_opttable ;
 extern char const *const *s6ps_fieldheaders ;
 
- /* pscan: the main structure */
-
 typedef struct pscan_s pscan_t, *pscan_t_ref ;
 struct pscan_s
 {
diff --git a/src/minutils/deps-exe/s6-ps b/src/libps/deps-lib/s6ps
index 1f0adc5..0f078a6 100644
--- a/src/minutils/deps-exe/s6-ps
+++ b/src/libps/deps-lib/s6ps
@@ -1,10 +1,7 @@
-s6ps_statparse.o
+s6ps_grcache.o
 s6ps_otree.o
 s6ps_pfield.o
 s6ps_pwcache.o
-s6ps_grcache.o
+s6ps_statparse.o
 s6ps_ttycache.o
 s6ps_wchan.o
-${LIBNSSS}
--lskarnet
-${MAYBEPTHREAD_LIB}
diff --git a/src/minutils/s6ps_grcache.c b/src/libps/s6ps_grcache.c
index ba62098..189f5ae 100644
--- a/src/minutils/s6ps_grcache.c
+++ b/src/libps/s6ps_grcache.c
@@ -1,6 +1,7 @@
 /* ISC license. */
 
 #include <stdint.h>
+
 #include <grp.h>
 #include <errno.h>
 #include <skalibs/types.h>
@@ -8,6 +9,7 @@
 #include <skalibs/genalloc.h>
 #include <skalibs/skamisc.h>
 #include <skalibs/avltree.h>
+
 #include "s6-ps.h"
 
 static avltree grcache_tree = AVLTREE_ZERO ;
diff --git a/src/minutils/s6ps_otree.c b/src/libps/s6ps_otree.c
index f7952ab..6ba8589 100644
--- a/src/minutils/s6ps_otree.c
+++ b/src/libps/s6ps_otree.c
@@ -1,7 +1,9 @@
 /* ISC license. */
 
 #include <errno.h>
+
 #include <skalibs/avltreen.h>
+
 #include "s6-ps.h"
 
 typedef struct ptreeiter_s ptreeiter_t, *ptreeiter_t_ref ;
diff --git a/src/minutils/s6ps_pfield.c b/src/libps/s6ps_pfield.c
index 0280186..9e53e50 100644
--- a/src/minutils/s6ps_pfield.c
+++ b/src/libps/s6ps_pfield.c
@@ -5,12 +5,14 @@
 #include <unistd.h>
 #include <time.h>
 #include <sys/sysinfo.h>
+
 #include <skalibs/uint64.h>
 #include <skalibs/types.h>
 #include <skalibs/strerr.h>
 #include <skalibs/tai.h>
 #include <skalibs/djbtime.h>
 #include <skalibs/stralloc.h>
+
 #include "s6-ps.h"
 
 static char const *const fieldheaders[PFIELD_PHAIL] =
@@ -492,7 +494,6 @@ static int fmt_pcpu (pscan_t *p, size_t *pos, size_t *len)
   return percent(&p->data, 10000 * (p->utime + p->stime) / gettotalj(p->start), pos, len) ;
 }
 
-
 static int fmt_ttime (pscan_t *p, size_t *pos, size_t *len) 
 {
   return fmt_jiffies(p, pos, len, p->utime + p->stime) ;
diff --git a/src/minutils/s6ps_pwcache.c b/src/libps/s6ps_pwcache.c
index 283a393..ce4caa8 100644
--- a/src/minutils/s6ps_pwcache.c
+++ b/src/libps/s6ps_pwcache.c
@@ -4,6 +4,7 @@
 #include <stdint.h>
 #include <pwd.h>
 #include <errno.h>
+
 #include <skalibs/types.h>
 #include <skalibs/stralloc.h>
 #include <skalibs/genalloc.h>
diff --git a/src/minutils/s6ps_statparse.c b/src/libps/s6ps_statparse.c
index fe4c355..ea46d70 100644
--- a/src/minutils/s6ps_statparse.c
+++ b/src/libps/s6ps_statparse.c
@@ -3,10 +3,12 @@
 #include <stdint.h>
 #include <sys/types.h>
 #include <errno.h>
+
 #include <skalibs/uint64.h>
 #include <skalibs/types.h>
 #include <skalibs/stralloc.h>
 #include <skalibs/tai.h>
+
 #include "s6-ps.h"
 
 
@@ -17,8 +19,8 @@
 
 #define STATVARS 49
 
-typedef size_t sca$1_func (char const *, void *) ;
-typedef sca$1_func *sca$1_func_ref ;
+typedef size_t pscan_func (char const *, void *) ;
+typedef pscan_func *pscan_func_ref ;
 
 static size_t f64 (char const *s, void *u64)
 {
@@ -48,7 +50,7 @@ DEFUNS(fint, int)
 DEFUNS(fpid, pid_t)
 DEFUNU(fdev, dev_t)
 
-static sca$1_func_ref scanfuncs[STATVARS] =
+static pscan_func_ref scanfuncs[STATVARS] =
 {
   &fpid, /* ppid */
   &fpid, /* pgrp */
diff --git a/src/minutils/s6ps_ttycache.c b/src/libps/s6ps_ttycache.c
index 0608967..27282e7 100644
--- a/src/minutils/s6ps_ttycache.c
+++ b/src/libps/s6ps_ttycache.c
@@ -5,6 +5,7 @@
 #include <sys/stat.h>
 #include <sys/sysmacros.h>
 #include <errno.h>
+
 #include <skalibs/types.h>
 #include <skalibs/allreadwrite.h>
 #include <skalibs/buffer.h>
@@ -13,6 +14,7 @@
 #include <skalibs/djbunix.h>
 #include <skalibs/skamisc.h>
 #include <skalibs/avltree.h>
+
 #include "s6-ps.h"
 
 static avltree ttycache_tree = AVLTREE_ZERO ;
diff --git a/src/minutils/s6ps_wchan.c b/src/libps/s6ps_wchan.c
index 209e1ef..9261693 100644
--- a/src/minutils/s6ps_wchan.c
+++ b/src/libps/s6ps_wchan.c
@@ -2,10 +2,12 @@
 
 #include <string.h>
 #include <sys/utsname.h>
+
 #include <skalibs/uint64.h>
 #include <skalibs/stralloc.h>
 #include <skalibs/genalloc.h>
 #include <skalibs/djbunix.h>
+
 #include "s6-ps.h"
 
 static stralloc sysmap = STRALLOC_ZERO ;
diff --git a/src/minutils/s6-mount.c b/src/minutils/s6-mount.c
deleted file mode 100644
index 428bda4..0000000
--- a/src/minutils/s6-mount.c
+++ /dev/null
@@ -1,149 +0,0 @@
-/* ISC license. */
-
-#include <string.h>
-#include <errno.h>
-#include <sys/mount.h>
-#include <mntent.h>
-#include <stdio.h>
-#include <skalibs/bytestr.h>
-#include <skalibs/sgetopt.h>
-#include <skalibs/strerr.h>
-#include <skalibs/stralloc.h>
-#include <skalibs/djbunix.h>
-#include "mount-constants.h"
-
-#define USAGE "s6-mount -a [ -z fstab ] | s6-mount [ -n ] [ -t type ] [ -o option[,option...] ]... device mountpoint"
-#define BUFSIZE 4096
-
-#define SWITCH(opt) do
-#define HCTIWS(opt) while(0) ;
-#define CASE(s) if (n == sizeof(s) - 1 && !strncmp(opt, (s), n))
-
-static void scanopt (stralloc *data, unsigned long *flags, char const *opt)
-{
-  for (;;)
-  {
-    unsigned int n = str_chr(opt, ',') ;
-    SWITCH(opt)
-    {
-      CASE("defaults") { *flags = MS_MGC_VAL ; break ; }
-      CASE("ro") { *flags |= MS_RDONLY ; break ; }
-      CASE("rw") { *flags &= ~MS_RDONLY ; break ; }
-      CASE("remount") { *flags |= MS_REMOUNT ; break ; }
-      CASE("sync") { *flags |= MS_SYNCHRONOUS ; break ; }
-      CASE("async") { *flags &= ~MS_SYNCHRONOUS ; break ; }
-      CASE("nodev") { *flags |= MS_NODEV ; break ; }
-      CASE("dev") { *flags &= ~MS_NODEV ; break ; }
-      CASE("noexec") { *flags |= MS_NOEXEC ; break ; }
-      CASE("exec") { *flags &= ~MS_NOEXEC ; break ; }
-      CASE("nosuid") { *flags |= MS_NOSUID ; break ; }
-      CASE("suid") { *flags &= ~MS_NOSUID ; break ; }
-      CASE("noatime") { *flags |= MS_NOATIME ; break ; }
-      CASE("atime") { *flags &= ~MS_NOATIME ; break ; }
-      CASE("nodiratime") { *flags |= MS_NODIRATIME ; break ; }
-      CASE("diratime") { *flags &= ~MS_NODIRATIME ; break ; }
-      CASE("strictatime") { *flags |= MS_STRICTATIME ; break ; }
-      CASE("nostrictatime") { *flags &= ~MS_STRICTATIME ; break ; }
-      CASE("relatime") { *flags |= MS_RELATIME ; break ; }
-      CASE("norelatime") { *flags &= ~MS_RELATIME ; break ; }
-      CASE("bind") { *flags |= MS_BIND ; break ; }
-      CASE("nobind") { *flags &= ~MS_BIND ; break ; }
-      CASE("move") { *flags |= MS_MOVE ; break ; }
-      CASE("nomove") { *flags &= ~MS_MOVE ; break ; }
-      CASE("dirsync") { *flags |= MS_DIRSYNC ; break ; }
-      CASE("nodirsync") { *flags &= ~MS_DIRSYNC ; break ; }
-      CASE("mandlock") { *flags |= MS_MANDLOCK ; break ; }
-      CASE("nomandlock") { *flags &= ~MS_MANDLOCK ; break ; }
-      CASE("silent") { *flags |= MS_SILENT ; break ; }
-      CASE("nosilent") { *flags &= ~MS_SILENT ; break ; }
-#ifdef MS_LAZYTIME
-      CASE("lazytime") { *flags |= MS_LAZYTIME ; break ; }
-      CASE("nolazytime") { *flags &= ~MS_LAZYTIME ; break ; }
-#endif
-
-      CASE("shared") { *flags &= ~(MS_PRIVATE | MS_SLAVE | MS_UNBINDABLE) ; *flags |= MS_SHARED ; break ; }
-      CASE("private") { *flags &= ~(MS_SHARED | MS_SLAVE | MS_UNBINDABLE) ; *flags |= MS_PRIVATE ; break ; }
-      CASE("slave") { *flags &= ~(MS_SHARED | MS_PRIVATE | MS_UNBINDABLE) ; *flags |= MS_SLAVE ; break ; }
-      CASE("unbindable") { *flags &= ~(MS_SHARED | MS_PRIVATE | MS_SLAVE) ; *flags |= MS_UNBINDABLE ; break ; }
-
-        if ((data->s && data->len && !stralloc_catb(data, ",", 1)) || !stralloc_catb(data, opt, n))
-          strerr_diefu1sys(111, "build data string") ;
-    }
-    HCTIWS(opt)
-
-    opt += n ;
-    if (!*opt) break ;
-    if (*opt != ',') strerr_dief1x(100, "unrecognized option") ;
-    opt++ ;
-  }
-}
-
-static int mountall (char const *fstab)
-{
-  struct mntent *d ;
-  int e = 0 ;
-  FILE *yuck = setmntent(fstab, "r") ;
-  if (!yuck) strerr_diefu2sys(111, "open ", fstab) ;
-  while ((d = getmntent(yuck)))
-  {
-    unsigned long flags = MS_MGC_VAL ;
-    stralloc data = STRALLOC_ZERO ;
-    scanopt(&data, &flags, d->mnt_opts) ;
-    if (!stralloc_0(&data))
-      strerr_diefu1sys(111, "build data string") ;
-#ifdef DEBUG
-    strerr_warni4x("mounting ", d->mnt_fsname, " on ", d->mnt_dir) ;
-#endif
-    if (mount(d->mnt_fsname, d->mnt_dir, d->mnt_type, flags, data.s) == -1)
-    {
-      e++ ;
-      strerr_warnwu4sys("mount ", d->mnt_fsname, " on ", d->mnt_dir) ;
-    }
-    stralloc_free(&data) ;
-  }
-  endmntent(yuck) ;
-  return e ;
-}
-
-int main (int argc, char const *const *argv)
-{
-  stralloc data = STRALLOC_ZERO ;
-  unsigned long flags = MS_MGC_VAL ;
-  char const *fstype = "none" ;
-  char const *fstab = "/etc/fstab" ;
-  PROG = "s6-mount" ;
-  {
-    int doall = 0 ;
-    subgetopt l = SUBGETOPT_ZERO ;
-    for (;;)
-    {
-      int opt = subgetopt_r(argc, argv, "nz:arwt:o:", &l) ;
-      if (opt == -1) break ;
-      switch (opt)
-      {
-        case 'n' : break ;
-        case 'z' : fstab = l.arg ; break ;
-        case 'a' : doall = 1 ; break ;
-        case 't' : fstype = l.arg ; break ;
-        case 'w' : scanopt(&data, &flags, "rw") ; break ;
-        case 'r' : scanopt(&data, &flags, "ro") ; break ;
-        case 'o' : scanopt(&data, &flags, l.arg) ; break ;
-        default : strerr_dieusage(100, USAGE) ;
-      }
-    }
-    argc -= l.ind ; argv += l.ind ;
-    if (doall) return mountall(fstab) ;
-  }
-  if (!argc)
-  {
-    int fd = open_readb("/proc/mounts") ;
-    if (fd < 0) strerr_diefu2sys(111, "read ", "/proc/mounts") ;
-    if (fd_cat(fd, 1) < 0) strerr_diefu2sys(111, "fd_cat ", "/proc/mounts") ;
-    fd_close(fd) ;
-  }
-  else if (argc == 1) strerr_dieusage(100, USAGE) ;
-  else if (!stralloc_0(&data)) strerr_diefu1sys(111, "build data string") ;  
-  else if (mount(argv[0], argv[1], fstype, flags, data.s) == -1)
-    strerr_diefu4sys(errno == EBUSY ? 1 : 111, "mount ", argv[0], " on ", argv[1]) ;
-  return 0 ;
-}
diff --git a/src/multicall/deps-exe/s6-linux-utils b/src/multicall/deps-exe/s6-linux-utils
new file mode 100644
index 0000000..730b277
--- /dev/null
+++ b/src/multicall/deps-exe/s6-linux-utils
@@ -0,0 +1,5 @@
+libs6ps.a.xyzzy
+${LIBNSSS}
+-lskarnet
+${SYSCLOCK_LIB}
+${MAYBEPTHREAD_LIB}
diff --git a/src/minutils/deps-exe/rngseed b/src/s6-linux-utils/deps-exe/rngseed
index a11a5f4..a11a5f4 100644
--- a/src/minutils/deps-exe/rngseed
+++ b/src/s6-linux-utils/deps-exe/rngseed
diff --git a/src/minutils/deps-exe/s6-chroot b/src/s6-linux-utils/deps-exe/s6-chroot
index e7187fe..e7187fe 100644
--- a/src/minutils/deps-exe/s6-chroot
+++ b/src/s6-linux-utils/deps-exe/s6-chroot
diff --git a/src/minutils/deps-exe/s6-freeramdisk b/src/s6-linux-utils/deps-exe/s6-freeramdisk
index e7187fe..e7187fe 100644
--- a/src/minutils/deps-exe/s6-freeramdisk
+++ b/src/s6-linux-utils/deps-exe/s6-freeramdisk
diff --git a/src/minutils/deps-exe/s6-hostname b/src/s6-linux-utils/deps-exe/s6-hostname
index e7187fe..e7187fe 100644
--- a/src/minutils/deps-exe/s6-hostname
+++ b/src/s6-linux-utils/deps-exe/s6-hostname
diff --git a/src/minutils/deps-exe/s6-logwatch b/src/s6-linux-utils/deps-exe/s6-logwatch
index e7187fe..e7187fe 100644
--- a/src/minutils/deps-exe/s6-logwatch
+++ b/src/s6-linux-utils/deps-exe/s6-logwatch
diff --git a/src/minutils/deps-exe/s6-mount b/src/s6-linux-utils/deps-exe/s6-mount
index e7187fe..e7187fe 100644
--- a/src/minutils/deps-exe/s6-mount
+++ b/src/s6-linux-utils/deps-exe/s6-mount
diff --git a/src/minutils/deps-exe/s6-pivotchroot b/src/s6-linux-utils/deps-exe/s6-pivotchroot
index e7187fe..e7187fe 100644
--- a/src/minutils/deps-exe/s6-pivotchroot
+++ b/src/s6-linux-utils/deps-exe/s6-pivotchroot
diff --git a/src/s6-linux-utils/deps-exe/s6-ps b/src/s6-linux-utils/deps-exe/s6-ps
new file mode 100644
index 0000000..ee390f1
--- /dev/null
+++ b/src/s6-linux-utils/deps-exe/s6-ps
@@ -0,0 +1,4 @@
+libs6ps.a.xyzzy
+${LIBNSSS}
+-lskarnet
+${MAYBEPTHREAD_LIB}
diff --git a/src/minutils/deps-exe/s6-swapoff b/src/s6-linux-utils/deps-exe/s6-swapoff
index e7187fe..e7187fe 100644
--- a/src/minutils/deps-exe/s6-swapoff
+++ b/src/s6-linux-utils/deps-exe/s6-swapoff
diff --git a/src/minutils/deps-exe/s6-swapon b/src/s6-linux-utils/deps-exe/s6-swapon
index e7187fe..e7187fe 100644
--- a/src/minutils/deps-exe/s6-swapon
+++ b/src/s6-linux-utils/deps-exe/s6-swapon
diff --git a/src/minutils/deps-exe/s6-umount b/src/s6-linux-utils/deps-exe/s6-umount
index e7187fe..e7187fe 100644
--- a/src/minutils/deps-exe/s6-umount
+++ b/src/s6-linux-utils/deps-exe/s6-umount
diff --git a/src/minutils/rngseed.c b/src/s6-linux-utils/rngseed.c
index bc16bbb..2b1772c 100644
--- a/src/minutils/rngseed.c
+++ b/src/s6-linux-utils/rngseed.c
@@ -31,10 +31,9 @@
 #define USAGE "rngseed [ -d seeddir ] [ -v verbosity ] [ -r | -R ] [ -n | -N ] [ -w | -W ]"
 #define dieusage() strerr_dieusage(100, USAGE)
 
-#define HASH_PREFIX "SeedRNG v1 Old+New Prefix"
-#define HASH_FALLBACK "SeedRNG v1 No New Seed Failure"
+#define RNGSEED_HASH_PREFIX "SeedRNG v1 Old+New Prefix"
 
-struct flags_s
+struct rngseed_flags_s
 {
   unsigned int read: 1 ;
   unsigned int rcred: 1 ;
@@ -42,7 +41,7 @@ struct flags_s
   unsigned int write: 1 ;
   unsigned int wcred: 1 ;
 } ;
-#define FLAGS_ZERO { .read = 0, .rcred = 1, .block = 1, .write = 0, .wcred = 1 }
+#define RNGSEED_FLAGS_ZERO { .read = 0, .rcred = 1, .block = 1, .write = 0, .wcred = 1 }
 
 struct randpoolinfo_s
 {
@@ -51,9 +50,7 @@ struct randpoolinfo_s
   char buffer[512]  ;
 } ;
 
-static unsigned int verbosity = 1 ;
-
-static inline void mkdirp (char *s, size_t len)
+static inline void rngseed_mkdirp (char *s, size_t len)
 {
   mode_t m = umask(0) ;
   size_t i = 1 ;
@@ -67,7 +64,7 @@ static inline void mkdirp (char *s, size_t len)
   umask(m) ;
 }
 
-static inline int read_seed_nb (char *s, size_t len)
+static inline int rngseed_read_seed_nb (char *s, size_t len)
 {
   int wcred ;
   size_t w = 0 ;
@@ -102,7 +99,8 @@ int main (int argc, char const *const *argv)
 {
   blake2s_ctx ctx = BLAKE2S_INIT(32) ;
   char const *seeddir = RNGSEED_DIR ;
-  struct flags_s flags = FLAGS_ZERO ;
+  struct rngseed_flags_s flags = RNGSEED_FLAGS_ZERO ;
+  unsigned int verbosity = 1 ;
   PROG = "rngseed" ;
   {
     subgetopt l = SUBGETOPT_ZERO ;
@@ -139,7 +137,7 @@ int main (int argc, char const *const *argv)
       if (dirlen)
       {
         file[dirlen] = 0 ;
-        mkdirp(file, dirlen) ;
+        rngseed_mkdirp(file, dirlen) ;
         if (mkdir(file, 0700) == -1)
         {
           struct stat st ;
@@ -156,7 +154,7 @@ int main (int argc, char const *const *argv)
         }
         file[dirlen] = '/' ;
       }
-      blake2s_update(&ctx, HASH_PREFIX, sizeof(HASH_PREFIX) - 1) ;
+      blake2s_update(&ctx, RNGSEED_HASH_PREFIX, sizeof(RNGSEED_HASH_PREFIX) - 1) ;
       clock_gettime(CLOCK_REALTIME, &ts) ;
       blake2s_update(&ctx, (char *)&ts, sizeof ts) ;
       clock_gettime(CLOCK_BOOTTIME, &ts) ;
@@ -258,7 +256,7 @@ int main (int argc, char const *const *argv)
         strerr_warni3x("reading ", s, " bits of random to make the seed") ;
       }
       if (flags.block) random_buf(seed, len) ;
-      else wcred = read_seed_nb(seed, len) ;
+      else wcred = rngseed_read_seed_nb(seed, len) ;
       if (!wcred && verbosity) strerr_warnwu1x("make the seed creditable") ;
       blake2s_update(&ctx, (char *)&len, sizeof(len)) ;
       blake2s_update(&ctx, seed, len) ;
diff --git a/src/minutils/s6-chroot.c b/src/s6-linux-utils/s6-chroot.c
index ae1fb7b..ae1fb7b 100644
--- a/src/minutils/s6-chroot.c
+++ b/src/s6-linux-utils/s6-chroot.c
diff --git a/src/minutils/s6-freeramdisk.c b/src/s6-linux-utils/s6-freeramdisk.c
index adfb07c..b965527 100644
--- a/src/minutils/s6-freeramdisk.c
+++ b/src/s6-linux-utils/s6-freeramdisk.c
@@ -5,6 +5,7 @@
 #include <fcntl.h>
 #include <sys/mount.h>
 #include <sys/ioctl.h>
+
 #include <skalibs/strerr.h>
 
 #define USAGE "s6-freeramdisk ramdisk_device"
diff --git a/src/minutils/s6-hostname.c b/src/s6-linux-utils/s6-hostname.c
index d673e81..f2138cf 100644
--- a/src/minutils/s6-hostname.c
+++ b/src/s6-linux-utils/s6-hostname.c
@@ -1,11 +1,10 @@
 /* ISC license. */
 
-#ifndef _BSD_SOURCE
-#define _BSD_SOURCE
-#endif
+#include <skalibs/nonposix.h>
 
 #include <unistd.h>
 #include <string.h>
+
 #include <skalibs/allreadwrite.h>
 #include <skalibs/strerr.h>
 #include <skalibs/stralloc.h>
@@ -13,7 +12,7 @@
 
 #define USAGE "s6-hostname [ hostname ]"
 
-static int getit (void)
+static int hostname_getit (void)
 {
   stralloc sa = STRALLOC_ZERO ;
   if (sagethostname(&sa) < 0) strerr_diefu1sys(111, "get hostname") ;
@@ -23,7 +22,7 @@ static int getit (void)
   return 0 ;
 }
 
-static int setit (char const *h)
+static int hostname_setit (char const *h)
 {
   if (sethostname(h, strlen(h)) < 0)
     strerr_diefu1sys(111, "set hostname") ;
@@ -33,5 +32,5 @@ static int setit (char const *h)
 int main (int argc, char const *const *argv)
 {
   PROG = "s6-hostname" ;
-  return (argc < 2) ? getit() : setit(argv[1]) ;
+  return (argc < 2) ? hostname_getit() : hostname_setit(argv[1]) ;
 }
diff --git a/src/minutils/s6-logwatch.c b/src/s6-linux-utils/s6-logwatch.c
index e815f81..7240c5e 100644
--- a/src/minutils/s6-logwatch.c
+++ b/src/s6-linux-utils/s6-logwatch.c
@@ -7,6 +7,7 @@
 #include <unistd.h>
 #include <signal.h>
 #include <sys/inotify.h>
+
 #include <skalibs/types.h>
 #include <skalibs/allreadwrite.h>
 #include <skalibs/sgetopt.h>
@@ -20,12 +21,9 @@
 #define USAGE "s6-logwatch [ logdir ]"
 #define dieusage() strerr_dieusage(100, USAGE)
 
-#define B_READING 0
-#define B_BLOCKING 1
-#define B_WAITING 2
-static unsigned int state ;
-static int fd ;
-static int newcurrent = 0 ;
+#define LOGWATCH_READING 0
+#define LOGWATCH_BLOCKING 1
+#define LOGWATCH_WAITING 2
 
 union inotify_event_u
 {
@@ -33,54 +31,54 @@ union inotify_event_u
   char buf[sizeof(struct inotify_event) + NAME_MAX + 1] ;
 } ;
 
-static void goteof (void)
+static inline void logwatch_goteof (int *fd, unsigned int *state, int *newcurrent)
 {
-  if (newcurrent)
+  if (*newcurrent)
   {
-    fd_close(fd) ;
-    fd = open_read("current") ;
-    if (fd < 0) strerr_diefu1sys(111, "current") ;
-    newcurrent = 0 ;
-    state = B_READING ;
+    fd_close(*fd) ;
+    *fd = open_read("current") ;
+    if (*fd < 0) strerr_diefu1sys(111, "current") ;
+    *newcurrent = 0 ;
+    *state = LOGWATCH_READING ;
   }
-  else state = B_BLOCKING ;
+  else *state = LOGWATCH_BLOCKING ;
 }
 
-static int readit (int fd)
+static int logwatch_readit (int *fd, unsigned int *state, int *newcurrent)
 {
   struct iovec v[2] ;
   ssize_t r ;
   buffer_wpeek(buffer_1, v) ;
-  r = fd_readv(fd, v, 2) ;
+  r = fd_readv(*fd, v, 2) ;
   switch (r)
   {
     case -1 : return 0 ;
-    case 0 : goteof() ; break ;
+    case 0 : logwatch_goteof(fd, state, newcurrent) ; break ;
     default : buffer_wseek(buffer_1, r) ;
   }
   return 1 ;
 }
 
-static void maketransition (unsigned int transition)
+static inline void logwatch_maketransition (unsigned int transition, int *fd, unsigned int *state, int *newcurrent)
 {
   static unsigned char const table[3][3] = {
     { 0x10, 0x00, 0x00 },
     { 0x60, 0x22, 0x00 },
     { 0x40, 0x03, 0x02 }
   } ;
-  unsigned char c = table[state][transition] ;
-  state = c & 0x0f ;
-  if (state == 3) strerr_dief1x(101, "current moved twice without being recreated") ;
-  if (c & 0x10) newcurrent = 1 ;
-  if (c & 0x20) { fd_close(fd) ; fd = -1 ; }
+  unsigned char c = table[*state][transition] ;
+  *state = c & 0x0f ;
+  if (*state == 3) strerr_dief1x(101, "current moved twice without being recreated") ;
+  if (c & 0x10) *newcurrent = 1 ;
+  if (c & 0x20) { fd_close(*fd) ; *fd = -1 ; }
   if (c & 0x40)
   {
-    fd = open_read("current") ;
-    if (fd < 0) strerr_diefu1sys(111, "current") ;
+    *fd = open_read("current") ;
+    if (*fd < 0) strerr_diefu1sys(111, "current") ;
   }
 }
 
-static void handle_event (int ifd, int watch)
+static void logwatch_handle_event (int ifd, int watch, int *fd, unsigned int *state, int *newcurrent)
 {
   ssize_t r ;
   size_t offset = 0 ;
@@ -97,7 +95,7 @@ static void handle_event (int ifd, int watch)
       if (event->mask & IN_CREATE) transition = 0 ;
       else if (event->mask & IN_MOVED_FROM) transition = 1 ;
       else if (event->mask & IN_MODIFY) transition = 2 ;
-      if (transition >= 0) maketransition(transition) ;
+      if (transition >= 0) logwatch_maketransition(transition, fd, state, newcurrent) ;
     }
   }
 }
@@ -107,6 +105,9 @@ int main (int argc, char const *const *argv)
   iopause_fd x[2] = { { .events = IOPAUSE_READ }, { .fd = 1 } } ;
   char const *dir = "." ;
   int watch ;
+  int fd ;
+  unsigned int state ;
+  int newcurrent = 0 ;
   unsigned int maxlen = 4096 ;
   PROG = "s6-logwatch" ;
   {
@@ -139,13 +140,13 @@ int main (int argc, char const *const *argv)
   if (fd < 0)
   {
     if (errno != ENOENT) strerr_diefu3sys(111, "open ", dir, "/current") ;
-    state = B_WAITING ;
+    state = LOGWATCH_WAITING ;
   }
-  else state = B_READING ;
+  else state = LOGWATCH_READING ;
   if (!sig_ignore(SIGPIPE)) strerr_diefu1sys(111, "sig_ignore(SIGPIPE)") ;
-  if (state == B_READING)
+  if (state == LOGWATCH_READING)
   {
-    if (!readit(fd)) strerr_diefu3sys(111, "read from ", dir, "/current") ;
+    if (!logwatch_readit(&fd, &state, &newcurrent)) strerr_diefu3sys(111, "read from ", dir, "/current") ;
   }
 
   for (;;)
@@ -162,11 +163,11 @@ int main (int argc, char const *const *argv)
         strerr_diefu1sys(111, "write to stdout") ;
       if (x[1].revents & IOPAUSE_EXCEPT) break ;
     }
-    if (state == B_READING && buffer_available(buffer_1))
+    if (state == LOGWATCH_READING && buffer_available(buffer_1))
     {
-      if (!readit(fd)) strerr_diefu3sys(111, "read from ", dir, "/current") ;
+      if (!logwatch_readit(&fd, &state, &newcurrent)) strerr_diefu3sys(111, "read from ", dir, "/current") ;
     }
-    if (x[0].revents & IOPAUSE_READ) handle_event(x[0].fd, watch) ;
+    if (x[0].revents & IOPAUSE_READ) logwatch_handle_event(x[0].fd, watch, &fd, &state, &newcurrent) ;
   }
   return 0 ;
 }
diff --git a/src/s6-linux-utils/s6-mount.c b/src/s6-linux-utils/s6-mount.c
new file mode 100644
index 0000000..58fc2ff
--- /dev/null
+++ b/src/s6-linux-utils/s6-mount.c
@@ -0,0 +1,166 @@
+/* ISC license. */
+
+#include <string.h>
+#include <errno.h>
+#include <sys/mount.h>
+#include <mntent.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <skalibs/bytestr.h>
+#include <skalibs/sgetopt.h>
+#include <skalibs/strerr.h>
+#include <skalibs/stralloc.h>
+#include <skalibs/djbunix.h>
+
+#include "mount-constants.h"
+
+#define USAGE "s6-mount -a [ -z fstab ] | s6-mount [ -n ] [ -t type ] [ -o option[,option...] ]... device mountpoint"
+#define dienomem() strerr_diefu1sys(111, "stralloc_catb")
+
+struct mount_flag_modif_s
+{
+  char const *name ;
+  unsigned long add ;
+  unsigned long del ;
+} ;
+
+static int mount_flag_cmp (void const *a, void const *b)
+{
+  char const *key = a ;
+  struct mount_flag_modif_s const *p = b ;
+  return strcmp(key, p->name) ;
+}
+
+static void mount_scanopt (stralloc *data, unsigned long *flags, char const *s)
+{
+  static struct mount_flag_modif_s const mount_flag_modifs[] =
+  {
+    { .name = "async", .add = 0, .del = MS_SYNCHRONOUS },
+    { .name = "atime", .add = 0, .del = MS_NOATIME },
+    { .name = "bind", .add = MS_BIND, .del = 0 },
+    { .name = "defaults", .add = 0, .del = MS_RDONLY | MS_NOSUID | MS_NODEV | MS_NOEXEC | MS_SYNCHRONOUS },
+    { .name = "dev", .add = 0, .del = MS_NODEV },
+    { .name = "diratime", .add = 0, .del = MS_NODIRATIME },
+    { .name = "dirsync", .add = MS_DIRSYNC, .del = 0 },
+    { .name = "exec", .add = 0, .del = MS_NOEXEC  },
+    { .name = "lazytime", .add = MS_LAZYTIME, .del = 0 },
+    { .name = "loud", .add = 0, .del = MS_SILENT },
+    { .name = "mandlock", .add = MS_MANDLOCK, .del = 0 },
+    { .name = "move", .add = MS_MOVE, .del = 0 },
+    { .name = "noatime", .add = MS_NOATIME, .del = 0 },
+    { .name = "nobind", .add = 0, .del = MS_BIND },
+    { .name = "nodev", .add = MS_NODEV, .del = 0 },
+    { .name = "nodiratime", .add = MS_NODIRATIME, .del = 0 },
+    { .name = "nodirsync", .add = 0, .del = MS_DIRSYNC },
+    { .name = "nolazytime", .add = 0, .del = MS_LAZYTIME },
+    { .name = "noexec", .add = MS_NOEXEC, .del = 0 },
+    { .name = "nomandlock", .add = 0, .del = MS_MANDLOCK },
+    { .name = "nomove", .add = 0, .del = MS_MOVE },
+    { .name = "norelatime", .add = 0, .del = MS_RELATIME },
+    { .name = "nostrictatime", .add = 0, .del = MS_STRICTATIME },
+    { .name = "nosymfollow", .add = MS_NOSYMFOLLOW, .del = 0 },
+    { .name = "nosuid", .add = MS_NOSUID, .del = 0 },
+    { .name = "private", .add = MS_PRIVATE, .del = MS_SHARED | MS_SLAVE | MS_UNBINDABLE },
+    { .name = "relatime", .add = MS_RELATIME, .del = 0 },
+    { .name = "remount", .add = MS_REMOUNT, .del = 0 },
+    { .name = "ro", .add = MS_RDONLY, .del = 0 },
+    { .name = "rw", .add = 0, .del = MS_RDONLY },
+    { .name = "shared", .add = MS_SHARED, .del = MS_PRIVATE | MS_SLAVE | MS_UNBINDABLE },
+    { .name = "silent", .add = MS_SILENT, .del = 0 },
+    { .name = "slave", .add = MS_SLAVE, .del = MS_SHARED | MS_PRIVATE | MS_UNBINDABLE },
+    { .name = "strictatime", .add = MS_STRICTATIME, .del = 0 },
+    { .name = "suid", .add = 0, .del = MS_NOSUID },
+    { .name = "symfollow", .add = 0, .del = MS_NOSYMFOLLOW },
+    { .name = "sync", .add = MS_SYNCHRONOUS, .del = 0 },
+    { .name = "unbindable", .add = MS_UNBINDABLE, .del = MS_SHARED | MS_PRIVATE | MS_SLAVE },
+  } ;
+
+  while (*s)
+  {
+    struct mount_flag_modif_s const *p ;
+    size_t n = str_chr(s, ',') ;
+    char opt[n+1] ;
+    memcpy(opt, s, n) ;
+    opt[n] = 0 ;
+    p = bsearch(opt, mount_flag_modifs, sizeof(mount_flag_modifs) / sizeof(struct mount_flag_modif_s), sizeof(struct mount_flag_modif_s), &mount_flag_cmp) ;
+    if (p)
+    {
+      *flags &= ~p->del ;
+      *flags |= p->add ;
+    }
+    else
+    {
+      if (data->s && data->len && !stralloc_catb(data, ",", 1)) dienomem() ;
+      if (!stralloc_catb(data, s, n)) dienomem() ;
+    }
+    s += n + (s[n] == ',') ;
+  }
+}
+
+static int mountall (char const *fstab)
+{
+  struct mntent *d ;
+  int e = 0 ;
+  FILE *yuck = setmntent(fstab, "r") ;
+  if (!yuck) strerr_diefu2sys(111, "open ", fstab) ;
+  while ((d = getmntent(yuck)))
+  {
+    unsigned long flags = 0 ;
+    stralloc data = STRALLOC_ZERO ;
+    mount_scanopt(&data, &flags, d->mnt_opts) ;
+    if (!stralloc_0(&data))
+      strerr_diefu1sys(111, "build data string") ;
+    if (mount(d->mnt_fsname, d->mnt_dir, d->mnt_type, flags, data.s) == -1)
+    {
+      e++ ;
+      strerr_warnwu4sys("mount ", d->mnt_fsname, " on ", d->mnt_dir) ;
+    }
+    stralloc_free(&data) ;
+  }
+  endmntent(yuck) ;
+  return e ;
+}
+
+int main (int argc, char const *const *argv)
+{
+  stralloc data = STRALLOC_ZERO ;
+  unsigned long flags = 0 ;
+  char const *fstype = "none" ;
+  char const *fstab = "/etc/fstab" ;
+  PROG = "s6-mount" ;
+  {
+    int doall = 0 ;
+    subgetopt l = SUBGETOPT_ZERO ;
+    for (;;)
+    {
+      int opt = subgetopt_r(argc, argv, "nz:arwt:o:", &l) ;
+      if (opt == -1) break ;
+      switch (opt)
+      {
+        case 'n' : break ;
+        case 'z' : fstab = l.arg ; break ;
+        case 'a' : doall = 1 ; break ;
+        case 't' : fstype = l.arg ; break ;
+        case 'w' : mount_scanopt(&data, &flags, "rw") ; break ;
+        case 'r' : mount_scanopt(&data, &flags, "ro") ; break ;
+        case 'o' : mount_scanopt(&data, &flags, l.arg) ; break ;
+        default : strerr_dieusage(100, USAGE) ;
+      }
+    }
+    argc -= l.ind ; argv += l.ind ;
+    if (doall) return mountall(fstab) ;
+  }
+  if (!argc)
+  {
+    int fd = open_readb("/proc/mounts") ;
+    if (fd < 0) strerr_diefu2sys(111, "read ", "/proc/mounts") ;
+    if (fd_cat(fd, 1) < 0) strerr_diefu2sys(111, "fd_cat ", "/proc/mounts") ;
+    fd_close(fd) ;
+  }
+  else if (argc == 1) strerr_dieusage(100, USAGE) ;
+  else if (!stralloc_0(&data)) strerr_diefu1sys(111, "build data string") ;  
+  else if (mount(argv[0], argv[1], fstype, flags, data.s) == -1)
+    strerr_diefu4sys(errno == EBUSY ? 1 : 111, "mount ", argv[0], " on ", argv[1]) ;
+  return 0 ;
+}
diff --git a/src/minutils/s6-pivotchroot.c b/src/s6-linux-utils/s6-pivotchroot.c
index b35a00b..b35a00b 100644
--- a/src/minutils/s6-pivotchroot.c
+++ b/src/s6-linux-utils/s6-pivotchroot.c
diff --git a/src/minutils/s6-ps.c b/src/s6-linux-utils/s6-ps.c
index 3363f24..fe4b433 100644
--- a/src/minutils/s6-ps.c
+++ b/src/s6-linux-utils/s6-ps.c
@@ -26,6 +26,7 @@
 #include <skalibs/skamisc.h>
 #include <skalibs/unix-transactional.h>
 #include <skalibs/avltreen.h>
+
 #include "s6-ps.h"
 
 #define USAGE "s6-ps [ -H ] [ -w spacing ] [ -W wchanfile ] [ -l | -o field,field... ]"
diff --git a/src/minutils/s6-swapoff.c b/src/s6-linux-utils/s6-swapoff.c
index 00df142..13a2530 100644
--- a/src/minutils/s6-swapoff.c
+++ b/src/s6-linux-utils/s6-swapoff.c
@@ -4,6 +4,7 @@
 #include <sys/types.h>
 #include <sys/swap.h>
 #include <errno.h>
+
 #include <skalibs/bytestr.h>
 #include <skalibs/buffer.h>
 #include <skalibs/strerr.h>
@@ -13,18 +14,16 @@
 
 #define USAGE "s6-swapoff device <or> s6-swapoff -a"
 
-#define BUFSIZE 4095
-
-static int swapoffall ( )
+static int swapoffall (void)
 {
-  char buf[BUFSIZE+1] ;
+  char buf[4096] ;
   buffer b ;
   stralloc sa = STRALLOC_ZERO ;
   int e = 0 ;
   int r ;
   int fd = open_readb("/proc/swaps") ;
   if (fd < 0) strerr_diefu1sys(111, "open_readb /proc/swaps") ;
-  buffer_init(&b, &buffer_read, fd, buf, BUFSIZE+1) ;
+  buffer_init(&b, &buffer_read, fd, buf, 4096) ;
   if (skagetln(&b, &sa, '\n') < 0) strerr_diefu1sys(111, "skagetln") ;
   for (;;)
   {
diff --git a/src/minutils/s6-swapon.c b/src/s6-linux-utils/s6-swapon.c
index 41aabef..d9166a7 100644
--- a/src/minutils/s6-swapon.c
+++ b/src/s6-linux-utils/s6-swapon.c
@@ -5,11 +5,12 @@
 #include <string.h>
 #include <stdio.h>
 #include <mntent.h>
+
 #include <skalibs/strerr.h>
 
 #define USAGE "s6-swapon device <or> s6-swapon -a"
 
-static int swaponall ()
+static int swaponall (void)
 {
   struct mntent *d ;
   int e = 0 ;
diff --git a/src/minutils/s6-umount.c b/src/s6-linux-utils/s6-umount.c
index 3ac1091..8a9b918 100644
--- a/src/minutils/s6-umount.c
+++ b/src/s6-linux-utils/s6-umount.c
@@ -2,6 +2,7 @@
 
 #include <string.h>
 #include <sys/mount.h>
+
 #include <skalibs/bytestr.h>
 #include <skalibs/buffer.h>
 #include <skalibs/strerr.h>
@@ -11,13 +12,12 @@
 
 #define USAGE "s6-umount mountpoint <or> s6-umount -a"
 
-#define BUFSIZE 4096
-#define MAXLINES 512
+#define UMOUNTALL_MAXLINES 512
 
-static int umountall ( )
+static int umountall (void)
 {
-  stralloc mountpoints[MAXLINES] ;
-  char buf[BUFSIZE+1] ;
+  stralloc mountpoints[UMOUNTALL_MAXLINES] ;
+  char buf[4096] ;
   buffer b ;
   stralloc sa = STRALLOC_ZERO ;
   unsigned int line = 0 ;
@@ -26,11 +26,12 @@ static int umountall ( )
   int fd = open_readb("/proc/mounts") ;
   if (fd < 0) strerr_diefu1sys(111, "open /proc/mounts") ;
   memset(mountpoints, 0, sizeof(mountpoints)) ;
-  buffer_init(&b, &buffer_read, fd, buf, BUFSIZE+1) ;
+  buffer_init(&b, &buffer_read, fd, buf, 4096) ;
   for (;;)
   {
     size_t n, p ;
-    if (line >= MAXLINES) strerr_dief1x(111, "/proc/mounts too big") ;
+    if (line >= UMOUNTALL_MAXLINES)
+      strerr_dief1x(111, "/proc/mounts too big") ;
     sa.len = 0 ;
     r = skagetln(&b, &sa, '\n') ;
     if (r <= 0) break ;