fix: corner cases when printing large content through term interface
[lunaix-os.git] / lunaix-os / usr / cat.c
diff --git a/lunaix-os/usr/cat.c b/lunaix-os/usr/cat.c
new file mode 100644 (file)
index 0000000..9f0d35b
--- /dev/null
@@ -0,0 +1,43 @@
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#define BUFSIZE 4096
+
+static char buffer[BUFSIZE];
+
+int
+main(int argc, const char* argv[])
+{
+    int fd = 0;
+    int size = 0;
+    struct file_stat stat;
+    for (int i = 1; i < argc; i++) {
+        fd = open(argv[i], FO_RDONLY);
+                
+        if (fd < 0) {
+            printf("open failed: %s (error: %d)", argv[i], fd);
+            continue;
+        }
+
+        if (fstat(fd, &stat) < 0) {
+            printf("fail to get stat %d\n", errno);
+            return 1;
+        }
+
+        if (!(stat.mode & F_MFILE)) {
+            printf("%s is a directory", argv[i]);
+            return 1;
+        }
+
+        do {
+            size = read(fd, buffer, BUFSIZE);
+            write(stdout, buffer, size);
+        } while (size == BUFSIZE);
+
+        close(fd);
+    }
+
+    return 0;
+}
\ No newline at end of file