Skip to content

Instantly share code, notes, and snippets.

@rofl0r
Created August 6, 2013 21:15
Show Gist options
  • Save rofl0r/6168719 to your computer and use it in GitHub Desktop.
Save rofl0r/6168719 to your computer and use it in GitHub Desktop.
minimal init daemon by rich felker, author of musl libc
#define _XOPEN_SOURCE 700
#include <signal.h>
#include <unistd.h>
int main()
{
sigset_t set;
int status;
if (getpid() != 1) return 1;
sigfillset(&set);
sigprocmask(SIG_BLOCK, &set, 0);
if (fork()) for (;;) wait(&status);
sigprocmask(SIG_UNBLOCK, &set, 0);
setsid();
setpgid(0, 0);
return execve("/etc/rc", (char *[]){ "rc", 0 }, (char *[]){ 0 });
}
@furrybrackets
Copy link

For those confused, all this code does is:

  1. Get the process ID of the current process.
  2. If the process ID is not 1, return 1 (error).
  3. Fill the signal set with all current signals.
  4. Block all signals via the SIG_BLOCK constant.
  5. If a fork is successful, wait for the child to exit.
  6. Unblock all signals.
  7. Set the session ID of the process to the process ID.
  8. Execute the /etc/rc script.

@Alleop5
Copy link

Alleop5 commented Apr 3, 2023

Is it not possible to straight up execute the /etc/rc script? Just by adding init=/etc/rc to the kernel command line?

@abrendtro
Copy link

Just go outside instead of turning on your computer. It uses 0B of disk space

@Alleop5
Copy link

Alleop5 commented May 17, 2023

I'm 100% sure this is way too slow. We need to write this in assembly. So that it'll fit in 1 sector of a drive.

@abrendtro
Copy link

I like shell scripts that don't need to be recompiled... A mount -a && /etc/rc works just fine

@yurayko
Copy link

yurayko commented Nov 25, 2023

Is it not possible to straight up execute the /etc/rc script? Just by adding init=/etc/rc to the kernel command line?

You need a always running daemon, who will be reap a zombie. It is single work for init.
If you redirect this job to /etc/rc, you got a systemd again.
You cannot start an another daemon from /etc/rc for this. Zombie go to process with PID 1. /etc/rc have a PID 1 in your case.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment