summaryrefslogtreecommitdiff
path: root/kernel/timer.c
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2024-12-10 12:24:07 +0100
committerAnton Kling <anton@kling.gg>2024-12-10 12:24:07 +0100
commit916aa42260290e9e864304bc7d9395b6aa693c27 (patch)
tree784cdcbe26e828e18413bf9d31d6a84ed74dd1ba /kernel/timer.c
parentbcca3d183930eeaf3d024476f39d1d8fccf2ebab (diff)
kernel: Add string view and string builder
This makes write/read calls that use strings to communicate much simpler and less error prone.
Diffstat (limited to 'kernel/timer.c')
-rw-r--r--kernel/timer.c22
1 files changed, 5 insertions, 17 deletions
diff --git a/kernel/timer.c b/kernel/timer.c
index dd92d3d..b84c16a 100644
--- a/kernel/timer.c
+++ b/kernel/timer.c
@@ -2,6 +2,7 @@
#include <drivers/cmos.h>
#include <fs/devfs.h>
#include <interrupts.h>
+#include <lib/sv.h>
#include <math.h>
#include <random.h>
#include <time.h>
@@ -49,31 +50,18 @@ int clock_read(u8 *buffer, u64 offset, u64 len, vfs_fd_t *fd) {
if (0 != offset) {
return 0;
}
- // Currently don't have snprintf without NULL termination...
- char tmp[4096];
u64 r = timer_get_ms();
-
- u64 l = ksnprintf(tmp, 4096, "%llu", r);
- l = min(len, l);
- memcpy(buffer, tmp, l);
- return l;
+ return min(len, (u64)kbnprintf(buffer, len, "%llu", r));
}
int clock_write(u8 *buffer, u64 offset, u64 len, vfs_fd_t *fd) {
if (0 != offset) {
return 0;
}
- // TODO: Move sv to kernel or something to just avoid this. I hate null
- // termination
- char tmp[4096];
- memcpy(tmp, buffer, len);
- tmp[len] = '\0';
- int err;
- u64 new_value_ms = parse_u64(tmp, NULL, 10, &err);
- if (err) {
- return 0;
- }
+ struct sv string_view = sv_init(buffer, len);
+
+ u64 new_value_ms = sv_parse_unsigned_number(string_view, &string_view);
i64 new_value_seconds = new_value_ms / 1000;