commit 1dc25793db15906ee4197974bc96d3f91989af59
parent 4fe3c8ccddabb7207a46672ac2d7212ba2304e64
Author: sin <sin@2f30.org>
Date: Thu, 6 Feb 2014 11:35:43 +0000
Do not embed sinit.c - use our git repo
Diffstat:
M | pkgs/sinit | | | 16 | ++++++++++++---- |
D | stuff/sinit.c | | | 133 | ------------------------------------------------------------------------------- |
2 files changed, 12 insertions(+), 137 deletions(-)
diff --git a/pkgs/sinit b/pkgs/sinit
@@ -1,13 +1,21 @@
+url=git://git.2f30.org/sinit
+
fetch() {
- cp $top/stuff/sinit.c src
+ [ -d src/sinit ] || git clone $url src/sinit
}
build() {
- pushd src
- x86_64-linux-musl-gcc -o init sinit.c -static || return 1
+ pushd src/sinit
+ make clean
+ make -j$nprocs CC=x86_64-linux-musl-gcc LDFLAGS=-static || return 1
popd
}
install() {
- cp src/init $root/
+ pushd src/sinit
+ make PREFIX=$root install
+ popd
+ pushd $root/bin
+ ln -sf sinit init
+ popd
}
diff --git a/stuff/sinit.c b/stuff/sinit.c
@@ -1,133 +0,0 @@
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/select.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#define LEN(x) (sizeof (x) / sizeof *(x))
-
-typedef union {
- int i;
- unsigned int ui;
- float f;
- const void *v;
-} Arg;
-
-typedef struct {
- const char *name;
- void (*func)(const Arg *arg);
- const Arg arg;
-} Command;
-
-static void cmdpoweroff(const Arg *);
-static void cmdreboot(const Arg *);
-static void dispatchcmd(int);
-static int spawn(const char *, char *const []);
-
-static const char *fifopath = "/var/run/sinit.fifo";
-static Command commands[] = {
- { "poweroff", cmdpoweroff, {0} },
- { "reboot", cmdreboot, {0} },
-};
-
-int
-main(void)
-{
- sigset_t set;
- pid_t pid;
- fd_set rfds;
- int c, fd, n;
-
- if (getpid() != 1)
- return EXIT_FAILURE;
-
- sigfillset(&set);
- sigprocmask(SIG_BLOCK, &set, 0);
-
- pid = fork();
- if (pid < 0)
- return EXIT_FAILURE;
- if (pid > 0)
- for (;;)
- wait(&c);
-
- sigprocmask(SIG_UNBLOCK, &set, 0);
-
- spawn("/bin/rc", (char *[]){ "rc", NULL });
-
- unlink(fifopath);
- umask(0);
- mkfifo(fifopath, 0600);
-
- fd = open(fifopath, O_RDWR | O_NONBLOCK);
- if (fd >= 0) {
- while (1) {
- FD_ZERO(&rfds);
- FD_SET(fd, &rfds);
- n = select(fd + 1, &rfds, NULL, NULL, NULL);
- if (n <= 0)
- continue;
- if (FD_ISSET(fd, &rfds))
- dispatchcmd(fd);
- }
- }
-
- /* can't reach */
- return EXIT_SUCCESS;
-}
-
-static void
-cmdpoweroff(const Arg *arg)
-{
- spawn("/bin/rc.shutdown", (char *[]) { "rc", "poweroff", NULL });
-}
-
-static void
-cmdreboot(const Arg *arg)
-{
- spawn("/bin/rc.shutdown", (char *[]) { "rc", "reboot", NULL });
-}
-
-static void
-dispatchcmd(int fd)
-{
- int i;
- char buf[BUFSIZ], *p;
- ssize_t n;
-
- n = read(fd, buf, sizeof(buf) - 1);
- if (n <= 0)
- return;
- buf[n] = '\0';
- p = strchr(buf, '\n');
- if (p)
- *p = '\0';
- for (i = 0; i < LEN(commands); i++) {
- if (strcmp(commands[i].name, buf) == 0) {
- commands[i].func(&commands[i].arg);
- break;
- }
- }
-}
-
-static int
-spawn(const char *file, char *const argv[])
-{
- pid_t pid;
-
- pid = fork();
- if (pid < 0)
- return -1;
- if (pid == 0) {
- setsid();
- setpgid(0, 0);
- execvp(file, argv);
- _exit(errno == ENOENT ? 127 : 126);
- }
-}