summaryrefslogtreecommitdiff
path: root/src/minutils
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 /src/minutils
parent3caba3fd8f3825544c065ec62e4298c6edc76b28 (diff)
downloads6-linux-utils-2f8984613e17f9e5971ec338240b0bb6d2dd1cc6.tar.xz
Code refactor; only s6-ps has remaining globals now
Signed-off-by: Laurent Bercot <ska@appnovation.com>
Diffstat (limited to 'src/minutils')
-rw-r--r--src/minutils/deps-exe/rngseed2
-rw-r--r--src/minutils/deps-exe/s6-chroot1
-rw-r--r--src/minutils/deps-exe/s6-freeramdisk1
-rw-r--r--src/minutils/deps-exe/s6-hostname1
-rw-r--r--src/minutils/deps-exe/s6-logwatch1
-rw-r--r--src/minutils/deps-exe/s6-mount1
-rw-r--r--src/minutils/deps-exe/s6-pivotchroot1
-rw-r--r--src/minutils/deps-exe/s6-ps10
-rw-r--r--src/minutils/deps-exe/s6-swapoff1
-rw-r--r--src/minutils/deps-exe/s6-swapon1
-rw-r--r--src/minutils/deps-exe/s6-umount1
-rw-r--r--src/minutils/mount-constants.h81
-rw-r--r--src/minutils/rngseed.c279
-rw-r--r--src/minutils/s6-chroot.c18
-rw-r--r--src/minutils/s6-freeramdisk.c21
-rw-r--r--src/minutils/s6-hostname.c37
-rw-r--r--src/minutils/s6-logwatch.c172
-rw-r--r--src/minutils/s6-mount.c149
-rw-r--r--src/minutils/s6-pivotchroot.c21
-rw-r--r--src/minutils/s6-ps.c387
-rw-r--r--src/minutils/s6-ps.h163
-rw-r--r--src/minutils/s6-swapoff.c54
-rw-r--r--src/minutils/s6-swapon.c37
-rw-r--r--src/minutils/s6-umount.c66
-rw-r--r--src/minutils/s6ps_grcache.c65
-rw-r--r--src/minutils/s6ps_otree.c98
-rw-r--r--src/minutils/s6ps_pfield.c560
-rw-r--r--src/minutils/s6ps_pwcache.c66
-rw-r--r--src/minutils/s6ps_statparse.c184
-rw-r--r--src/minutils/s6ps_ttycache.c136
-rw-r--r--src/minutils/s6ps_wchan.c94
31 files changed, 0 insertions, 2709 deletions
diff --git a/src/minutils/deps-exe/rngseed b/src/minutils/deps-exe/rngseed
deleted file mode 100644
index a11a5f4..0000000
--- a/src/minutils/deps-exe/rngseed
+++ /dev/null
@@ -1,2 +0,0 @@
--lskarnet
-${SYSCLOCK_LIB}
diff --git a/src/minutils/deps-exe/s6-chroot b/src/minutils/deps-exe/s6-chroot
deleted file mode 100644
index e7187fe..0000000
--- a/src/minutils/deps-exe/s6-chroot
+++ /dev/null
@@ -1 +0,0 @@
--lskarnet
diff --git a/src/minutils/deps-exe/s6-freeramdisk b/src/minutils/deps-exe/s6-freeramdisk
deleted file mode 100644
index e7187fe..0000000
--- a/src/minutils/deps-exe/s6-freeramdisk
+++ /dev/null
@@ -1 +0,0 @@
--lskarnet
diff --git a/src/minutils/deps-exe/s6-hostname b/src/minutils/deps-exe/s6-hostname
deleted file mode 100644
index e7187fe..0000000
--- a/src/minutils/deps-exe/s6-hostname
+++ /dev/null
@@ -1 +0,0 @@
--lskarnet
diff --git a/src/minutils/deps-exe/s6-logwatch b/src/minutils/deps-exe/s6-logwatch
deleted file mode 100644
index e7187fe..0000000
--- a/src/minutils/deps-exe/s6-logwatch
+++ /dev/null
@@ -1 +0,0 @@
--lskarnet
diff --git a/src/minutils/deps-exe/s6-mount b/src/minutils/deps-exe/s6-mount
deleted file mode 100644
index e7187fe..0000000
--- a/src/minutils/deps-exe/s6-mount
+++ /dev/null
@@ -1 +0,0 @@
--lskarnet
diff --git a/src/minutils/deps-exe/s6-pivotchroot b/src/minutils/deps-exe/s6-pivotchroot
deleted file mode 100644
index e7187fe..0000000
--- a/src/minutils/deps-exe/s6-pivotchroot
+++ /dev/null
@@ -1 +0,0 @@
--lskarnet
diff --git a/src/minutils/deps-exe/s6-ps b/src/minutils/deps-exe/s6-ps
deleted file mode 100644
index 1f0adc5..0000000
--- a/src/minutils/deps-exe/s6-ps
+++ /dev/null
@@ -1,10 +0,0 @@
-s6ps_statparse.o
-s6ps_otree.o
-s6ps_pfield.o
-s6ps_pwcache.o
-s6ps_grcache.o
-s6ps_ttycache.o
-s6ps_wchan.o
-${LIBNSSS}
--lskarnet
-${MAYBEPTHREAD_LIB}
diff --git a/src/minutils/deps-exe/s6-swapoff b/src/minutils/deps-exe/s6-swapoff
deleted file mode 100644
index e7187fe..0000000
--- a/src/minutils/deps-exe/s6-swapoff
+++ /dev/null
@@ -1 +0,0 @@
--lskarnet
diff --git a/src/minutils/deps-exe/s6-swapon b/src/minutils/deps-exe/s6-swapon
deleted file mode 100644
index e7187fe..0000000
--- a/src/minutils/deps-exe/s6-swapon
+++ /dev/null
@@ -1 +0,0 @@
--lskarnet
diff --git a/src/minutils/deps-exe/s6-umount b/src/minutils/deps-exe/s6-umount
deleted file mode 100644
index e7187fe..0000000
--- a/src/minutils/deps-exe/s6-umount
+++ /dev/null
@@ -1 +0,0 @@
--lskarnet
diff --git a/src/minutils/mount-constants.h b/src/minutils/mount-constants.h
deleted file mode 100644
index 1e6f3c0..0000000
--- a/src/minutils/mount-constants.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/* ISC license. */
-
-#ifndef MOUNT_CONSTANTS_H
-#define MOUNT_CONSTANTS_H
-
-/* taken from util-linux-ng */
-
-#ifndef MS_RDONLY
-#define MS_RDONLY 1 /* Mount read-only */
-#endif
-#ifndef MS_NOSUID
-#define MS_NOSUID 2 /* Ignore suid and sgid bits */
-#endif
-#ifndef MS_NODEV
-#define MS_NODEV 4 /* Disallow access to device special files */
-#endif
-#ifndef MS_NOEXEC
-#define MS_NOEXEC 8 /* Disallow program execution */
-#endif
-#ifndef MS_SYNCHRONOUS
-#define MS_SYNCHRONOUS 16 /* Writes are synced at once */
-#endif
-#ifndef MS_REMOUNT
-#define MS_REMOUNT 32 /* Alter flags of a mounted FS */
-#endif
-#ifndef MS_MANDLOCK
-#define MS_MANDLOCK 64 /* Allow mandatory locks on an FS */
-#endif
-#ifndef MS_DIRSYNC
-#define MS_DIRSYNC 128 /* Directory modifications are synchronous */
-#endif
-#ifndef MS_NOATIME
-#define MS_NOATIME 0x400 /* 1024: Do not update access times. */
-#endif
-#ifndef MS_NODIRATIME
-#define MS_NODIRATIME 0x800 /* 2048: Don't update directory access times */
-#endif
-#ifndef MS_BIND
-#define MS_BIND 0x1000 /* 4096: Mount existing tree also elsewhere */
-#endif
-#ifndef MS_MOVE
-#define MS_MOVE 0x2000 /* 8192: Atomically move tree */
-#endif
-#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 */
-#endif
-#ifndef MS_UNBINDABLE
-#define MS_UNBINDABLE (1<<17) /* 131072 unbindable */
-#endif
-#ifndef MS_PRIVATE
-#define MS_PRIVATE (1<<18) /* 262144 Private */
-#endif
-#ifndef MS_SLAVE
-#define MS_SLAVE (1<<19) /* 524288 Slave */
-#endif
-#ifndef MS_SHARED
-#define MS_SHARED (1<<20) /* 1048576 Shared */
-#endif
-#ifndef MS_I_VERSION
-#define MS_I_VERSION (1<<23) /* update 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 */
-#endif
-#ifndef MS_MGC_MSK
-#define MS_MGC_MSK 0xffff0000 /* magic flag number mask */
-#endif
-
-#endif
diff --git a/src/minutils/rngseed.c b/src/minutils/rngseed.c
deleted file mode 100644
index bc16bbb..0000000
--- a/src/minutils/rngseed.c
+++ /dev/null
@@ -1,279 +0,0 @@
-/* ISC license. */
-
-#include <skalibs/sysdeps.h>
-
-#ifndef SKALIBS_HASCLOCKBOOT
-# error "CLOCK_BOOTTIME required"
-#endif
-
-#include <string.h>
-#include <errno.h>
-#include <time.h>
-#include <unistd.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <sys/random.h>
-#include <linux/random.h>
-
-#include <skalibs/types.h>
-#include <skalibs/sgetopt.h>
-#include <skalibs/error.h>
-#include <skalibs/strerr.h>
-#include <skalibs/allreadwrite.h>
-#include <skalibs/djbunix.h>
-#include <skalibs/tai.h>
-#include <skalibs/iopause.h>
-#include <skalibs/blake2s.h>
-#include <skalibs/random.h>
-
-#include <s6-linux-utils/config.h>
-
-#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"
-
-struct flags_s
-{
- unsigned int read: 1 ;
- unsigned int rcred: 1 ;
- unsigned int block: 1 ;
- unsigned int write: 1 ;
- unsigned int wcred: 1 ;
-} ;
-#define FLAGS_ZERO { .read = 0, .rcred = 1, .block = 1, .write = 0, .wcred = 1 }
-
-struct randpoolinfo_s
-{
- int entropy_count ;
- int buf_size ;
- char buffer[512] ;
-} ;
-
-static unsigned int verbosity = 1 ;
-
-static inline void mkdirp (char *s, size_t len)
-{
- mode_t m = umask(0) ;
- size_t i = 1 ;
- for (; i < len ; i++) if (s[i] == '/')
- {
- s[i] = 0 ;
- if (mkdir(s, 02755) < 0 && errno != EEXIST)
- strerr_diefu2sys(111, "mkdir ", s) ;
- s[i] = '/' ;
- }
- umask(m) ;
-}
-
-static inline int read_seed_nb (char *s, size_t len)
-{
- int wcred ;
- size_t w = 0 ;
-#ifdef SKALIBS_HASGETRANDOM
- while (w < len)
- {
- ssize_t r = getrandom(s + w, len - w, GRND_NONBLOCK) ;
- if (r == -1)
- {
- if (errno == EINTR) continue ;
- if (error_isagain(errno)) break ;
- strerr_diefu1sys(111, "getrandom") ;
- }
- else w += r ;
- }
- wcred = w >= len ;
- if (!wcred)
-#else
- tain dummy = TAIN_EPOCH ;
- iopause_fd x = { .events = IOPAUSE_READ } ;
- x.fd = openbc_read("/dev/random") ;
- if (x.fd == -1) strerr_diefu2sys(111, "open ", "/dev/random") ;
- wcred = iopause(&x, 1, &dummy, &dummy) ;
- if (wcred == -1) strerr_diefu1sys(111, "iopause") ;
- fd_close(x.fd) ;
-#endif
- random_devurandom(s + w, len - w) ;
- return wcred ;
-}
-
-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 ;
- PROG = "rngseed" ;
- {
- subgetopt l = SUBGETOPT_ZERO ;
- for (;;)
- {
- int opt = subgetopt_r(argc, argv, "d:v:rRnNwW", &l) ;
- if (opt == -1) break ;
- switch (opt)
- {
- case 'd' : seeddir = l.arg ; break ;
- case 'v' : if (!uint0_scan(l.arg, &verbosity)) dieusage() ; break ;
- case 'r' : flags.read = 1 ; flags.rcred = 1 ; break ;
- case 'R' : flags.read = 1 ; flags.rcred = 0 ; break ;
- case 'n' : flags.block = 0 ; break ;
- case 'N' : flags.block = 1 ; break ;
- case 'w' : flags.write = 1 ; flags.wcred = 1 ; break ;
- case 'W' : flags.write = 1 ; flags.wcred = 0 ; break ;
- default : dieusage() ;
- }
- }
- argc -= l.ind ; argv += l.ind ;
- }
-
- {
- size_t dirlen = strlen(seeddir) ;
- char file[dirlen + 6] ;
- memcpy(file, seeddir, dirlen) ;
- while (dirlen && file[dirlen-1] == '/') dirlen-- ;
- memcpy(file + dirlen, "/seed", 6) ;
-
- if (flags.write)
- {
- struct timespec ts ;
- if (dirlen)
- {
- file[dirlen] = 0 ;
- mkdirp(file, dirlen) ;
- if (mkdir(file, 0700) == -1)
- {
- struct stat st ;
- if (errno != EEXIST) strerr_diefu2sys(111, "mkdir ", file) ;
- if (stat(file, &st) == -1)
- strerr_diefu2sys(111, "stat ", file) ;
- if (st.st_mode & 0077)
- {
- if (verbosity)
- strerr_warnw2sys(file, "has permissive modes, changing it to 0700") ;
- if (chmod(file, 0700) == -1)
- strerr_diefu2sys(111, "chmod ", file) ;
- }
- }
- file[dirlen] = '/' ;
- }
- blake2s_update(&ctx, HASH_PREFIX, sizeof(HASH_PREFIX) - 1) ;
- clock_gettime(CLOCK_REALTIME, &ts) ;
- blake2s_update(&ctx, (char *)&ts, sizeof ts) ;
- clock_gettime(CLOCK_BOOTTIME, &ts) ;
- blake2s_update(&ctx, (char *)&ts, sizeof ts) ;
- }
-
- if (flags.read)
- {
- struct randpoolinfo_s req ;
- struct stat st ;
- size_t seedlen ;
- int fd ;
- if (verbosity >= 2) strerr_warni2x("reading seed from ", file) ;
- fd = openbc_read(file) ;
- if (fd == -1) strerr_diefu2sys(111, "open ", file) ;
- errno = 0 ;
- seedlen = allread(fd, req.buffer, 512) ;
- if (errno) strerr_diefu2sys(111, "read from ", file) ;
- if (!seedlen) strerr_dief2x(100, "empty ", file) ;
- if (fstat(fd, &st) == -1) strerr_diefu2sys(111, "stat ", file) ;
- if (unlink(file) == -1) strerr_diefu2sys(111, "unlink ", file) ;
- fd_close(fd) ;
- if (flags.write)
- {
- blake2s_update(&ctx, (char *)&seedlen, sizeof(seedlen)) ;
- blake2s_update(&ctx, req.buffer, seedlen) ;
- }
- if (flags.rcred && st.st_mode & S_IWUSR && verbosity)
- strerr_warnw2x(file, " was not marked as creditable") ;
- req.entropy_count = flags.rcred && !(st.st_mode & S_IWUSR) ? (seedlen << 3) : 0 ;
- req.buf_size = seedlen ;
- fd = openbc_read("/dev/urandom") ;
- if (fd == -1) strerr_diefu2sys(111, "open ", "/dev/urandom") ;
- if (verbosity >= 2)
- {
- char fmt[SIZE_FMT] ;
- fmt[size_fmt(fmt, seedlen << 3)] = 0 ;
- strerr_warni4x("seeding with ", fmt, " bits", req.entropy_count ? "" : " without crediting") ;
- }
- if (ioctl(fd, RNDADDENTROPY, &req) == -1)
- strerr_diefu1sys(111, "seed") ;
- fd_close(fd) ;
- }
-
- if (flags.block)
- {
- if (verbosity >= 2)
- strerr_warni1x("waiting for the entropy pool to initialize") ;
-#ifdef SKALIBS_HASGETRANDOM
- char c ;
- ssize_t r = getrandom(&c, 1, 0) ;
- if (r == -1) strerr_diefu1sys(111, "getrandom") ;
-#else
- iopause_fd x = { .events = IOPAUSE_READ } ;
- x.fd = openbc_read("/dev/random") ;
- if (x.fd == -1) strerr_diefu2sys(111, "open ", "/dev/random") ;
- if (iopause(&x, 1, 0, 0) == -1) strerr_diefu1sys(111, "iopause") ;
- fd_close(x.fd) ;
-#endif
- }
-
- if (flags.write)
- {
- char seed[512] ;
- size_t len = 512 ;
- int wcred = 1 ;
- char s[SIZE_FMT] = "" ;
- int fd = openbc_read("/proc/sys/kernel/random/poolsize") ;
- if (fd < 0)
- {
- if (verbosity) strerr_warnwu2sys("open ", "/proc/sys/kernel/random/poolsize") ;
- }
- else
- {
- size_t r ;
- errno = 0 ;
- r = allread(fd, s, SIZE_FMT - 1) ;
- if (errno)
- {
- if (verbosity) strerr_warnwu2sys("read from ", "/proc/sys/kernel/random/poolsize") ;
- }
- else
- {
- s[r] = 0 ;
- if (!size_scan(s, &r))
- {
- if (verbosity) strerr_warnwu2sys("understand ", "/proc/sys/kernel/random/poolsize") ;
- }
- else len = (r + 7) >> 3 ;
- }
- fd_close(fd) ;
- }
- if (len < 32) len = 32 ;
- if (len > 512) len = 512 ;
-
- if (verbosity >= 2)
- {
- s[size_fmt(s, len << 3)] = 0 ;
- 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) ;
- if (!wcred && verbosity) strerr_warnwu1x("make the seed creditable") ;
- blake2s_update(&ctx, (char *)&len, sizeof(len)) ;
- blake2s_update(&ctx, seed, len) ;
- blake2s_final(&ctx, seed + len - 32) ;
- if (verbosity >= 2) strerr_warni2x("writing seed to ", file) ;
- umask(0077) ;
- if (!openwritenclose_unsafe_sync(file, seed, len))
- strerr_diefu2sys(111, "write to ", file) ;
- if (flags.wcred && wcred)
- {
- if (chmod(file, 0400) == -1 && verbosity)
- strerr_warnwu3sys("mark ", file, "as creditable") ;
- }
- }
- }
-
- return 0 ;
-}
diff --git a/src/minutils/s6-chroot.c b/src/minutils/s6-chroot.c
deleted file mode 100644
index ae1fb7b..0000000
--- a/src/minutils/s6-chroot.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/* ISC license. */
-
-#include <skalibs/nonposix.h>
-#include <unistd.h>
-
-#include <skalibs/strerr.h>
-#include <skalibs/exec.h>
-
-#define USAGE "s6-chroot dir prog..."
-
-int main (int argc, char const *const *argv)
-{
- PROG = "s6-chroot" ;
- if (argc < 3) strerr_dieusage(100, USAGE) ;
- if (chdir(argv[1]) == -1) strerr_diefu2sys(111, "chdir to ", argv[1]) ;
- if (chroot(".") == -1) strerr_diefu2sys(111, "chroot in ", argv[1]) ;
- xexec(argv+2) ;
-}
diff --git a/src/minutils/s6-freeramdisk.c b/src/minutils/s6-freeramdisk.c
deleted file mode 100644
index adfb07c..0000000
--- a/src/minutils/s6-freeramdisk.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* ISC license. */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/mount.h>
-#include <sys/ioctl.h>
-#include <skalibs/strerr.h>
-
-#define USAGE "s6-freeramdisk ramdisk_device"
-
-int main (int argc, char const *const *argv)
-{
- int fd ;
- PROG = "s6-freeramdisk" ;
- if (argc < 2) strerr_dieusage(100, USAGE) ;
- fd = open(argv[1], O_RDWR) ;
- if (fd < 0) strerr_diefu3sys(111, "open ", argv[1], " in read-write mode") ;
- if (ioctl(fd, BLKFLSBUF) < 0) strerr_diefu2sys(111, "ioctl ", argv[1]) ;
- return 0 ;
-}
diff --git a/src/minutils/s6-hostname.c b/src/minutils/s6-hostname.c
deleted file mode 100644
index d673e81..0000000
--- a/src/minutils/s6-hostname.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* ISC license. */
-
-#ifndef _BSD_SOURCE
-#define _BSD_SOURCE
-#endif
-
-#include <unistd.h>
-#include <string.h>
-#include <skalibs/allreadwrite.h>
-#include <skalibs/strerr.h>
-#include <skalibs/stralloc.h>
-#include <skalibs/djbunix.h>
-
-#define USAGE "s6-hostname [ hostname ]"
-
-static int getit (void)
-{
- stralloc sa = STRALLOC_ZERO ;
- if (sagethostname(&sa) < 0) strerr_diefu1sys(111, "get hostname") ;
- sa.s[sa.len++] = '\n' ;
- if (allwrite(1, sa.s, sa.len) < sa.len)
- strerr_diefu1sys(111, "write to stdout") ;
- return 0 ;
-}
-
-static int setit (char const *h)
-{
- if (sethostname(h, strlen(h)) < 0)
- strerr_diefu1sys(111, "set hostname") ;
- return 0 ;
-}
-
-int main (int argc, char const *const *argv)
-{
- PROG = "s6-hostname" ;
- return (argc < 2) ? getit() : setit(argv[1]) ;
-}
diff --git a/src/minutils/s6-logwatch.c b/src/minutils/s6-logwatch.c
deleted file mode 100644
index e815f81..0000000
--- a/src/minutils/s6-logwatch.c
+++ /dev/null
@@ -1,172 +0,0 @@
-/* ISC license. */
-
-#include <sys/uio.h>
-#include <errno.h>
-#include <limits.h>
-#include <string.h>
-#include <unistd.h>
-#include <signal.h>
-#include <sys/inotify.h>
-#include <skalibs/types.h>
-#include <skalibs/allreadwrite.h>
-#include <skalibs/sgetopt.h>
-#include <skalibs/strerr.h>
-#include <skalibs/error.h>
-#include <skalibs/buffer.h>
-#include <skalibs/sig.h>
-#include <skalibs/djbunix.h>
-#include <skalibs/iopause.h>
-
-#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 ;
-
-union inotify_event_u
-{
- struct inotify_event event ;
- char buf[sizeof(struct inotify_event) + NAME_MAX + 1] ;
-} ;
-
-static void goteof (void)
-{
- if (newcurrent)
- {
- fd_close(fd) ;
- fd = open_read("current") ;
- if (fd < 0) strerr_diefu1sys(111, "current") ;
- newcurrent = 0 ;
- state = B_READING ;
- }
- else state = B_BLOCKING ;
-}
-
-static int readit (int fd)
-{
- struct iovec v[2] ;
- ssize_t r ;
- buffer_wpeek(buffer_1, v) ;
- r = fd_readv(fd, v, 2) ;
- switch (r)
- {
- case -1 : return 0 ;
- case 0 : goteof() ; break ;
- default : buffer_wseek(buffer_1, r) ;
- }
- return 1 ;
-}
-
-static void maketransition (unsigned int transition)
-{
- 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 ; }
- if (c & 0x40)
- {
- fd = open_read("current") ;
- if (fd < 0) strerr_diefu1sys(111, "current") ;
- }
-}
-
-static void handle_event (int ifd, int watch)
-{
- ssize_t r ;
- size_t offset = 0 ;
- union inotify_event_u u ;
- r = read(ifd, u.buf, sizeof(u.buf)) ;
- while (r > 0)
- {
- struct inotify_event *event = (struct inotify_event *)(u.buf + offset) ;
- offset += sizeof(struct inotify_event) + event->len ;
- r -= sizeof(struct inotify_event) + event->len ;
- if (event->wd == watch && !strcmp(event->name, "current"))
- {
- int transition = -1 ;
- 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) ;
- }
- }
-}
-
-int main (int argc, char const *const *argv)
-{
- iopause_fd x[2] = { { .events = IOPAUSE_READ }, { .fd = 1 } } ;
- char const *dir = "." ;
- int watch ;
- unsigned int maxlen = 4096 ;
- PROG = "s6-logwatch" ;
- {
- subgetopt l = SUBGETOPT_ZERO ;
- for (;;)
- {
- int opt = subgetopt_r(argc, argv, "m:", &l) ;
- if (opt == -1) break ;
- switch (opt)
- {
- case 'm' :
- if (!uint0_scan(l.arg, &maxlen)) dieusage() ;
- strerr_warnw1x("the -m option is deprecated") ;
- break ;
- default : dieusage() ;
- }
- }
- argc -= l.ind ; argv += l.ind ;
- }
-
- if (argc) dir = *argv ;
- if (chdir(dir) < 0) strerr_diefu2sys(111, "chdir to ", dir) ;
- if (!fd_sanitize()) strerr_diefu1sys(111, "sanitize standard fds") ;
-
- x[0].fd = inotify_init1(IN_NONBLOCK | IN_CLOEXEC) ;
- if (x[0].fd < 0) strerr_diefu1sys(111, "inotify_init") ;
- watch = inotify_add_watch(x[0].fd, ".", IN_CREATE | IN_MOVED_FROM | IN_MODIFY) ;
- if (watch < 0) strerr_diefu1sys(111, "inotify_add_watch") ;
- fd = open_readb("current") ;
- if (fd < 0)
- {
- if (errno != ENOENT) strerr_diefu3sys(111, "open ", dir, "/current") ;
- state = B_WAITING ;
- }
- else state = B_READING ;
- if (!sig_ignore(SIGPIPE)) strerr_diefu1sys(111, "sig_ignore(SIGPIPE)") ;
- if (state == B_READING)
- {
- if (!readit(fd)) strerr_diefu3sys(111, "read from ", dir, "/current") ;
- }
-
- for (;;)
- {
- int r ;
- x[1].events = buffer_len(buffer_1) ? IOPAUSE_WRITE : 0 ;
- r = iopause(x, 2, 0, 0) ;
- if (r < 0) strerr_diefu1sys(111, "iopause") ;
- if (x[0].revents & IOPAUSE_EXCEPT) x[0].revents |= IOPAUSE_READ ;
- if (x[1].revents & IOPAUSE_EXCEPT) x[1].revents |= IOPAUSE_WRITE ;
- if (x[1].revents & IOPAUSE_WRITE)
- {
- if (!buffer_flush(buffer_1) && !error_isagain(errno))
- strerr_diefu1sys(111, "write to stdout") ;
- if (x[1].revents & IOPAUSE_EXCEPT) break ;
- }
- if (state == B_READING && buffer_available(buffer_1))
- {
- if (!readit(fd)) strerr_diefu3sys(111, "read from ", dir, "/current") ;
- }
- if (x[0].revents & IOPAUSE_READ) handle_event(x[0].fd, watch) ;
- }
- return 0 ;
-}
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/minutils/s6-pivotchroot.c b/src/minutils/s6-pivotchroot.c
deleted file mode 100644
index b35a00b..0000000
--- a/src/minutils/s6-pivotchroot.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* ISC license. */
-
-#include <skalibs/nonposix.h>
-#include <unistd.h>
-
-#include <skalibs/strerr.h>
-#include <skalibs/exec.h>
-
-#define USAGE "s6-pivotchroot old-place-for-new-root new-place-for-old-root prog..."
-
-extern int pivot_root (char const *, char const *) ;
-
-int main (int argc, char const *const *argv)
-{
- PROG = "s6-pivotchroot" ;
- if (argc < 4) strerr_dieusage(100, USAGE) ;
- if (chdir(argv[1]) < 0) strerr_diefu2sys(111, "chdir to ", argv[1]) ;
- if (pivot_root(".", argv[2]) < 0) strerr_diefu1sys(111, "pivot_root") ;
- if (chroot(".") < 0) strerr_diefu1sys(111, "chroot") ;
- xexec(argv+3) ;
-}
diff --git a/src/minutils/s6-ps.c b/src/minutils/s6-ps.c
deleted file mode 100644
index 3363f24..0000000
--- a/src/minutils/s6-ps.c
+++ /dev/null
@@ -1,387 +0,0 @@
-/* ISC license. */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <stdint.h>
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <pwd.h>
-#include <dirent.h>
-
-#include <skalibs/uint64.h>
-#include <skalibs/types.h>
-#include <skalibs/fmtscan.h>
-#include <skalibs/sgetopt.h>
-#include <skalibs/bytestr.h>
-#include <skalibs/buffer.h>
-#include <skalibs/diuint.h>
-#include <skalibs/tai.h>
-#include <skalibs/strerr.h>
-#include <skalibs/stralloc.h>
-#include <skalibs/genalloc.h>
-#include <skalibs/direntry.h>
-#include <skalibs/djbunix.h>
-#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... ]"
-
-#define RIGHTFORMATTED ( \
- (1 << PFIELD_PID) | \
- (1 << PFIELD_PPID) | \
- (1 << PFIELD_PGRP) | \
- (1 << PFIELD_SESSION) | \
- (1 << PFIELD_TPGID) | \
- (1 << PFIELD_PRIO) | \
- (1 << PFIELD_NICE) | \
- (1 << PFIELD_THREADS) | \
- (1 << PFIELD_VSIZE) | \
- (1 << PFIELD_RSS) | \
- (1 << PFIELD_RSSLIM) | \
- (1 << PFIELD_CPUNO) | \
- (1 << PFIELD_RTPRIO) | \
- (1 << PFIELD_PMEM) | \
- (1 << PFIELD_PCPU) | \
- ((uint64_t)1 << PFIELD_CPCPU))
-
-void *left_dtok (unsigned int d, void *x)
-{
- return (void *)&genalloc_s(dius_t, (genalloc *)x)[d].left ;
-}
-
-int uint32_cmp (void const *a, void const *b, void *x)
-{
- uint32_t aa = *(uint32_t *)a ;
- uint32_t bb = *(uint32_t *)b ;
- (void)x ;
- return (aa < bb) ? -1 : (aa > bb) ;
-}
-
-static void *pid_dtok (unsigned int d, void *x)
-{
- return &((pscan_t *)x)[d].pid ;
-}
-
-static int fillo_notree (unsigned int i, unsigned int h, void *x)
-{
- static unsigned int j = 0 ;
- unsigned int *list = x ;
- list[j++] = i ;
- (void)h ;
- return 1 ;
-}
-
-static inline unsigned int fieldscan (char const *s, pfield_t *list, uint64_t *fbf)
-{
- uint64_t bits = 0 ;
- unsigned int n = 0 ;
- int cont = 1 ;
- for (; cont ; n++)
- {
- size_t len = str_chr(s, ',') ;
- pfield_t i = 0 ;
- if (!len) strerr_dief3x(100, "invalid", " (empty)", " field for -o option") ;
- if (!s[len]) cont = 0 ;
- {
- char tmp[len+1] ;
- memcpy(tmp, s, len) ;
- tmp[len] = 0 ;
- for (; i < PFIELD_PHAIL ; i++) if (!strcmp(tmp, s6ps_opttable[i])) break ;
- if (i >= PFIELD_PHAIL)
- strerr_dief4x(100, "invalid", " field for -o option", ": ", tmp) ;
- if (bits & ((uint64_t)1 << i))
- strerr_dief4x(100, "duplicate", " field for -o option", ": ", tmp) ;
- }
- s += len + 1 ;
- list[n] = i ;
- bits |= ((uint64_t)1 << i) ;
- }
- *fbf = bits ;
- return n ;
-}
-
-static int slurpit (unsigned int dirfd, stralloc *data, char const *buf, char const *what, size_t *len)
-{
- size_t start = data->len ;
- int fd = open_readat(dirfd, what) ;
- if (fd < 0) return 0 ;
- if (!slurp(data, fd)) strerr_diefu4sys(111, "slurp ", buf, "/", what) ;
- fd_close(fd) ;
- *len = data->len - start ;
- return 1 ;
-}
-
-int main (int argc, char const *const *argv)
-{
- genalloc pscans = GENALLOC_ZERO ; /* array of pscan_t */
- pfield_t fieldlist[PFIELD_PHAIL] = { PFIELD_USER, PFIELD_PID, PFIELD_TTY, PFIELD_STATE, PFIELD_START, PFIELD_ARGS } ;
- uint64_t fbf = (1 << PFIELD_USER) | (1 << PFIELD_PID) | (1 << PFIELD_TTY) | (1 << PFIELD_STATE) | (1 << PFIELD_START) | (1 << PFIELD_ARGS) ;
- size_t mypos = 0 ;
- unsigned int nfields = 6 ;
- pscan_t *p ;
- size_t n ;
- unsigned int spacing = 2 ;
- int flagtree = 0 ;
- char const *wchanfile = 0 ;
- int needstat ;
- PROG = "s6-ps" ;
-
- {
- subgetopt l = SUBGETOPT_ZERO ;
- for (;;)
- {
- int opt = subgetopt_r(argc, argv, "Hlw:W:o:", &l) ;
- if (opt == -1) break ;
- switch (opt)
- {
- case 'H' : flagtree = 1 ; break ;
- case 'l' :
- {
- nfields = 11 ;
- fbf = (1 << PFIELD_USER) | (1 << PFIELD_PID) | ((uint64_t)1 << PFIELD_CPCPU) | (1 << PFIELD_PMEM) | (1 << PFIELD_VSIZE) | (1 << PFIELD_RSS) | (1 << PFIELD_TTY) | (1 << PFIELD_STATE) | (1 << PFIELD_START) | (1 << PFIELD_CTTIME) | (1 << PFIELD_ARGS) ;
- fieldlist[0] = PFIELD_USER ;
- fieldlist[1] = PFIELD_PID ;
- fieldlist[2] = PFIELD_CPCPU ;
- fieldlist[3] = PFIELD_PMEM ;
- fieldlist[4] = PFIELD_VSIZE ;
- fieldlist[5] = PFIELD_RSS ;
- fieldlist[6] = PFIELD_TTY ;
- fieldlist[7] = PFIELD_STATE ;
- fieldlist[8] = PFIELD_START ;
- fieldlist[9] = PFIELD_CTTIME ;
- fieldlist[10] = PFIELD_ARGS ;
- break ;
- }
- case 'w' :
- {
- if (!uint0_scan(l.arg, &spacing)) strerr_dieusage(100, USAGE) ;
- break ;
- }
- case 'W' : wchanfile = l.arg ; break ;
- case 'o' :
- {
- nfields = fieldscan(l.arg, fieldlist, &fbf) ;
- break ;
- }
- default : strerr_dieusage(100, USAGE) ;
- }
- }
- argc -= l.ind ; argv += l.ind ;
- }
-
- if (!spacing) spacing = 1 ;
- if (spacing > 256) spacing = 256 ;
-
- needstat = flagtree || !!(fbf & (
- (1 << PFIELD_PID) |
- (1 << PFIELD_COMM) |
- (1 << PFIELD_STATE) |
- (1 << PFIELD_PPID) |
- (1 << PFIELD_PGRP) |
- (1 << PFIELD_SESSION) |
- (1 << PFIELD_TTY) |
- (1 << PFIELD_TPGID) |
- (1 << PFIELD_UTIME) |
- (1 << PFIELD_STIME) |
- (1 << PFIELD_CUTIME) |
- (1 << PFIELD_CSTIME) |
- (1 << PFIELD_PRIO) |
- (1 << PFIELD_NICE) |
- (1 << PFIELD_THREADS) |
- (1 << PFIELD_START) |
- (1 << PFIELD_VSIZE) |
- (1 << PFIELD_RSS) |
- (1 << PFIELD_RSSLIM) |
- (1 << PFIELD_CPUNO) |
- (1 << PFIELD_RTPRIO) |
- (1 << PFIELD_RTPOLICY) |
- (1 << PFIELD_PMEM) |
- (1 << PFIELD_WCHAN) |
- (1 << PFIELD_PCPU) |
- (1 << PFIELD_TTIME) |
- (1 << PFIELD_CTTIME) |
- ((uint64_t)1 << PFIELD_TSTART) |
- ((uint64_t)1 << PFIELD_CPCPU))) ;
-
-
- /* Scan /proc */
-
- {
- int needstatdir = !!(fbf & ((1 << PFIELD_USER) | (1 << PFIELD_GROUP))) ;
- pid_t mypid = getpid() ;
- DIR *dir = opendir("/proc") ;
- direntry *d ;
- char buf[25] = "/proc/" ;
-
- if (!dir) strerr_diefu1sys(111, "open /proc") ;
- for (;;)
- {
- pscan_t pscan = PSCAN_ZERO ;
- uint64_t u ;
- int dirfd ;
- errno = 0 ;
- d = readdir(dir) ;
- if (!d) break ;
- if (!uint640_scan(d->d_name, &u)) continue ;
- pscan.pid = u ;
- strcpy(buf+6, d->d_name) ;
- dirfd = open_read(buf) ;
- if (dirfd < 0) continue ;
-
- if (needstatdir)
- {
- struct stat st ;
- if (fstat(dirfd, &st) < 0) goto errindir ;
- pscan.uid = st.st_uid ;
- pscan.gid = st.st_gid ;
- }
- if (needstat)
- {
- if (!slurpit(dirfd, &pscan.data, buf, "stat", &pscan.statlen))
- goto errindir ;
- if (!slurpit(dirfd, &pscan.data, buf, "comm", &pscan.commlen))
- goto errindir ;
- if (pscan.commlen) { pscan.commlen-- ; pscan.data.len-- ; }
- }
- if (fbf & (1 << PFIELD_ARGS))
- {
- if (!slurpit(dirfd, &pscan.data, buf, "cmdline", &pscan.cmdlen)) goto errindir ;
- while (!pscan.data.s[pscan.data.len-1])
- {
- pscan.cmdlen-- ;
- pscan.data.len-- ;
- }
- }
- if (fbf & (1 << PFIELD_ENV)) slurpit(dirfd, &pscan.data, buf, "environ", &pscan.envlen) ;
- fd_close(dirfd) ;
- if (!genalloc_append(pscan_t, &pscans, &pscan))
- strerr_diefu1sys(111, "genalloc_append") ;
- if (pscan.pid == mypid) mypos = genalloc_len(pscan_t, &pscans) ;
- continue ;
- errindir:
- fd_close(dirfd) ;
- stralloc_free(&pscan.data) ;
- }
- if (errno) strerr_diefu1sys(111, "readdir /proc") ;
- dir_close(dir) ;
- }
-
- /* Add a process 0 as a root and sentinel */
- {
- pscan_t pscan = { .pid = 0, .ppid = 0 } ;
- if (!genalloc_append(pscan_t, &pscans, &pscan)) strerr_diefu1sys(111, "genalloc_append") ;
- }
-
- p = genalloc_s(pscan_t, &pscans) ;
- n = genalloc_len(pscan_t, &pscans) - 1 ;
-
- {
- unsigned int orderedlist[n+1] ; /* 1st element will be 0, ignored */
- unsigned int i = 0 ;
-
- /* Order the processes for display */
-
- {
- AVLTREEN_DECLARE_AND_INIT(pidtree, n+1, &pid_dtok, &uint32_cmp, p) ;
- for (i = 0 ; i < n ; i++)
- {
- if (needstat && !s6ps_statparse(p+i))
- strerr_diefu1sys(111, "parse process stats") ;
- if (!avltreen_insert(&pidtree, i))
- strerr_diefu1sys(111, "avltreen_insert") ;
- }
- if (!avltreen_insert(&pidtree, n))
- strerr_diefu1sys(111, "avltreen_insert") ;
-
- if (flagtree) s6ps_otree(p, n+1, &pidtree, orderedlist) ;
- else avltreen_iter_nocancel(&pidtree, avltreen_totalsize(&pidtree), &fillo_notree, orderedlist) ;
- }
-
-
- /* Format, compute length, output */
-
- if (fbf & ((1 << PFIELD_START) | ((uint64_t)1 << PFIELD_TSTART) | (1 << PFIELD_PCPU) | ((uint64_t)1 << PFIELD_CPCPU)))
- {
- tain_wallclock_read_g() ;
- s6ps_compute_boottime(p, mypos) ;
- }
- if (fbf & (1 << PFIELD_USER) && !s6ps_pwcache_init())
- strerr_diefu1sys(111, "init user name cache") ;
- if (fbf & (1 << PFIELD_GROUP) && !s6ps_grcache_init())
- strerr_diefu1sys(111, "init group name cache") ;
- if (fbf & (1 << PFIELD_TTY) && !s6ps_ttycache_init())
- strerr_diefu1sys(111, "init tty name cache") ;
- if (fbf & (1 << PFIELD_WCHAN) && !s6ps_wchan_init(wchanfile))
- {
- if (wchanfile) strerr_warnwu2sys("init wchan file ", wchanfile) ;
- else strerr_warnwu1sys("init wchan") ;
- }
-
- {
- size_t fmtpos[n][nfields] ;
- size_t fmtlen[n][nfields] ;
- size_t maxlen[nfields] ;
- unsigned int maxspaces = 0 ;
- for (i = 0 ; i < nfields ; i++) maxlen[i] = strlen(s6ps_fieldheaders[fieldlist[i]]) ;
- for (i = 0 ; i < n ; i++)
- {
- unsigned int j = 0 ;
- for (; j < nfields ; j++)
- {
- if (!(*s6ps_pfield_fmt[fieldlist[j]])(p+i, &fmtpos[i][j], &fmtlen[i][j]))
- strerr_diefu1sys(111, "format fields") ;
- if (fmtlen[i][j] > maxlen[j]) maxlen[j] = fmtlen[i][j] ;
- }
- }
- for (i = 0 ; i < nfields ; i++)
- if (maxlen[i] > maxspaces) maxspaces = maxlen[i] ;
- maxspaces += spacing ;
- if (fbf & (1 << PFIELD_USER)) s6ps_pwcache_finish() ;
- if (fbf & (1 << PFIELD_GROUP)) s6ps_grcache_finish() ;
- if (fbf & (1 << PFIELD_TTY)) s6ps_ttycache_finish() ;
- if (fbf & (1 << PFIELD_WCHAN)) s6ps_wchan_finish() ;
- stralloc_free(&satmp) ;
- {
- char spaces[maxspaces] ;
- for (i = 0 ; i < maxspaces ; i++) spaces[i] = ' ' ;
- for (i = 0 ; i < nfields ; i++)
- {
- unsigned int rightformatted = !!(((uint64_t)1 << fieldlist[i]) & RIGHTFORMATTED) ;
- size_t len = strlen(s6ps_fieldheaders[fieldlist[i]]) ;
- if (rightformatted && (buffer_put(buffer_1, spaces, maxlen[i] - len) < (ssize_t)(maxlen[i] - len)))
- goto nowrite ;
- if (buffer_put(buffer_1, s6ps_fieldheaders[fieldlist[i]], len) < (ssize_t)len)
- goto nowrite ;
- if ((i < nfields-1) && (buffer_put(buffer_1, spaces, !rightformatted * (maxlen[i] - len) + spacing) < (ssize_t)(!rightformatted * (maxlen[i] - len) + spacing)))
- goto nowrite ;
- }
- if (buffer_put(buffer_1, "\n", 1) < 1) goto nowrite ;
- for (i = 0 ; i < n ; i++)
- {
- unsigned int oi = orderedlist[i+1] ;
- unsigned int j = 0 ;
- for (; j < nfields ; j++)
- {
- unsigned int rightformatted = !!(((uint64_t)1 << fieldlist[j]) & RIGHTFORMATTED) ;
- if (rightformatted && (buffer_put(buffer_1, spaces, maxlen[j] - fmtlen[oi][j]) < (ssize_t)(maxlen[j] - fmtlen[oi][j])))
- goto nowrite ;
- if (buffer_put(buffer_1, p[oi].data.s + fmtpos[oi][j], fmtlen[oi][j]) < (ssize_t)fmtlen[oi][j])
- goto nowrite ;
- if ((j < nfields-1) && (buffer_put(buffer_1, spaces, !rightformatted * (maxlen[j] - fmtlen[oi][j]) + spacing) < (ssize_t)(!rightformatted * (maxlen[j] - fmtlen[oi][j]) + spacing)))
- goto nowrite ;
- }
- if (buffer_put(buffer_1, "\n", 1) < 1) goto nowrite ;
- }
- }
- }
- }
- buffer_flush(buffer_1) ;
- return 0 ;
-
- nowrite:
- strerr_diefu1sys(111, "write to stdout") ;
-}
diff --git a/src/minutils/s6-ps.h b/src/minutils/s6-ps.h
deleted file mode 100644
index eb56dc1..0000000
--- a/src/minutils/s6-ps.h
+++ /dev/null
@@ -1,163 +0,0 @@
-/* ISC license. */
-
-#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>
-#include <skalibs/avltreen.h>
-
-
-typedef struct dius_s dius_t, *dius_t_ref ;
-struct dius_s
-{
- uint32_t left ;
- size_t right ;
-} ;
-#define DIUS_ZERO { .left = 0, .right = 0 }
-
-
- /* pfield: the output fields */
-
-typedef enum pfield_e pfield_t, *pfield_t_ref ;
-enum pfield_e
-{
- PFIELD_PID,
- PFIELD_COMM,
- PFIELD_STATE,
- PFIELD_PPID,
- PFIELD_PGRP,
- PFIELD_SESSION,
- PFIELD_TTY,
- PFIELD_TPGID,
- PFIELD_UTIME,
- PFIELD_STIME,
- PFIELD_CUTIME,
- PFIELD_CSTIME,
- PFIELD_PRIO,
- PFIELD_NICE,
- PFIELD_THREADS,
- PFIELD_START,
- PFIELD_VSIZE,
- PFIELD_RSS,
- PFIELD_RSSLIM,
- PFIELD_CPUNO,
- PFIELD_RTPRIO,
- PFIELD_RTPOLICY,
- PFIELD_USER,
- PFIELD_GROUP,
- PFIELD_PMEM,
- PFIELD_WCHAN,
- PFIELD_ARGS,
- PFIELD_ENV,
- PFIELD_PCPU,
- PFIELD_TTIME,
- PFIELD_CTTIME,
- PFIELD_TSTART,
- PFIELD_CPCPU,
- PFIELD_PHAIL
-} ;
-
-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
-{
- stralloc data ;
- pid_t pid ;
- signed int height ;
- size_t statlen ;
- size_t commlen ;
- size_t cmdlen ;
- size_t envlen ;
- uid_t uid ;
- gid_t gid ;
- pid_t ppid ;
- unsigned int state ;
- pid_t pgrp ;
- pid_t session ;
- dev_t ttynr ;
- pid_t tpgid ;
- uint64_t utime ;
- uint64_t stime ;
- uint64_t cutime ;
- uint64_t cstime ;
- int prio ;
- int nice ;
- uint64_t threads ;
- uint64_t start ;
- uint64_t vsize ;
- uint64_t rss ;
- uint64_t rsslim ;
- uint64_t wchan ;
- uint64_t cpuno ;
- uint64_t rtprio ;
- uint64_t policy ;
-} ;
-
-#define PSCAN_ZERO \
-{ \
- .data = STRALLOC_ZERO, \
- .pid = 0, \
- .height = 0, \
- .statlen = 0, \
- .commlen = 0, \
- .cmdlen = 0, \
- .envlen = 0, \
- .uid = 0, \
- .gid = 0, \
- .ppid = 0, \
- .state = 0, \
- .pgrp = 0, \
- .session = 0, \
- .ttynr = 0, \
- .tpgid = -1, \
- .utime = 0, \
- .stime = 0, \
- .cutime = 0, \
- .cstime = 0, \
- .prio = 0, \
- .nice = 0, \
- .threads = 0, \
- .start = 0, \
- .vsize = 0, \
- .rss = 0, \
- .rsslim = 0, \
- .wchan = 0, \
- .cpuno = 0, \
- .rtprio = 0, \
- .policy = 0 \
-}
-
-extern int s6ps_statparse (pscan_t *) ;
-extern void s6ps_otree (pscan_t *, unsigned int, avltreen *, unsigned int *) ;
-
-extern int s6ps_compute_boottime (pscan_t *, unsigned int) ;
-
-typedef int pfieldfmt_func (pscan_t *, size_t *, size_t *) ;
-typedef pfieldfmt_func *pfieldfmt_func_ref ;
-
-extern pfieldfmt_func_ref *s6ps_pfield_fmt ;
-
-extern void *left_dtok (unsigned int, void *) ;
-extern int uint32_cmp (void const *, void const *, void *) ;
-extern int s6ps_pwcache_init (void) ;
-extern void s6ps_pwcache_finish (void) ;
-extern int s6ps_pwcache_lookup (stralloc *, uid_t) ;
-extern int s6ps_grcache_init (void) ;
-extern void s6ps_grcache_finish (void) ;
-extern int s6ps_grcache_lookup (stralloc *, gid_t) ;
-extern int s6ps_ttycache_init (void) ;
-extern void s6ps_ttycache_finish (void) ;
-extern int s6ps_ttycache_lookup (stralloc *, dev_t) ;
-extern int s6ps_wchan_init (char const *) ;
-extern void s6ps_wchan_finish (void) ;
-extern int s6ps_wchan_lookup (stralloc *, uint64_t) ;
-
-#endif
diff --git a/src/minutils/s6-swapoff.c b/src/minutils/s6-swapoff.c
deleted file mode 100644
index 00df142..0000000
--- a/src/minutils/s6-swapoff.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/* ISC license. */
-
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/swap.h>
-#include <errno.h>
-#include <skalibs/bytestr.h>
-#include <skalibs/buffer.h>
-#include <skalibs/strerr.h>
-#include <skalibs/stralloc.h>
-#include <skalibs/djbunix.h>
-#include <skalibs/skamisc.h>
-
-#define USAGE "s6-swapoff device <or> s6-swapoff -a"
-
-#define BUFSIZE 4095
-
-static int swapoffall ( )
-{
- char buf[BUFSIZE+1] ;
- 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) ;
- if (skagetln(&b, &sa, '\n') < 0) strerr_diefu1sys(111, "skagetln") ;
- for (;;)
- {
- size_t n ;
- sa.len = 0 ;
- r = skagetln(&b, &sa, '\n') ;
- if (r < 0) strerr_diefu1sys(111, "skagetln") ;
- if (!r) break ;
- n = byte_chr(sa.s, sa.len, ' ') ;
- if (n >= sa.len) strerr_dief1x(111, "invalid line in /proc/swaps") ;
- sa.s[n] = 0 ;
- if (swapoff(sa.s) < 0) { e++ ; strerr_warnwu2sys("swapoff ", sa.s) ; }
- }
- fd_close(fd) ;
- stralloc_free(&sa) ;
- return e ;
-}
-
-int main (int argc, char const *const *argv)
-{
- PROG = "s6-swapoff" ;
- if (argc < 2) strerr_dieusage(100, USAGE) ;
- if ((argv[1][0] == '-') && (argv[1][1] == 'a') && !argv[1][2])
- return swapoffall() ;
- if (swapoff(argv[1]) == -1) strerr_diefu2sys(111, "swapoff ", argv[1]) ;
- return 0 ;
-}
diff --git a/src/minutils/s6-swapon.c b/src/minutils/s6-swapon.c
deleted file mode 100644
index 41aabef..0000000
--- a/src/minutils/s6-swapon.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* ISC license. */
-
-#include <unistd.h>
-#include <sys/swap.h>
-#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 ()
-{
- struct mntent *d ;
- int e = 0 ;
- FILE *yuck = setmntent("/etc/fstab", "r") ;
- if (!yuck) strerr_diefu1sys(111, "setmntent /etc/fstab") ;
- while ((d = getmntent(yuck)))
- if (!strcmp(d->mnt_type, "swap") && (swapon(d->mnt_fsname, 0) == -1))
- {
- e++ ;
- strerr_warnwu2sys("swapon ", d->mnt_fsname) ;
- }
- endmntent(yuck) ;
- return e ;
-}
-
-int main (int argc, char const *const *argv)
-{
- PROG = "s6-swapon" ;
- if (argc < 2) strerr_dieusage(100, USAGE) ;
- if ((argv[1][0] == '-') && (argv[1][1] == 'a') && !argv[1][2])
- return swaponall() ;
- if (swapon(argv[1], 0) == -1)
- strerr_diefu2sys(111, "swapon ", argv[1]) ;
- return 0 ;
-}
diff --git a/src/minutils/s6-umount.c b/src/minutils/s6-umount.c
deleted file mode 100644
index 3ac1091..0000000
--- a/src/minutils/s6-umount.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/* ISC license. */
-
-#include <string.h>
-#include <sys/mount.h>
-#include <skalibs/bytestr.h>
-#include <skalibs/buffer.h>
-#include <skalibs/strerr.h>
-#include <skalibs/stralloc.h>
-#include <skalibs/djbunix.h>
-#include <skalibs/skamisc.h>
-
-#define USAGE "s6-umount mountpoint <or> s6-umount -a"
-
-#define BUFSIZE 4096
-#define MAXLINES 512
-
-static int umountall ( )
-{
- stralloc mountpoints[MAXLINES] ;
- char buf[BUFSIZE+1] ;
- buffer b ;
- stralloc sa = STRALLOC_ZERO ;
- unsigned int line = 0 ;
- int e = 0 ;
- int r ;
- 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) ;
- for (;;)
- {
- size_t n, p ;
- if (line >= MAXLINES) strerr_dief1x(111, "/proc/mounts too big") ;
- sa.len = 0 ;
- r = skagetln(&b, &sa, '\n') ;
- if (r <= 0) break ;
- p = byte_chr(sa.s, sa.len, ' ') ;
- if (p >= sa.len) strerr_dief1x(111, "bad /proc/mounts format") ;
- p++ ;
- n = byte_chr(sa.s + p, sa.len - p, ' ') ;
- if (n == sa.len - p) strerr_dief1x(111, "bad /proc/mounts format") ;
- if (!stralloc_catb(&mountpoints[line], sa.s + p, n) || !stralloc_0(&mountpoints[line]))
- strerr_diefu1sys(111, "store mount point") ;
- line++ ;
- }
- fd_close(fd) ;
- stralloc_free(&sa) ;
- if (r < 0) strerr_diefu1sys(111, "read /proc/mounts") ;
- while (line--)
- if (umount(mountpoints[line].s) == -1)
- {
- e++ ;
- strerr_warnwu2sys("umount ", mountpoints[line].s) ;
- }
- return e ;
-}
-
-int main (int argc, char const *const *argv)
-{
- PROG = "s6-umount" ;
- if (argc < 2) strerr_dieusage(100, USAGE) ;
- if ((argv[1][0] == '-') && (argv[1][1] == 'a') && !argv[1][2])
- return umountall() ;
- if (umount(argv[1]) == -1) strerr_diefu2sys(111, "umount ", argv[1]) ;
- return 0 ;
-}
diff --git a/src/minutils/s6ps_grcache.c b/src/minutils/s6ps_grcache.c
deleted file mode 100644
index ba62098..0000000
--- a/src/minutils/s6ps_grcache.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/* ISC license. */
-
-#include <stdint.h>
-#include <grp.h>
-#include <errno.h>
-#include <skalibs/types.h>
-#include <skalibs/stralloc.h>
-#include <skalibs/genalloc.h>
-#include <skalibs/skamisc.h>
-#include <skalibs/avltree.h>
-#include "s6-ps.h"
-
-static avltree grcache_tree = AVLTREE_ZERO ;
-static genalloc grcache_index = GENALLOC_ZERO ;
-
-int s6ps_grcache_init (void)
-{
- avltree_init(&grcache_tree, 5, 3, 8, &left_dtok, &uint32_cmp, &grcache_index) ;
- return 1 ;
-}
-
-void s6ps_grcache_finish (void)
-{
- avltree_free(&grcache_tree) ;
- genalloc_free(dius_t, &grcache_index) ;
-}
-
-int s6ps_grcache_lookup (stralloc *sa, gid_t gid)
-{
- int wasnull = !satmp.s ;
- dius_t d = { .left = (uint32_t)gid, .right = satmp.len } ;
- uint32_t i ;
- if (!avltree_search(&grcache_tree, &d.left, &i))
- {
- struct group *gr ;
- unsigned int n = genalloc_len(dius_t, &grcache_index) ;
- errno = 0 ;
- gr = getgrgid(gid) ;
- if (!gr)
- {
- if (errno) return 0 ;
- if (!stralloc_readyplus(&satmp, UINT_FMT + 2)) return 0 ;
- stralloc_catb(&satmp, "(", 1) ;
- satmp.len += uint_fmt(satmp.s + satmp.len, gid) ;
- stralloc_catb(&satmp, ")", 2) ;
- }
- else if (!stralloc_cats(&satmp, gr->gr_name) || !stralloc_0(&satmp)) return 0 ;
- if (!genalloc_append(dius_t, &grcache_index, &d)) goto err ;
- if (!avltree_insert(&grcache_tree, n))
- {
- genalloc_setlen(dius_t, &grcache_index, n) ;
- goto err ;
- }
- i = n ;
- }
- return stralloc_cats(sa, satmp.s + genalloc_s(dius_t, &grcache_index)[i].right) ;
- err:
- {
- int e = errno ;
- if (wasnull) stralloc_free(&satmp) ;
- else satmp.len = d.right ;
- errno = e ;
- }
- return 0 ;
-}
diff --git a/src/minutils/s6ps_otree.c b/src/minutils/s6ps_otree.c
deleted file mode 100644
index f7952ab..0000000
--- a/src/minutils/s6ps_otree.c
+++ /dev/null
@@ -1,98 +0,0 @@
-/* ISC license. */
-
-#include <errno.h>
-#include <skalibs/avltreen.h>
-#include "s6-ps.h"
-
-typedef struct ptreeiter_s ptreeiter_t, *ptreeiter_t_ref ;
-struct ptreeiter_s
-{
- unsigned int *childlist ;
- unsigned int const *childindex ;
- unsigned int const *ppindex ;
- unsigned int *cpos ;
-} ;
-
-typedef struct pstuff_s pstuff_t, *pstuff_t_ref ;
-struct pstuff_s
-{
- unsigned int *orderedlist ;
- pscan_t *p ;
- unsigned int const *childlist ;
- unsigned int const *childindex ;
- unsigned int const *nchild ;
-} ;
-
-static int fillchildlist (unsigned int i, unsigned int h, void *x)
-{
- ptreeiter_t *pt = x ;
- unsigned int j = pt->ppindex[i] ;
- pt->childlist[pt->childindex[j] + pt->cpos[j]++] = i ;
- (void)h ;
- return 1 ;
-}
-
-static void fillo_tree_rec (pstuff_t *blah, unsigned int root, signed int h)
-{
- static unsigned int j = 0 ;
- unsigned int i = !blah->p[root].pid ;
- if (blah->p[root].pid == 1) h = -1 ;
- blah->p[root].height = (h > 0) ? h : 0 ;
- blah->orderedlist[j++] = root ;
- for (; i < blah->nchild[root] ; i++)
- fillo_tree_rec(blah, blah->childlist[blah->childindex[root] + i], h+1) ;
-}
-
- /*
- Fills up orderedlist with the right indices to print a process tree.
- O(n log n) time, O(n) space, all in the stack.
- */
-
-void s6ps_otree (pscan_t *p, unsigned int n, avltreen *pidtree, unsigned int *orderedlist)
-{
- unsigned int childlist[n] ;
- unsigned int childindex[n] ;
- unsigned int nchild[n] ;
- unsigned int i = 0 ;
- for (; i < n ; i++) nchild[i] = 0 ;
-
- /* Compute the ppid tree */
- for (i = 0 ; i < n ; i++)
- {
- uint32_t k ;
- if (!avltreen_search(pidtree, &p[i].ppid, &k)) k = n-1 ;
- orderedlist[i] = k ; /* using orderedlist as ppindex */
- nchild[k]++ ;
- }
- {
- unsigned int j = 0 ;
- for (i = 0 ; i < n ; i++)
- {
- childindex[i] = j ;
- j += nchild[i] ;
- }
- }
-
- /* Fill the childlist by increasing pids so it is sorted */
- {
- unsigned int cpos[n] ;
- ptreeiter_t blah = { .childlist = childlist, .childindex = childindex, .ppindex = orderedlist, .cpos = cpos } ;
- for (i = 0 ; i < n ; i++) cpos[i] = 0 ;
- avltreen_iter_nocancel(pidtree, avltreen_totalsize(pidtree), &fillchildlist, &blah) ;
- }
-
- /* If we have init, make it the last in the orphan list */
- if (n > 1 && p[childlist[childindex[n-1]+1]].pid == 1)
- {
- unsigned int pos1 = childlist[childindex[n-1] + 1] ;
- for (i = 2 ; i < nchild[n-1] ; i++)
- childlist[childindex[n-1]+i-1] = childlist[childindex[n-1]+i] ;
- childlist[childindex[n-1]+nchild[n-1]-1] = pos1 ;
- }
-
- /* Finally, fill orderedlist by walking the childindex tree. */
- {
- pstuff_t blah = { .orderedlist = orderedlist, .p = p, .childlist = childlist, .childindex = childindex, .nchild = nchild } ;
- fillo_tree_rec(&blah, n-1, -1) ;
- }
-}
diff --git a/src/minutils/s6ps_pfield.c b/src/minutils/s6ps_pfield.c
deleted file mode 100644
index 0280186..0000000
--- a/src/minutils/s6ps_pfield.c
+++ /dev/null
@@ -1,560 +0,0 @@
-/* ISC license. */
-
-#include <string.h>
-#include <stdint.h>
-#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] =
-{
- "PID",
- "COMM",
- "STAT",
- "PPID",
- "PGRP",
- "SESSION",
- "TTY",
- "TPGID",
- "UTIME",
- "STIME",
- "CUTIME",
- "CSTIME",
- "PRIO",
- "NICE",
- "THREADS",
- "START",
- "VSZ",
- "RSS",
- "RSSLIM",
- "CPU",
- "RTPRIO",
- "RTPOLICY",
- "USER",
- "GROUP",
- "%MEM",
- "WCHAN",
- "COMMAND",
- "ENVIRONMENT",
- "%CPU",
- "TTIME",
- "CTTIME",
- "TSTART",
- "C%CPU"
-} ;
-
-char const *const *s6ps_fieldheaders = fieldheaders ;
-
-static char const *const opttable[PFIELD_PHAIL] =
-{
- "pid",
- "comm",
- "s",
- "ppid",
- "pgrp",
- "sess",
- "tty",
- "tpgid",
- "utime",
- "stime",
- "cutime",
- "cstime",
- "prio",
- "nice",
- "thcount",
- "start",
- "vsize",
- "rss",
- "rsslimit",
- "psr",
- "rtprio",
- "policy",
- "user",
- "group",
- "pmem",
- "wchan",
- "args",
- "env",
- "pcpu",
- "ttime",
- "cttime",
- "tstart",
- "cpcpu"
-} ;
-
-char const *const *s6ps_opttable = opttable ;
-
-static tain boottime = TAIN_EPOCH ;
-
-static int fmt_64 (pscan_t *p, size_t *pos, size_t *len, uint64_t u)
-{
- if (!stralloc_readyplus(&p->data, UINT64_FMT)) return 0 ;
- *pos = p->data.len ;
- *len = uint64_fmt(p->data.s + *pos, u) ;
- p->data.len += *len ;
- return 1 ;
-}
-
-static int fmt_i (pscan_t *p, size_t *pos, size_t *len, int d)
-{
- if (!stralloc_readyplus(&p->data, UINT32_FMT+1)) return 0 ;
- *pos = p->data.len ;
- *len = int_fmt(p->data.s + *pos, d) ;
- p->data.len += *len ;
- return 1 ;
-}
-
-static int fmt_pid (pscan_t *p, size_t *pos, size_t *len)
-{
- return fmt_64(p, pos, len, p->pid) ;
-}
-
-static int fmt_comm (pscan_t *p, size_t *pos, size_t *len)
-{
- *pos = p->statlen ;
- *len = p->commlen ;
- return 1 ;
-}
-
-static int fmt_s (pscan_t *p, size_t *pos, size_t *len)
-{
- if (!stralloc_readyplus(&p->data, 4)) return 0 ;
- *pos = p->data.len ;
- p->data.s[p->data.len++] = p->data.s[p->state] ;
- if (p->pid == p->session) p->data.s[p->data.len++] = 's' ;
- if (p->threads > 1) p->data.s[p->data.len++] = 'l' ;
- if ((p->tpgid > 0) && ((unsigned int)p->tpgid == p->pgrp))
- p->data.s[p->data.len++] = '+' ;
- if (p->nice) p->data.s[p->data.len++] = (p->nice < 0) ? '<' : 'N' ;
-
- *len = p->data.len - *pos ;
- return 1 ;
-}
-
-static int fmt_ppid (pscan_t *p, size_t *pos, size_t *len)
-{
- return fmt_64(p, pos, len, p->ppid) ;
-}
-
-static int fmt_pgrp (pscan_t *p, size_t *pos, size_t *len)
-{
- return fmt_64(p, pos, len, p->pgrp) ;
-}
-
-static int fmt_session (pscan_t *p, size_t *pos, size_t *len)
-{
- return fmt_64(p, pos, len, p->session) ;
-}
-
-static int fmt_ttynr(pscan_t *p, size_t *pos, size_t *len)
-{
- if (p->ttynr)
- {
- size_t tmppos = p->data.len ;
- if (!s6ps_ttycache_lookup(&p->data, p->ttynr)) return 0 ;
- *pos = tmppos ;
- *len = p->data.len - tmppos ;
- }
- else
- {
- if (!stralloc_catb(&p->data, "-", 1)) return 0 ;
- *pos = p->data.len - 1 ;
- *len = 1 ;
- }
- return 1 ;
-}
-
-static int fmt_tpgid (pscan_t *p, size_t *pos, size_t *len)
-{
- return p->tpgid < 0 ? fmt_i(p, pos, len, -1) : fmt_64(p, pos, len, p->tpgid) ;
-}
-
-static unsigned int gethz (void)
-{
- static unsigned int hz = 0 ;
- if (!hz)
- {
- long jiffies = sysconf(_SC_CLK_TCK) ;
- if (jiffies < 1)
- {
- char fmt[ULONG_FMT + 1] ;
- fmt[long_fmt(fmt, jiffies)] = 0 ;
- strerr_warnw3x("invalid _SC_CLK_TCK value (", fmt, "), using 100") ;
- hz = 100 ;
- }
- else hz = (unsigned int)jiffies ;
- }
- return hz ;
-}
-
-int s6ps_compute_boottime (pscan_t *p, unsigned int mypos)
-{
- if (!mypos--)
- {
- strerr_warnwu1x("compute boot time - using epoch") ;
- return 0 ;
- }
- else
- {
- unsigned int hz = gethz() ;
- tain offset = { .sec = { .x = p[mypos].start / hz }, .nano = (p[mypos].start % hz) * (1000000000 / hz) } ;
- tain_sub(&boottime, &STAMP, &offset) ;
- return 1 ;
- }
-}
-
-static int fmt_jiffies (pscan_t *p, size_t *pos, size_t *len, uint64_t j)
-{
- unsigned int hz = gethz() ;
- uint32_t hrs, mins, secs, hfrac ;
- if (!stralloc_readyplus(&p->data, UINT64_FMT + 13)) return 0 ;
- hfrac = (j % hz) * 100 / hz ;
- *pos = p->data.len ;
- j /= hz ;
- secs = j % 60 ; j /= 60 ;
- mins = j % 60 ; j /= 60 ;
- hrs = j % 24 ; j /= 24 ;
- if (j)
- {
- p->data.len += uint64_fmt(p->data.s + p->data.len, j) ;
- p->data.s[p->data.len++] = 'd' ;
- }
- if (j || hrs)
- {
- uint320_fmt(p->data.s + p->data.len, hrs, 2) ;
- p->data.len += 2 ;
- p->data.s[p->data.len++] = 'h' ;
- }
- if (j || hrs || mins)
- {
- uint320_fmt(p->data.s + p->data.len, mins, 2) ;
- p->data.len += 2 ;
- p->data.s[p->data.len++] = 'm' ;
- }
- uint320_fmt(p->data.s + p->data.len, secs, 2) ;
- p->data.len += 2 ;
- if (!j && !hrs && !mins)
- {
- p->data.s[p->data.len++] = '.' ;
- uint320_fmt(p->data.s + p->data.len, hfrac, 2) ;
- p->data.len += 2 ;
- }
- p->data.s[p->data.len++] = 's' ;
- *len = p->data.len - *pos ;
- return 1 ;
-}
-
-static int fmt_utime (pscan_t *p, size_t *pos, size_t *len)
-{
- return fmt_jiffies(p, pos, len, p->utime) ;
-}
-
-static int fmt_stime (pscan_t *p, size_t *pos, size_t *len)
-{
- return fmt_jiffies(p, pos, len, p->stime) ;
-}
-
-static int fmt_cutime (pscan_t *p, size_t *pos, size_t *len)
-{
- return fmt_jiffies(p, pos, len, p->utime + p->cutime) ;
-}
-
-static int fmt_cstime (pscan_t *p, size_t *pos, size_t *len)
-{
- return fmt_jiffies(p, pos, len, p->stime + p->cstime) ;
-}
-
-static int fmt_prio (pscan_t *p, size_t *pos, size_t *len)
-{
- return fmt_i(p, pos, len, p->prio) ;
-}
-
-static int fmt_nice (pscan_t *p, size_t *pos, size_t *len)
-{
- return fmt_i(p, pos, len, p->nice) ;
-}
-
-static int fmt_threads (pscan_t *p, size_t *pos, size_t *len)
-{
- return fmt_64(p, pos, len, p->threads) ;
-}
-
-static int fmt_timedate (pscan_t *p, size_t *pos, size_t *len, struct tm const *tm)
-{
- static struct tm nowtm = { .tm_year = 0 } ;
- size_t tmplen ;
- char *tmpstrf = "%F" ;
- if (!nowtm.tm_year && !localtm_from_tai(&nowtm, tain_secp(&STAMP), 1)) return 0 ;
- if (!stralloc_readyplus(&p->data, 20)) return 0 ;
- if (tm->tm_year == nowtm.tm_year && tm->tm_yday == nowtm.tm_yday)
- tmpstrf = "%T" ;
- else if (tm->tm_year == nowtm.tm_year || (tm->tm_year+1 == nowtm.tm_year && (nowtm.tm_mon + 12 - tm->tm_mon) % 12 < 9))
- tmpstrf = "%b%d %R" ;
- tmplen = strftime(p->data.s + p->data.len, 20, tmpstrf, tm) ;
- if (!tmplen) return 0 ;
- *len = tmplen ;
- *pos = p->data.len ;
- p->data.len += tmplen ;
- return 1 ;
-}
-
-static int fmt_start (pscan_t *p, size_t *pos, size_t *len)
-{
- struct tm starttm ;
- unsigned int hz = gethz() ;
- tain blah = { .sec = { .x = p->start / hz }, .nano = (p->start % hz) * (1000000000 / hz) } ;
- tain_add(&blah, &boottime, &blah) ;
- if (!localtm_from_tai(&starttm, tain_secp(&blah), 1)) return 0 ;
- return fmt_timedate(p, pos, len, &starttm) ;
-}
-
-static unsigned int getpgsz (void)
-{
- static unsigned int pgsz = 0 ;
- if (!pgsz)
- {
- long sz = sysconf(_SC_PAGESIZE) ;
- if (sz < 1)
- {
- char fmt[ULONG_FMT + 1] ;
- fmt[long_fmt(fmt, sz)] = 0 ;
- strerr_warnw3x("invalid _SC_PAGESIZE value (", fmt, "), using 4096") ;
- pgsz = 4096 ;
- }
- else pgsz = sz ;
- }
- return pgsz ;
-}
-
-static int fmt_vsize (pscan_t *p, size_t *pos, size_t *len)
-{
- return fmt_64(p, pos, len, p->vsize / 1024) ;
-}
-
-static int fmt_rss (pscan_t *p, size_t *pos, size_t *len)
-{
- return fmt_64(p, pos, len, p->rss * (getpgsz() / 1024)) ;
-}
-
-static int fmt_rsslim (pscan_t *p, size_t *pos, size_t *len)
-{
- return fmt_64(p, pos, len, p->rsslim / 1024) ;
-}
-
-static int fmt_cpuno (pscan_t *p, size_t *pos, size_t *len)
-{
- return fmt_64(p, pos, len, p->cpuno) ;
-}
-
-static int fmt_rtprio (pscan_t *p, size_t *pos, size_t *len)
-{
- return fmt_64(p, pos, len, p->rtprio) ;
-}
-
-static int fmt_policy (pscan_t *p, size_t *pos, size_t *len)
-{
- static char const *const policies[8] = { "NORMAL", "FIFO", "RR", "BATCH", "ISO", "IDLE", "UNKNOWN", "UNKNOWN" } ;
- size_t tmppos = p->data.len ;
- if (!stralloc_cats(&p->data, policies[p->policy & 7])) return 0 ;
- *pos = tmppos ;
- *len = p->data.len - tmppos ;
- return 1 ;
-}
-
-static int fmt_user (pscan_t *p, size_t *pos, size_t *len)
-{
- size_t tmppos = p->data.len ;
- if (!s6ps_pwcache_lookup(&p->data, p->uid)) return 0 ;
- *pos = tmppos ;
- *len = p->data.len - tmppos ;
- return 1 ;
-}
-
-static int fmt_group (pscan_t *p, size_t *pos, size_t *len)
-{
- size_t tmppos = p->data.len ;
- if (!s6ps_grcache_lookup(&p->data, p->gid)) return 0 ;
- *pos = tmppos ;
- *len = p->data.len - tmppos ;
- return 1 ;
-}
-
-static struct sysinfo si = { .totalram = 0, .loads = { 0, 0, 0 } } ;
-
-static uint64_t gettotalmem (void)
-{
- uint64_t totalmem = 0 ;
- if (!si.totalram && (sysinfo(&si) < 0)) return 0 ;
- totalmem = si.totalram ;
- totalmem *= si.mem_unit ;
- return totalmem ;
-}
-
-static int percent (stralloc *sa, unsigned int n, size_t *pos, size_t *len)
-{
- if (!stralloc_readyplus(sa, UINT64_FMT+1)) return 0 ;
- *pos = sa->len ;
- sa->len += uint_fmt(sa->s + sa->len, n / 100) ;
- sa->s[sa->len++] = '.' ;
- uint0_fmt(sa->s + sa->len, n % 100, 2) ;
- sa->len += 2 ;
- *len = sa->len - *pos ;
- return 1 ;
-}
-
-static int fmt_pmem (pscan_t *p, size_t *pos, size_t *len)
-{
- uint64 l = gettotalmem() ;
- return l ? percent(&p->data, p->rss * getpgsz() * 10000 / l, pos, len) : 0 ;
-}
-
-static int fmt_wchan (pscan_t *p, size_t *pos, size_t *len)
-{
- size_t tmppos = p->data.len ;
- if (!s6ps_wchan_lookup(&p->data, p->wchan)) return 0 ;
- *len = p->data.len - tmppos ;
- *pos = tmppos ;
- return 1 ;
-}
-
-static int fmt_args (pscan_t *p, size_t *pos, size_t *len)
-{
- if (!stralloc_readyplus(&p->data, (p->height << 2) + (p->cmdlen ? p->cmdlen : p->commlen + (p->data.s[p->state] == 'Z' ? 11 : 3))))
- return 0 ;
- *pos = p->data.len ;
- if (p->height)
- {
- unsigned int i = 0 ;
- for (; i < 4 * (unsigned int)p->height - 3 ; i++)
- p->data.s[p->data.len + i] = ' ' ;
- memcpy(p->data.s + p->data.len + 4 * p->height - 3, "\\_ ", 3) ;
- p->data.len += p->height << 2 ;
- }
- if (p->cmdlen)
- {
- char const *r = p->data.s + p->statlen + p->commlen ;
- char *w = p->data.s + p->data.len ;
- size_t i = p->cmdlen ;
- while (i--)
- {
- char c = *r++ ;
- *w++ = c ? c : ' ' ;
- }
- p->data.len += p->cmdlen ;
- }
- else if (p->data.s[p->state] == 'Z')
- {
- stralloc_catb(&p->data, p->data.s + uint32_fmt(0, p->pid) + 2, p->commlen) ;
- stralloc_catb(&p->data, " <defunct>", 10) ;
- }
- else
- stralloc_catb(&p->data, p->data.s + uint32_fmt(0, p->pid) + 1, p->commlen+2) ;
- *len = p->data.len - *pos ;
- return 1 ;
-}
-
-static int fmt_env (pscan_t *p, size_t *pos, size_t *len)
-{
- size_t i = 0 ;
- if (!p->envlen)
- {
- if (!stralloc_catb(&p->data, "*", 1)) return 0 ;
- *pos = p->data.len - 1 ;
- *len = 1 ;
- return 1 ;
- }
- *pos = p->statlen + p->commlen + p->cmdlen ;
- *len = p->envlen ;
- for (; i < *len ; i++)
- if (!p->data.s[*pos + i]) p->data.s[*pos + i] = ' ' ;
- return 1 ;
-}
-
-static uint64_t gettotalj (uint64_t j)
-{
- tain totaltime ;
- unsigned int hz = gethz() ;
- tain_sub(&totaltime, &STAMP, &boottime) ;
- j = totaltime.sec.x * hz + totaltime.nano / (1000000000 / hz) - j ;
- if (!j) j = 1 ;
- return j ;
-}
-
-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) ;
-}
-
-static int fmt_cttime (pscan_t *p, size_t *pos, size_t *len)
-{
- return fmt_jiffies(p, pos, len, p->utime + p->stime + p->cutime + p->cstime) ;
-}
-
-static int fmt_tstart (pscan_t *p, size_t *pos, size_t *len)
-{
- unsigned int hz = gethz() ;
- tain blah = { .sec = { .x = p->start / hz }, .nano = (p->start % hz) * (1000000000 / hz) } ;
- if (!stralloc_readyplus(&p->data, TIMESTAMP)) return 0 ;
- tain_add(&blah, &boottime, &blah) ;
- *pos = p->data.len ;
- *len = timestamp_fmt(p->data.s + p->data.len, &blah) ;
- p->data.len += *len ;
- return 1 ;
-}
-
-static int fmt_cpcpu (pscan_t *p, size_t *pos, size_t *len)
-{
- return percent(&p->data, 10000 * (p->utime + p->stime + p->cutime + p->cstime) / gettotalj(p->start), pos, len) ;
-}
-
-static pfieldfmt_func_ref pfieldfmt_table[PFIELD_PHAIL] =
-{
- &fmt_pid,
- &fmt_comm,
- &fmt_s,
- &fmt_ppid,
- &fmt_pgrp,
- &fmt_session,
- &fmt_ttynr,
- &fmt_tpgid,
- &fmt_utime,
- &fmt_stime,
- &fmt_cutime,
- &fmt_cstime,
- &fmt_prio,
- &fmt_nice,
- &fmt_threads,
- &fmt_start,
- &fmt_vsize,
- &fmt_rss,
- &fmt_rsslim,
- &fmt_cpuno,
- &fmt_rtprio,
- &fmt_policy,
- &fmt_user,
- &fmt_group,
- &fmt_pmem,
- &fmt_wchan,
- &fmt_args,
- &fmt_env,
- &fmt_pcpu,
- &fmt_ttime,
- &fmt_cttime,
- &fmt_tstart,
- &fmt_cpcpu
-} ;
-
-pfieldfmt_func_ref *s6ps_pfield_fmt = pfieldfmt_table ;
diff --git a/src/minutils/s6ps_pwcache.c b/src/minutils/s6ps_pwcache.c
deleted file mode 100644
index 283a393..0000000
--- a/src/minutils/s6ps_pwcache.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/* ISC license. */
-
-#include <sys/types.h>
-#include <stdint.h>
-#include <pwd.h>
-#include <errno.h>
-#include <skalibs/types.h>
-#include <skalibs/stralloc.h>
-#include <skalibs/genalloc.h>
-#include <skalibs/skamisc.h>
-#include <skalibs/avltree.h>
-#include "s6-ps.h"
-
-static avltree pwcache_tree = AVLTREE_ZERO ;
-static genalloc pwcache_index = GENALLOC_ZERO ;
-
-int s6ps_pwcache_init (void)
-{
- avltree_init(&pwcache_tree, 5, 3, 8, &left_dtok, &uint32_cmp, &pwcache_index) ;
- return 1 ;
-}
-
-void s6ps_pwcache_finish (void)
-{
- avltree_free(&pwcache_tree) ;
- genalloc_free(dius_t, &pwcache_index) ;
-}
-
-int s6ps_pwcache_lookup (stralloc *sa, uid_t uid)
-{
- int wasnull = !satmp.s ;
- dius_t d = { .left = (uint32_t)uid, .right = satmp.len } ;
- uint32_t i ;
- if (!avltree_search(&pwcache_tree, &d.left, &i))
- {
- struct passwd *pw ;
- unsigned int n = genalloc_len(dius_t, &pwcache_index) ;
- errno = 0 ;
- pw = getpwuid(uid) ;
- if (!pw)
- {
- if (errno) return 0 ;
- if (!stralloc_readyplus(&satmp, UINT_FMT + 2)) return 0 ;
- stralloc_catb(&satmp, "(", 1) ;
- satmp.len += uint_fmt(satmp.s + satmp.len, uid) ;
- stralloc_catb(&satmp, ")", 2) ;
- }
- else if (!stralloc_cats(&satmp, pw->pw_name) || !stralloc_0(&satmp)) return 0 ;
- if (!genalloc_append(dius_t, &pwcache_index, &d)) goto err ;
- if (!avltree_insert(&pwcache_tree, n))
- {
- genalloc_setlen(dius_t, &pwcache_index, n) ;
- goto err ;
- }
- i = n ;
- }
- return stralloc_cats(sa, satmp.s + genalloc_s(dius_t, &pwcache_index)[i].right) ;
- err:
- {
- int e = errno ;
- if (wasnull) stralloc_free(&satmp) ;
- else satmp.len = d.right ;
- errno = e ;
- }
- return 0 ;
-}
diff --git a/src/minutils/s6ps_statparse.c b/src/minutils/s6ps_statparse.c
deleted file mode 100644
index fe4c355..0000000
--- a/src/minutils/s6ps_statparse.c
+++ /dev/null
@@ -1,184 +0,0 @@
-/* ISC license. */
-
-#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"
-
-
- /*
- going to great lengths to avoid scanf(), but all this code
- is still smaller than scanf (no floating point parsing etc.)
- */
-
-#define STATVARS 49
-
-typedef size_t sca$1_func (char const *, void *) ;
-typedef sca$1_func *sca$1_func_ref ;
-
-static size_t f64 (char const *s, void *u64)
-{
- uint64_t *u = u64 ;
- return uint64_scan(s, u) ;
-}
-
-#define DEFUNU(name, type) \
-static size_t name (char const *s, void *p) \
-{ \
- uint64_t u ; \
- size_t len = uint64_scan(s, &u) ; \
- *(type *)p = u ; \
- return len ; \
-} \
-
-#define DEFUNS(name, type) \
-static size_t name (char const *s, void *p) \
-{ \
- int64_t d ; \
- size_t len = int64_scan(s, &d) ; \
- *(type *)p = d ; \
- return len ; \
-} \
-
-DEFUNS(fint, int)
-DEFUNS(fpid, pid_t)
-DEFUNU(fdev, dev_t)
-
-static sca$1_func_ref scanfuncs[STATVARS] =
-{
- &fpid, /* ppid */
- &fpid, /* pgrp */
- &fpid, /* session */
- &fdev, /* tty_nr */
- &fpid, /* tpgid */
- &f64, /* flags */
- &f64, /* minflt */
- &f64, /* cminflt */
- &f64, /* majflt */
- &f64, /* cmajflt */
- &f64, /* utime */
- &f64, /* stime */
- &f64, /* cutime */
- &f64, /* cstime */
- &fint, /* priority */
- &fint, /* nice */
- &f64, /* num_threads */
- &f64, /* itrealvalue */
- &f64, /* starttime */
- &f64, /* vsize */
- &f64, /* rss */
- &f64, /* rsslim */
- &f64, /* startcode */
- &f64, /* endcode */
- &f64, /* startstack */
- &f64, /* kstkesp */
- &f64, /* kstkeip */
- &f64, /* signal */
- &f64, /* blocked */
- &f64, /* sigignore */
- &f64, /* sigcatch */
- &f64, /* wchan */
- &f64, /* nswap */
- &f64, /* cnswap */
- &fint, /* exit_signal */
- &f64, /* processor */
- &f64, /* rt_priority */
- &f64, /* policy */
- &f64, /* delayacct_blkio_ticks */
- &f64, /* guest_time */
- &f64, /* cguest_time */
- &f64, /* start_data */
- &f64, /* end_data */
- &f64, /* start_brk */
- &f64, /* arg_start */
- &f64, /* arg_end */
- &f64, /* env_start */
- &f64, /* env_end */
- &fint /* exit_code */
-} ;
-
-int s6ps_statparse (pscan_t *p)
-{
- uint64_t dummy64 ;
- int dummyint ;
- size_t pos = 0 ;
- void *scanresults[STATVARS] =
- {
- &p->ppid,
- &p->pgrp,
- &p->session,
- &p->ttynr,
- &p->tpgid,
- &dummy64,
- &dummy64,
- &dummy64,
- &dummy64,
- &dummy64,
- &p->utime,
- &p->stime,
- &p->cutime,
- &p->cstime,
- &p->prio,
- &p->nice,
- &p->threads,
- &dummy64,
- &p->start,
- &p->vsize,
- &p->rss,
- &p->rsslim,
- &dummy64,
- &dummy64,
- &dummy64,
- &dummy64,
- &dummy64,
- &dummy64,
- &dummy64,
- &dummy64,
- &dummy64,
- &p->wchan,
- &dummy64,
- &dummy64,
- &dummy64,
- &p->cpuno,
- &p->rtprio,
- &p->policy,
- &dummy64,
- &dummy64,
- &dummy64,
- &dummy64,
- &dummy64,
- &dummy64,
- &dummy64,
- &dummy64,
- &dummy64,
- &dummy64,
- &dummyint
- } ;
- unsigned int i = 0 ;
-
- if (!p->statlen) return 0 ;
- pos = uint64_scan(p->data.s, &dummy64) ;
- if (!pos) return 0 ;
- if (dummy64 != p->pid) return 0 ;
- if (pos + 5 + p->commlen > p->statlen) return 0 ;
- if (p->data.s[pos++] != ' ') return 0 ;
- if (p->data.s[pos++] != '(') return 0 ;
- pos += p->commlen ;
- if (p->data.s[pos++] != ')') return 0 ;
- if (p->data.s[pos++] != ' ') return 0 ;
- p->state = pos++ ;
- for (; i < STATVARS ; i++)
- {
- size_t w ;
- if (pos + 1 > p->statlen) return 0 ;
- if (p->data.s[pos++] != ' ') return 0 ;
- w = (*scanfuncs[i])(p->data.s + pos, scanresults[i]) ;
- if (!w) return 0 ;
- pos += w ;
- }
- return 1 ;
-}
diff --git a/src/minutils/s6ps_ttycache.c b/src/minutils/s6ps_ttycache.c
deleted file mode 100644
index 0608967..0000000
--- a/src/minutils/s6ps_ttycache.c
+++ /dev/null
@@ -1,136 +0,0 @@
-/* ISC license. */
-
-#include <string.h>
-#include <stdint.h>
-#include <sys/stat.h>
-#include <sys/sysmacros.h>
-#include <errno.h>
-#include <skalibs/types.h>
-#include <skalibs/allreadwrite.h>
-#include <skalibs/buffer.h>
-#include <skalibs/stralloc.h>
-#include <skalibs/genalloc.h>
-#include <skalibs/djbunix.h>
-#include <skalibs/skamisc.h>
-#include <skalibs/avltree.h>
-#include "s6-ps.h"
-
-static avltree ttycache_tree = AVLTREE_ZERO ;
-static genalloc ttycache_index = GENALLOC_ZERO ;
-
-int s6ps_ttycache_init (void)
-{
- avltree_init(&ttycache_tree, 5, 3, 8, &left_dtok, &uint32_cmp, &ttycache_index) ;
- return 1 ;
-}
-
-void s6ps_ttycache_finish (void)
-{
- avltree_free(&ttycache_tree) ;
- genalloc_free(dius_t, &ttycache_index) ;
-}
-
-static int check (char const *s, dev_t ttynr)
-{
- struct stat st ;
- if (stat(s, &st) < 0) return 0 ;
- return S_ISCHR(st.st_mode) && (st.st_rdev == ttynr) ;
-}
-
-
- /* No blind scanning of all /dev or /sys/devices, kthx */
-
-static int ttyguess (stralloc *sa, dev_t ttynr)
-{
- unsigned int maj = major(ttynr), min = minor(ttynr) ;
-
- /* Try /dev/tty? and /dev/pts/? */
- if (maj == 4 && min < 64)
- {
- char tmp[11] = "/dev/tty" ;
- tmp[uint_fmt(tmp+8, min)] = 0 ;
- if (check(tmp, ttynr)) return stralloc_cats(sa, tmp+5) && stralloc_0(sa) ;
- }
- else if (maj >= 136 && maj < 144)
- {
- unsigned int n = ((maj - 136) << 20) | min ;
- char tmp[9 + UINT_FMT] = "/dev/pts/" ;
- tmp[9 + uint_fmt(tmp+9, n)] = 0 ;
- if (check(tmp, ttynr)) return stralloc_cats(sa, tmp+5) && stralloc_0(sa) ;
- }
-
- /* Use /sys/dev/char/maj:min if it exists */
- {
- int fd ;
- size_t pos = 14 ;
- char path[23 + 2 * UINT_FMT] = "/sys/dev/char/" ;
- pos += uint_fmt(path + pos, maj) ;
- path[pos++] = ':' ;
- pos += uint_fmt(path + pos, min) ;
- memcpy(path + pos, "/uevent", 8) ;
- fd = open_read(path) ;
- if (fd >= 0)
- {
- char buf[4097] ;
- buffer b = BUFFER_INIT(&fd_readv, fd, buf, 4097) ;
- size_t start = satmp.len ;
- int r ;
- for (;;)
- {
- satmp.len = start ;
- r = skagetln(&b, &satmp, '\n') ;
- if (r <= 0) break ;
- if ((satmp.len - start) > 8 && !memcmp(satmp.s + start, "DEVNAME=", 8)) break ;
- }
- fd_close(fd) ;
- if (r > 0)
- {
- satmp.s[satmp.len - 1] = 0 ;
- satmp.len = start ;
- memcpy(satmp.s + start + 3, "/dev/", 5) ;
- if (check(satmp.s + start + 3, ttynr))
- return stralloc_cats(sa, satmp.s + start + 8) && stralloc_0(sa) ;
- }
- }
- }
-
- /* Fallback: print explicit maj:min */
- {
- size_t pos = 1 ;
- char tmp[3 + 2 * UINT_FMT] = "(" ;
- pos += uint_fmt(tmp + pos, maj) ;
- tmp[pos++] = ':' ;
- pos += uint_fmt(tmp + pos, min) ;
- tmp[pos++] = ')' ;
- tmp[pos++] = 0 ;
- return stralloc_catb(sa, tmp, pos) ;
- }
-}
-
-int s6ps_ttycache_lookup (stralloc *sa, dev_t ttynr)
-{
- int wasnull = !satmp.s ;
- dius_t d = { .left = (uint32_t)ttynr, .right = satmp.len } ;
- uint32_t i ;
- if (!avltree_search(&ttycache_tree, &d.left, &i))
- {
- unsigned int n = genalloc_len(dius_t, &ttycache_index) ;
- if (!ttyguess(&satmp, ttynr)) return 0 ;
- if (!genalloc_append(dius_t, &ttycache_index, &d)) goto err ;
- if (!avltree_insert(&ttycache_tree, n))
- {
- genalloc_setlen(dius_t, &ttycache_index, n) ;
- goto err ;
- }
- i = n ;
- }
- return stralloc_cats(sa, satmp.s + genalloc_s(dius_t, &ttycache_index)[i].right) ;
- err:
- {
- int e = errno ;
- if (wasnull) stralloc_free(&satmp) ;
- else satmp.len = d.right ;
- errno = e ;
- }
- return 0 ;
-}
diff --git a/src/minutils/s6ps_wchan.c b/src/minutils/s6ps_wchan.c
deleted file mode 100644
index 209e1ef..0000000
--- a/src/minutils/s6ps_wchan.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/* ISC license. */
-
-#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 ;
-static genalloc ind = GENALLOC_ZERO ;
-
-int s6ps_wchan_init (char const *file)
-{
- if (file)
- {
- if (!openslurpclose(&sysmap, file)) return 0 ;
- }
- else
- {
- char *files[3] = { "/proc/kallsyms", 0, "/boot/System.map" } ;
- struct utsname uts ;
- size_t n ;
- if (uname(&uts) < 0) return 0 ;
- n = strlen(uts.release) ;
- {
- char buf[18 + n] ;
- unsigned int i = 0 ;
- memcpy(buf, "/boot/System.map", 16) ;
- buf[16] = '-' ;
- memcpy(buf + 17, uts.release, n + 1) ;
- files[1] = buf ;
- for (; i < 3 ; i++)
- if (openslurpclose(&sysmap, files[i])) break ;
- if (i >= 3) return 0 ;
- }
- }
- {
- size_t i = 0 ;
- if (!genalloc_append(size_t, &ind, &i)) goto err2 ;
- for (i = 1 ; i <= sysmap.len ; i++)
- if (sysmap.s[i-1] == '\n')
- if (!genalloc_append(size_t, &ind, &i)) goto err ;
- }
- return 1 ;
- err:
- genalloc_free(size_t, &ind) ;
- err2:
- stralloc_free(&sysmap) ;
- return 0 ;
-}
-
-void s6ps_wchan_finish (void)
-{
- genalloc_free(size_t, &ind) ;
- stralloc_free(&sysmap) ;
-}
-
-static inline size_t lookup (uint64_t addr, size_t *i)
-{
- size_t low = 0, mid, high = genalloc_len(size_t, &ind), len ;
- for (;;)
- {
- uint64_t cur ;
- mid = (low + high) >> 1 ;
- len = uint64_xscan(sysmap.s + genalloc_s(size_t, &ind)[mid], &cur) ;
- if (!len) return 0 ;
- if (cur == addr) break ;
- if (mid == low) return 0 ;
- if (addr < cur) high = mid ; else low = mid ;
- }
- *i = mid ;
- return len ;
-}
-
-int s6ps_wchan_lookup (stralloc *sa, uint64_t addr)
-{
- if (addr == (sizeof(void *) == 8 ? 0xffffffffffffffffULL : 0xffffffffUL))
- return stralloc_catb(sa, "*", 1) ;
- if (!addr) return stralloc_catb(sa, "-", 1) ;
- if (sysmap.len)
- {
- size_t i, pos, len = lookup(addr, &i) ;
- if (!len) return stralloc_catb(sa, "?", 1) ;
- pos = genalloc_s(size_t, &ind)[i] + len + 3 ;
- return stralloc_catb(sa, sysmap.s + pos, genalloc_s(size_t, &ind)[i+1] - 1 - pos) ;
- }
- if (!stralloc_readyplus(sa, UINT64_FMT + 3)) return 0 ;
- stralloc_catb(sa, "(0x", 3) ;
- sa->len += uint64_fmt(sa->s + sa->len, addr) ;
- stralloc_catb(sa, ")", 1) ;
- return 1 ;
-}