#include #include #include #include #include #include void show_motd() { int fd = open("/etc/motd", O_RDONLY | O_CLOEXEC); if (fd < 0) { if (errno != ENOENT) { perror("open"); } return; } FILE* fp = fdopen(fd, "r"); if (!fp) { perror("fopen"); return; } char buf[4096]; size_t nread = fread(buf, sizeof(buf) - 1, 1, fp); if (ferror(fp)) { perror("fread"); fclose(fp); return; } buf[nread] = 0; puts(buf); fclose(fp); putchar('\n'); } int main() { if (getpid() != 1) { fprintf(stderr, "init must be started as PID 1\n"); return 1; } if (getuid() != 0) { fprintf(stderr, "init must be started as root\n"); return 1; } show_motd(); pid_t child = fork(); if (child < 0) { perror("fork"); return 1; } if (child == 0) { char* argv[] = {"/bin/session", NULL}; execv(argv[0], argv); perror("execv"); return 1; } pid_t result; for (;;) { result = wait(NULL); if (result == child) return 0; } }