summaryrefslogtreecommitdiff
path: root/sub/initramfs
diff options
context:
space:
mode:
Diffstat (limited to 'sub/initramfs')
-rw-r--r--sub/initramfs/Makefile10
-rw-r--r--sub/initramfs/kill.c55
2 files changed, 63 insertions, 2 deletions
diff --git a/sub/initramfs/Makefile b/sub/initramfs/Makefile
index f175735..debab53 100644
--- a/sub/initramfs/Makefile
+++ b/sub/initramfs/Makefile
@@ -1,11 +1,17 @@
# The initramfs
-INITRAMFS_SKARNET_LIST := cd execlineb export if redirfd s6-echo s6-mount mdevd-coldplug mdevd
+INITRAMFS_SKARNET_LIST := background cd execlineb export fdclose fdmove forstdin if importas piperw pipeline redirfd s6-echo s6-mount mdevd-coldplug mdevd
-$(OUTPUT)/tmp/.lh_initramfs_installed: $(OUTPUT)/tmp/.lh_layout_copied $(OUTPUT)/build-host/.lh_skarnet_installed
+$(OUTPUT)/tmp/.lh_initramfs_installed: $(OUTPUT)/tmp/.lh_layout_copied $(OUTPUT)/build-host/.lh_skarnet_installed $(OUTPUT)/initramfs/bin/kill
for i in $(INITRAMFS_SKARNET_LIST) ; do cp -f -L $(OUTPUT)/rootfs/command/$$i $(OUTPUT)/initramfs/command/$$i ; done
exec setuidgid $(NORMALUSER) touch $@
+$(OUTPUT)/initramfs/bin/kill: $(OUTPUT)/tmp/kill
+ exec cp -f $< $@
+
+$(OUTPUT)/tmp/kill: $(OUTPUT)/build-host/.lh_skarnet_installed sub/initramfs/kill.c $(OUTPUT)/build-host/bin/muslgcc
+ exec setuidgid $(NORMALUSER) $(OUTPUT)/build-host/bin/muslgcc -O2 -pipe -s -static -fomit-frame-pointer -fno-exceptions -fno-unwind-tables -fno-asynchronous-unwind-tables -Wa,--noexecstack -fno-stack-protector -ffunction-sections -fdata-sections -Wl,--sort-section=alignment -Wl,--sort-common -Wl,--gc-sections -o $@ -I$(OUTPUT)/rootfs/package/prog/skalibs/include -L$(OUTPUT)/rootfs/package/prog/skalibs/library sub/initramfs/kill.c -lskarnet
+
$(OUTPUT)/initramfs.img.gz: $(OUTPUT)/tmp/.lh_initramfs_installed
cd $(OUTPUT)/initramfs && find . | cpio -o --format=newc > ../initramfs.img && cd .. && rm -f $@ && gzip -9 initramfs.img
diff --git a/sub/initramfs/kill.c b/sub/initramfs/kill.c
new file mode 100644
index 0000000..9279a77
--- /dev/null
+++ b/sub/initramfs/kill.c
@@ -0,0 +1,55 @@
+ /* GPLv2 license. */
+
+#include <skalibs/nonposix.h>
+#include <signal.h>
+#include <skalibs/types.h>
+#include <skalibs/sgetopt.h>
+#include <skalibs/strerr2.h>
+#include <skalibs/sig.h>
+#include <skalibs/nsig.h>
+
+#define USAGE "kill [ -s SIGNAME ] pids..."
+#define dieusage() strerr_dieusage(100, USAGE)
+
+int main (int argc, char const *const *argv)
+{
+ int sig = 15 ;
+ PROG = "kill" ;
+ {
+ subgetopt_t l = SUBGETOPT_ZERO ;
+ for (;;)
+ {
+ int opt = subgetopt_r(argc, argv, "s:", &l) ;
+ if (opt == -1) break ;
+ switch (opt)
+ {
+ case 's':
+ {
+ sig = sig_number(l.arg) ;
+ if (!sig)
+ {
+ unsigned int u ;
+ if (!uint0_scan(l.arg, &u)) dieusage() ;
+ if (u > SKALIBS_NSIG) dieusage() ;
+ sig = u ;
+ }
+ break ;
+ }
+ default : dieusage() ;
+ }
+ }
+ argc -= l.ind ; argv += l.ind ;
+ }
+ if (!argc) dieusage() ;
+
+ {
+ pid_t pids[argc] ;
+ for (unsigned int i = 0 ; i < argc ; i++)
+ if (!pid0_scan(argv[i], pids + i)) dieusage() ;
+ for (unsigned int i = 0 ; i < argc ; i++)
+ if (kill(pids[i], sig) < 0)
+ strerr_warnwu2sys("kill pid ", argv[i]) ;
+ }
+ return 0 ;
+}
+