summary refs log tree commit diff
diff options
context:
space:
mode:
authorWlodekM <[email protected]>2025-02-19 10:24:56 +0200
committerWlodekM <[email protected]>2025-02-19 10:24:56 +0200
commit3cafac0479d25ec70375712576ad2d965d10ebac (patch)
treed013c36a26406e1884bb2f9362760cb897bb2172
parent4583635f5d11cc7aa6d71ccba0ceea5644d9e02b (diff)
devscan and stuff
-rwxr-xr-xbuildkernel.sh3
-rw-r--r--progs/shel/shel.c1
-rw-r--r--sbin/devscan/devscan.c65
-rw-r--r--sbin/init/init.c21
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();
     }