diff options
| author | hachem <im@hachem.wtf> | 2026-10-08 22:23:55 +0200 |
|---|---|---|
| committer | hachem <im@hachem.wtf> | 2026-10-08 22:23:55 +0200 |
| commit | 852a5b237116e8b53ae18ea8ea00505e44b40dfe (patch) | |
| tree | 1ed51afcf6471d2a0031d31b67b63f4ec404b9ed /user/save.c | |
| parent | ef104148057ab98f80b1560405b5c02768457096 (diff) | |
feat: file descriptor and proper stdio
Diffstat (limited to 'user/save.c')
| -rw-r--r-- | user/save.c | 34 |
1 files changed, 17 insertions, 17 deletions
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); } |
