refactor: separate syscall interfaces from kernel space, into posix compliant structure.
[lunaix-os.git] / lunaix-os / kernel / demos / simple_sh.c
index 3a1e1bba33992c3ac0081cc3649f5add51d9cddd..26aa3bed4866026faea6a955b99f7e700cb7c537 100644 (file)
@@ -1,11 +1,13 @@
-#include <lunaix/fctrl.h>
-#include <lunaix/foptions.h>
 #include <lunaix/ioctl.h>
-#include <lunaix/lunistd.h>
-#include <lunaix/proc.h>
-#include <lunaix/signal.h>
 #include <lunaix/status.h>
 
+#include <usr/fcntl.h>
+#include <usr/signal.h>
+#include <usr/sys/dirent.h>
+#include <usr/sys/lunaix.h>
+#include <usr/sys/mann.h>
+#include <usr/unistd.h>
+
 #include <klibc/string.h>
 #include <ulibc/stdio.h>
 
@@ -99,9 +101,9 @@ do_ls(const char* path)
     if (fd < 0) {
         sh_printerr();
     } else {
-        struct dirent ent = { .d_offset = 0 };
+        struct lx_dirent ent = { .d_offset = 0 };
         int status;
-        while ((status = readdir(fd, &ent)) == 1) {
+        while ((status = sys_readdir(fd, &ent)) == 1) {
             if (ent.d_type == DT_DIR) {
                 printf(" \033[3m%s\033[39;49m\n", ent.d_name);
             } else {
@@ -116,13 +118,32 @@ do_ls(const char* path)
     }
 }
 
+void
+do_mcat(const char* file)
+{
+    int fd = open(file, 0);
+    if (fd < 0) {
+        sh_printerr();
+    } else {
+        void* p = mmap(NULL, 2048, 0, 0, fd, 0);
+        if ((int)p < 0) {
+            sh_printerr();
+        } else {
+            printf("%s\n", p);
+        }
+        munmap(p, 1);
+        close(fd);
+        printf("\n");
+    }
+}
+
 void
 sh_loop()
 {
     char buf[512];
     char *cmd, *argpart;
     pid_t p;
-    signal(_SIGINT, sigint_handle);
+    signal(SIGINT, sigint_handle);
 
     // set our shell as foreground process
     // (unistd.h:tcsetpgrp is essentially a wrapper of this)
@@ -161,6 +182,11 @@ sh_loop()
                 do_cat(argpart);
                 _exit(0);
             }
+        } else if (streq(cmd, "mcat")) {
+            if (!(p = fork())) {
+                do_mcat(argpart);
+                _exit(0);
+            }
         } else {
             printf("unknow command\n");
             goto cont;