diff options
Diffstat (limited to 'sbin')
-rw-r--r-- | sbin/devscan/devscan.c | 65 | ||||
-rw-r--r-- | sbin/init/init.c | 21 |
2 files changed, 77 insertions, 9 deletions
diff --git a/sbin/devscan/devscan.c b/sbin/devscan/devscan.c new file mode 100644 index 0000000..f3f10b4 --- /dev/null +++ b/sbin/devscan/devscan.c @@ -0,0 +1,65 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <fcntl.h> +#include <dirent.h> +#include <sys/sysmacros.h> +#include <sys/mount.h> + +void create_block_device(const char *name, int major, int minor) { + char path[256]; + snprintf(path, sizeof(path), "/dev/%s", name); + + if (mknod(path, S_IFBLK | 0660, makedev(major, minor)) < 0) { + perror("mknod"); + } else { + printf("Created %s (major %d, minor %d)\n", path, major, minor); + } +} + +void scan_and_create_devices() { + DIR *dir = opendir("/sys/block/"); + if (!dir) { + // perror("opendir /sys/block"); + return; + } + + struct dirent *entry; + while ((entry = readdir(dir))) { + if (entry->d_name[0] == '.') continue; // Skip "." and ".." + + char sys_path[256]; + snprintf(sys_path, sizeof(sys_path), "/sys/block/%s/dev", entry->d_name); + + FILE *f = fopen(sys_path, "r"); + if (!f) continue; + + int major, minor; + if (fscanf(f, "%d:%d", &major, &minor) == 2) { + create_block_device(entry->d_name, major, minor); + } + + fclose(f); + } + + closedir(dir); +} + +int main() { + mount("devtmpfs", "/dev", "devtmpfs", 0, NULL); + mkdir("/sys", 0755); + mount("sysfs", "/sys", "sysfs", 0, NULL); + mkdir("/dev", 0755); + // create_block_device("sda", 8, 0); + // create_block_device("sda1", 8, 1); + // create_block_device("sda2", 8, 2); + // create_block_device("sdb", 8, 16); + // create_block_device("sdb1", 8, 17); + // create_block_device("sdb2", 8, 18); + while (1) { + scan_and_create_devices(); + sleep(10); // Check every 10 seconds + } +} diff --git a/sbin/init/init.c b/sbin/init/init.c index 56df6a6..d2fa095 100644 --- a/sbin/init/init.c +++ b/sbin/init/init.c @@ -5,15 +5,18 @@ int main() { __pid_t forkResult = fork(); if (forkResult == 0) { //TODO - eventually add device scan - // __pid_t forkResult = fork(); - // if (forkResult == 0) { - // execve("/sbin/", 0, 0) - // } else { - // execve("/sbin/", 0, 0) - // } - - // make tty1 - execve("/sbin/fdmaker", 0, 0); + __pid_t forkResult = fork(); + if (forkResult == 0) { + execve("/sbin/devscan", 0, 0); + } else { + write(1, "press RETURN to", 15); + char a[2] = {0}; + read(0, a, 1); + // make tty1 + execve("/sbin/fdmaker", 0, 0); + } + // execve("/sbin/devscan", 0, 0); + // execve("/sbin/fdmaker", 0, 0); } else { pause(); } |