aboutsummaryrefslogtreecommitdiff
path: root/sys/cmd/cat
diff options
context:
space:
mode:
Diffstat (limited to 'sys/cmd/cat')
-rw-r--r--sys/cmd/cat/cat.c40
-rw-r--r--sys/cmd/cat/rules.mk24
-rw-r--r--sys/cmd/cat/test.c8
3 files changed, 72 insertions, 0 deletions
diff --git a/sys/cmd/cat/cat.c b/sys/cmd/cat/cat.c
new file mode 100644
index 0000000..847ec0c
--- /dev/null
+++ b/sys/cmd/cat/cat.c
@@ -0,0 +1,40 @@
+#include <u.h>
+#include <libn.h>
+
+static
+void
+cat(Stream *f, byte *name)
+{
+ long n;
+ byte buf[8192];
+
+ while(n = io·read(f, 1, arrlen(buf), buf), n > 0) {
+ if (io·write(stdout, 1, n, buf) != n) {
+ panicf("failed to write while copying stream '%s'", name);
+ }
+ }
+
+ if (n < 0) {
+ panicf("failed to read from buffer '%s'", name);
+ }
+}
+
+
+int
+main(int argc, char *argv[])
+{
+ int i;
+ Stream *f;
+
+ if (argc == 1) {
+ f = stdin;
+ cat(f, "<stdin>");
+ } else for (i = 1; i < argc; i++) {
+ if (f = io·open(argv[i], "r"), f == nil)
+ panicf("can't open %s", argv[i]);
+ cat(f, argv[i]);
+ io·close(f);
+ }
+
+ exit(0);
+}
diff --git a/sys/cmd/cat/rules.mk b/sys/cmd/cat/rules.mk
new file mode 100644
index 0000000..e4ac480
--- /dev/null
+++ b/sys/cmd/cat/rules.mk
@@ -0,0 +1,24 @@
+include share/push.mk
+
+# Iterate through subdirectory tree
+
+# Local sources
+SRCS_$(d) := $(d)/cat.c
+
+LIBS_$(d) :=
+BINS_$(d) := $(d)/cat
+TSTS_$(d) :=
+
+include share/paths.mk
+
+$(LIBS_$(d)): $(OBJS_$(d))
+ $(ARCHIVE)
+
+$(BINS_$(d)): TCLIBS := $(OBJ_DIR)/libn/libn.a
+$(BINS_$(d)): $(OBJS_$(d)) $(TCLIBS)
+ $(LINK)
+
+$(UNTS_$(d)): $(TOBJS_$(d)) $(LIBS_$(d))
+ $(LINK)
+
+include share/pop.mk
diff --git a/sys/cmd/cat/test.c b/sys/cmd/cat/test.c
new file mode 100644
index 0000000..c1b850e
--- /dev/null
+++ b/sys/cmd/cat/test.c
@@ -0,0 +1,8 @@
+#include <u.h>
+#include <libn.h>
+
+error
+main()
+{
+ return 0;
+}