diff --git a/app/AppDelegate.m b/app/AppDelegate.m index 19d76b2ff9..2508b18c99 100644 --- a/app/AppDelegate.m +++ b/app/AppDelegate.m @@ -89,27 +89,7 @@ - (int)boot { FsInitialize(); - // create some device nodes - // this will do nothing if they already exist - generic_mknodat(AT_PWD, "/dev/tty1", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 1)); - generic_mknodat(AT_PWD, "/dev/tty2", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 2)); - generic_mknodat(AT_PWD, "/dev/tty3", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 3)); - generic_mknodat(AT_PWD, "/dev/tty4", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 4)); - generic_mknodat(AT_PWD, "/dev/tty5", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 5)); - generic_mknodat(AT_PWD, "/dev/tty6", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 6)); - generic_mknodat(AT_PWD, "/dev/tty7", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 7)); - - generic_mknodat(AT_PWD, "/dev/tty", S_IFCHR|0666, dev_make(TTY_ALTERNATE_MAJOR, DEV_TTY_MINOR)); - generic_mknodat(AT_PWD, "/dev/console", S_IFCHR|0666, dev_make(TTY_ALTERNATE_MAJOR, DEV_CONSOLE_MINOR)); - generic_mknodat(AT_PWD, "/dev/ptmx", S_IFCHR|0666, dev_make(TTY_ALTERNATE_MAJOR, DEV_PTMX_MINOR)); - - generic_mknodat(AT_PWD, "/dev/null", S_IFCHR|0666, dev_make(MEM_MAJOR, DEV_NULL_MINOR)); - generic_mknodat(AT_PWD, "/dev/zero", S_IFCHR|0666, dev_make(MEM_MAJOR, DEV_ZERO_MINOR)); - generic_mknodat(AT_PWD, "/dev/full", S_IFCHR|0666, dev_make(MEM_MAJOR, DEV_FULL_MINOR)); - generic_mknodat(AT_PWD, "/dev/random", S_IFCHR|0666, dev_make(MEM_MAJOR, DEV_RANDOM_MINOR)); - generic_mknodat(AT_PWD, "/dev/urandom", S_IFCHR|0666, dev_make(MEM_MAJOR, DEV_URANDOM_MINOR)); - - generic_mkdirat(AT_PWD, "/dev/pts", 0755); + create_some_device_nodes(); // Permissions on / have been broken for a while, let's fix them generic_setattrat(AT_PWD, "/", (struct attr) {.type = attr_mode, .mode = 0755}, false); diff --git a/kernel/init.c b/kernel/init.c index 52cda4a8c5..c1117b5366 100644 --- a/kernel/init.c +++ b/kernel/init.c @@ -3,9 +3,11 @@ #include #include "fs/devices.h" #include "fs/fd.h" +#include "fs/path.h" #include "fs/real.h" #include "fs/tty.h" #include "kernel/calls.h" +#include "kernel/fs.h" #include "kernel/init.h" #include "kernel/personality.h" @@ -125,6 +127,30 @@ void set_console_device(int major, int minor) { console_minor = minor; } +void create_some_device_nodes(void) { + // create some device nodes + // this will do nothing if they already exist + generic_mknodat(AT_PWD, "/dev/tty1", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 1)); + generic_mknodat(AT_PWD, "/dev/tty2", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 2)); + generic_mknodat(AT_PWD, "/dev/tty3", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 3)); + generic_mknodat(AT_PWD, "/dev/tty4", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 4)); + generic_mknodat(AT_PWD, "/dev/tty5", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 5)); + generic_mknodat(AT_PWD, "/dev/tty6", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 6)); + generic_mknodat(AT_PWD, "/dev/tty7", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 7)); + + generic_mknodat(AT_PWD, "/dev/tty", S_IFCHR|0666, dev_make(TTY_ALTERNATE_MAJOR, DEV_TTY_MINOR)); + generic_mknodat(AT_PWD, "/dev/console", S_IFCHR|0666, dev_make(TTY_ALTERNATE_MAJOR, DEV_CONSOLE_MINOR)); + generic_mknodat(AT_PWD, "/dev/ptmx", S_IFCHR|0666, dev_make(TTY_ALTERNATE_MAJOR, DEV_PTMX_MINOR)); + + generic_mknodat(AT_PWD, "/dev/null", S_IFCHR|0666, dev_make(MEM_MAJOR, DEV_NULL_MINOR)); + generic_mknodat(AT_PWD, "/dev/zero", S_IFCHR|0666, dev_make(MEM_MAJOR, DEV_ZERO_MINOR)); + generic_mknodat(AT_PWD, "/dev/full", S_IFCHR|0666, dev_make(MEM_MAJOR, DEV_FULL_MINOR)); + generic_mknodat(AT_PWD, "/dev/random", S_IFCHR|0666, dev_make(MEM_MAJOR, DEV_RANDOM_MINOR)); + generic_mknodat(AT_PWD, "/dev/urandom", S_IFCHR|0666, dev_make(MEM_MAJOR, DEV_URANDOM_MINOR)); + + generic_mkdirat(AT_PWD, "/dev/pts", 0755); +} + int create_stdio(const char *file, int major, int minor) { struct fd *fd = generic_open(file, O_RDWR_, 0); if (IS_ERR(fd)) { diff --git a/kernel/init.h b/kernel/init.h index b52bc6cc68..45f10546a6 100644 --- a/kernel/init.h +++ b/kernel/init.h @@ -8,6 +8,7 @@ int mount_root(const struct fs_ops *fs, const char *source); void set_console_device(int major, int minor); int become_first_process(void); int become_new_init_child(void); +void create_some_device_nodes(void); int create_stdio(const char *file, int major, int minor); int create_piped_stdio(void); diff --git a/main.c b/main.c index e4040e192a..61c9a28958 100644 --- a/main.c +++ b/main.c @@ -1,6 +1,7 @@ #include #include #include "kernel/calls.h" +#include "kernel/init.h" #include "kernel/task.h" #include "xX_main_Xx.h" @@ -13,6 +14,7 @@ int main(int argc, char *const argv[]) { fprintf(stderr, "xX_main_Xx: %s\n", strerror(-err)); return err; } + create_some_device_nodes(); do_mount(&procfs, "proc", "/proc", "", 0); do_mount(&devptsfs, "devpts", "/dev/pts", "", 0); task_run_current();