#define _DEFAULT_SOURCE #define _POSIX_C_SOURCE 200809L #include #include #include #include #include #include #include #include void create_vfs(void) { if (mkdir("/proc", 0755) != 0 && errno != EEXIST) { perror("proc"); } if (mkdir("/sys", 0755) != 0 && errno != EEXIST) { perror("sys"); } if (mkdir("/dev", 0755) != 0 && errno != EEXIST) { perror("dev"); } if (mkdir("/run", 0755) != 0 && errno != EEXIST) { perror("run"); } } void mount_vfs(void) { if (mount("proc", "/proc", "proc", MS_NOSUID | MS_NODEV | MS_NOEXEC | MS_RELATIME, NULL) != 0 && errno != EBUSY) { perror("mount /proc"); } if (mount("sys", "/sys", "sysfs", MS_NOSUID | MS_NODEV | MS_NOEXEC | MS_RELATIME, NULL) != 0 && errno != EBUSY) { perror("mount /sys"); } if (mount("dev", "/dev", "devtmpfs", MS_NOSUID | MS_RELATIME, "mode=755") != 0 && errno != EBUSY) { perror("mount /dev"); } if (mount("run", "/run", "tmpfs", MS_NOSUID | MS_NODEV | MS_RELATIME, "mode=755") != 0 && errno != EBUSY) { perror("mount /run"); } mkdir("/dev/pts", 0755); mkdir("/dev/shm", 1777); if (mount("devpts", "/dev/pts", "devpts", MS_NOSUID | MS_NOEXEC | MS_RELATIME, "gid=5,mode=620") != 0 && errno != EBUSY) { perror("mount /dev/pts"); } if (mount("shm", "/dev/shm", "tmpfs", MS_NOSUID | MS_NODEV | MS_RELATIME, "mode=1777") != 0 && errno != EBUSY) { perror("mount /dev/shm"); } } void set_hostname(void) { char buf[256]; int fd = open("/etc/hostname", O_RDONLY); if (fd < 0) { perror("open /etc/hostname"); return; } ssize_t bytes_read = read(fd, buf, sizeof(buf) - 1); close(fd); if (bytes_read > 0) { buf[bytes_read] = '\0'; size_t len = strcspn(buf, "\r\n "); buf[len] = '\0'; if (sethostname(buf, len) != 0) { perror("sethostname"); } } } int main(void) { create_vfs(); mount_vfs(); int fd = open("/dev/console", O_RDWR); if (fd >= 0) { dup2(fd, 0); dup2(fd, 1); dup2(fd, 2); if (fd > 2) { close(fd); } } else { perror("console"); } set_hostname(); return 0; }