hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/user
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2026-10-08 22:23:55 +0200
committerhachem <im@hachem.wtf>2026-10-08 22:23:55 +0200
commit852a5b237116e8b53ae18ea8ea00505e44b40dfe (patch)
tree1ed51afcf6471d2a0031d31b67b63f4ec404b9ed /user
parentef104148057ab98f80b1560405b5c02768457096 (diff)
feat: file descriptor and proper stdio
Diffstat (limited to 'user')
-rw-r--r--user/chat.c33
-rw-r--r--user/hexview.c16
-rw-r--r--user/save.c34
-rw-r--r--user/user.h58
4 files changed, 106 insertions, 35 deletions
diff --git a/user/chat.c b/user/chat.c
new file mode 100644
index 0000000..67bc727
--- /dev/null
+++ b/user/chat.c
@@ -0,0 +1,33 @@
+#include "user.h"
+
+void _start(const char* arg, unsigned long arglen)
+{
+ if (arglen == 0)
+ {
+ put("usage: run chat <path>\n");
+ sys_exit(1);
+ }
+
+ char path[128];
+ unsigned long i = 0;
+ for (; i < arglen && i < sizeof(path) - 1; i++)
+ path[i] = arg[i];
+ path[i] = 0;
+
+ long fd = sys_open(path, 0);
+ if (fd < 0)
+ {
+ put("chat: ");
+ put(path);
+ put(": cannot open\n");
+ sys_exit(1);
+ }
+
+ char buffer[256];
+ long n;
+ while ((n = sys_read(fd, buffer, sizeof(buffer))) > 0)
+ sys_write(1, buffer, (unsigned long)n);
+
+ sys_close(fd);
+ sys_exit(0);
+}
diff --git a/user/hexview.c b/user/hexview.c
index c211b44..5eac27c 100644
--- a/user/hexview.c
+++ b/user/hexview.c
@@ -5,7 +5,7 @@ static const char HEX[] = "0123456789abcdef";
static void put_hex8(unsigned char byte)
{
char digits[2] = { HEX[byte >> 4], HEX[byte & 15] };
- sys_write(digits, 2);
+ sys_write(1, digits, 2);
}
static void put_hex32(unsigned long value)
@@ -13,7 +13,7 @@ static void put_hex32(unsigned long value)
char digits[8];
for (int nibble = 0; nibble < 8; nibble++)
digits[nibble] = HEX[(value >> ((7 - nibble) * 4)) & 15];
- sys_write(digits, 8);
+ sys_write(1, digits, 8);
}
#define PAGE 256
@@ -67,7 +67,7 @@ void _start(const char* arg, unsigned long arglen)
if (row + column < count)
{
put_hex8((unsigned char)buffer[row + column]);
- sys_write(" ", 1);
+ sys_write(1, " ", 1);
}
else
put(" ");
@@ -78,19 +78,19 @@ void _start(const char* arg, unsigned long arglen)
{
char character = buffer[row + column];
if (character >= 32 && character < 127)
- sys_write(&character, 1);
+ sys_write(1, &character, 1);
else
- sys_write(".", 1);
+ sys_write(1, ".", 1);
}
put("\n");
}
put("[n]ext [p]rev [q]uit (or up/down arrows) > ");
- char key = (char)sys_read();
+ char key = (char)get_char();
if (key == 27) // ESC
{
- sys_read();
- char final = (char)sys_read();
+ get_char();
+ char final = (char)get_char();
if (final == 'A')
key = 'p';
else if (final == 'B')
diff --git a/user/save.c b/user/save.c
index b3664f4..48e1930 100644
--- a/user/save.c
+++ b/user/save.c
@@ -2,23 +2,30 @@
void _start(const char* arg, unsigned long arglen)
{
- if (arglen == 0 || arglen >= 64)
+ if (arglen == 0 || arglen >= 120)
{
put("usage: run save <path>\n");
sys_exit(1);
}
- char name[64];
+ char name[128];
for (unsigned long i = 0; i < arglen; i++)
name[i] = arg[i];
name[arglen] = 0;
+ long fd = sys_open(name, O_CREAT | O_TRUNC | O_WRONLY);
+ if (fd < 0)
+ {
+ put("save: ");
+ put(name);
+ put(": cannot open\n");
+ sys_exit(1);
+ }
+
put("saving to ");
put(name);
put(" -- type lines, a single . saves\n");
- char buffer[4096];
- int length = 0;
for (;;)
{
char line[256];
@@ -26,20 +33,13 @@ void _start(const char* arg, unsigned long arglen)
put("\n");
if (n == 1 && line[0] == '.')
break;
- for (int i = 0; i < n && length < 4000; i++)
- buffer[length++] = line[i];
- if (length < 4000)
- buffer[length++] = '\n';
+ sys_write(fd, line, (unsigned long)n);
+ sys_write(fd, "\n", 1);
}
- if (sys_fs_write(name, buffer, (unsigned long)length))
- {
- put("saved ");
- put(name);
- put("\n");
- }
- else
- put("write failed\n");
-
+ sys_close(fd);
+ put("saved ");
+ put(name);
+ put("\n");
sys_exit(0);
}
diff --git a/user/user.h b/user/user.h
index 635dc86..34710ac 100644
--- a/user/user.h
+++ b/user/user.h
@@ -1,16 +1,44 @@
-// shared syscall stubs
+#define SEEK_SET 0
+#define SEEK_CUR 1
+#define SEEK_END 2
-static long sys_write(const char* buffer, unsigned long length)
+#define O_WRONLY 1
+#define O_CREAT 0x40
+#define O_TRUNC 0x200
+#define O_APPEND 0x400
+
+static long sys_write(long fd, const char* buffer, unsigned long length)
+{
+ long result;
+ __asm__ volatile("int $0x80" : "=a"(result) : "a"(1L), "D"(fd), "S"(buffer), "d"(length) : "memory");
+ return result;
+}
+
+static long sys_read(long fd, char* buffer, unsigned long length)
+{
+ long result;
+ __asm__ volatile("int $0x80" : "=a"(result) : "a"(2L), "D"(fd), "S"(buffer), "d"(length) : "memory");
+ return result;
+}
+
+static long sys_open(const char* path, long flags)
+{
+ long result;
+ __asm__ volatile("int $0x80" : "=a"(result) : "a"(7L), "D"(path), "S"(flags) : "memory");
+ return result;
+}
+
+static long sys_close(long fd)
{
long result;
- __asm__ volatile("int $0x80" : "=a"(result) : "a"(1L), "D"(buffer), "S"(length) : "memory");
+ __asm__ volatile("int $0x80" : "=a"(result) : "a"(8L), "D"(fd) : "memory");
return result;
}
-static long sys_read(void)
+static long sys_lseek(long fd, long offset, long whence)
{
long result;
- __asm__ volatile("int $0x80" : "=a"(result) : "a"(2L) : "memory");
+ __asm__ volatile("int $0x80" : "=a"(result) : "a"(9L), "D"(fd), "S"(offset), "d"(whence) : "memory");
return result;
}
@@ -52,7 +80,15 @@ static void put(const char* string)
unsigned long length = 0;
while (string[length])
length++;
- sys_write(string, length);
+ sys_write(1, string, length);
+}
+
+static int get_char(void)
+{
+ char c;
+ if (sys_read(0, &c, 1) <= 0)
+ return -1;
+ return (unsigned char)c;
}
static int read_line(char* buffer, int max_length)
@@ -60,7 +96,9 @@ static int read_line(char* buffer, int max_length)
int length = 0;
for (;;)
{
- char character = (char)sys_read();
+ char character;
+ if (sys_read(0, &character, 1) <= 0)
+ break;
if (character == '\n')
break;
if (character == '\b')
@@ -68,14 +106,14 @@ static int read_line(char* buffer, int max_length)
if (length > 0)
{
length--;
- sys_write("\b \b", 3);
+ sys_write(1, "\b \b", 3);
}
continue;
}
if (length < max_length - 1)
{
buffer[length++] = character;
- sys_write(&character, 1);
+ sys_write(1, &character, 1);
}
}
buffer[length] = 0;
@@ -108,5 +146,5 @@ static void put_int(long value)
buffer[right] = swap;
}
- sys_write(buffer, length);
+ sys_write(1, buffer, length);
}