39 lines
1.0 KiB
C
39 lines
1.0 KiB
C
|
#include <errno.h>
|
||
|
#include <fcntl.h>
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <sys/stat.h>
|
||
|
#include <sys/sysmacros.h>
|
||
|
#include <unistd.h>
|
||
|
|
||
|
#define xmknod(path, mode, maj, min) \
|
||
|
if (mknod(path, mode, makedev(maj, min)) < 0) exit(255);
|
||
|
|
||
|
// Too early for console logs (/dev/console is created here!), so we have to resort to exiting with a weird exit code in
|
||
|
// case of failure.
|
||
|
static void populate_devfs()
|
||
|
{
|
||
|
if (mkdir("/dev", 0755) < 0 && errno != EEXIST) exit(255);
|
||
|
|
||
|
xmknod("/dev/console", 0666, 1, 0);
|
||
|
xmknod("/dev/null", 0666, 2, 0);
|
||
|
}
|
||
|
|
||
|
int main()
|
||
|
{
|
||
|
if (getpid() != 1)
|
||
|
{
|
||
|
printf("error: init not running as PID 1.\n");
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
populate_devfs();
|
||
|
|
||
|
// Before this point, we don't even have an stdout and stderr. Set it up now so that child processes (and us) can
|
||
|
// print stuff.
|
||
|
stdout = fopen("/dev/console", "w");
|
||
|
stderr = fopen("/dev/console", "w");
|
||
|
|
||
|
fputs("Hello, world!", stderr);
|
||
|
}
|