diff options
-rwxr-xr-x | buildkernel.sh | 3 | ||||
-rw-r--r-- | progs/shel/shel.c | 1 | ||||
-rw-r--r-- | sbin/devscan/devscan.c | 65 | ||||
-rw-r--r-- | sbin/init/init.c | 21 |
4 files changed, 80 insertions, 10 deletions
diff --git a/buildkernel.sh b/buildkernel.sh index 05bee7f..8c1ab44 100755 --- a/buildkernel.sh +++ b/buildkernel.sh @@ -6,11 +6,12 @@ rm -r init/* cp /usr/bin/dhcpcd build cp /usr/bin/ping build cp /usr/bin/nano build +cp /usr/bin/ls build/gls # cp /usr/bin/cat build rm lib/* rm lib64/* cp /usr/lib/libreadline.so.8 lib -# cp /usr/lib/libcap.so.2 lib +cp /usr/lib/libcap.so.2 lib cp /usr/lib/libc.so.6 lib # cp /usr/lib/libell.so.0 lib # cp /usr/lib/libgcc_s.so.1 lib diff --git a/progs/shel/shel.c b/progs/shel/shel.c index 323a06d..9de9a6f 100644 --- a/progs/shel/shel.c +++ b/progs/shel/shel.c @@ -66,6 +66,7 @@ void joinPath(char *result, const char *base, const char *rel) { } int main() { + write(1, "*", 1); char input[255] = {0}; char command[128] = {0}; char *argv[32] = {0}; 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(); } |