diff options
author | Jon Santmyer <jon@jonsantmyer.com> | 2024-03-11 21:30:31 -0400 |
---|---|---|
committer | Jon Santmyer <jon@jonsantmyer.com> | 2024-03-11 21:30:31 -0400 |
commit | d1ff7bcc91886626dc9060ec5fb67ee102ab7c1d (patch) | |
tree | 8f0b5cd8aad31089131785dc6e37b659490f9955 /io/log.c | |
download | jove-kernel-d1ff7bcc91886626dc9060ec5fb67ee102ab7c1d.tar.gz jove-kernel-d1ff7bcc91886626dc9060ec5fb67ee102ab7c1d.tar.bz2 jove-kernel-d1ff7bcc91886626dc9060ec5fb67ee102ab7c1d.zip |
usermode capable kernel with logging syscall
Diffstat (limited to 'io/log.c')
-rw-r--r-- | io/log.c | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/io/log.c b/io/log.c new file mode 100644 index 0000000..14397a7 --- /dev/null +++ b/io/log.c @@ -0,0 +1,68 @@ +#include "log.h" +#include "lib/jove.h" +#include "lib/string.h" +#include "lib/format.h" + +static struct LogDevice *s_first_logdev = NULL; + +void +klog_newdev(struct LogDevice *dev) +{ + if(s_first_logdev == NULL) { + s_first_logdev = dev; + }else{ + dev->chain = s_first_logdev; + s_first_logdev = dev; + } +} + +static void +s_klogc(struct LogDevice *dev, char c) +{ + dev->out(&c, 1); + if(dev->chain != NULL) + s_klogc(dev->chain, c); +} + +void +klogc(char c) +{ + s_klogc(s_first_logdev, c); +} + +static void +s_klogs(struct LogDevice *dev, const char *s, size_t slen) +{ + dev->out(s, slen); + if(dev->chain != NULL) + s_klogs(dev->chain, s, slen); +} + +void +klogs(const char *s) +{ + size_t slen = strlen(s); + s_klogs(s_first_logdev, s, slen); +} + +void +klogsn(const char *s, size_t len) +{ + s_klogs(s_first_logdev, s, len); +} + +void +kvlogf(const char *fmt, va_list ap) +{ + char buffer[256]; + svfmt(buffer, 256, fmt, ap); + klogs(buffer); +} + +void klogf(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + kvlogf(fmt, ap); + va_end(ap); +} |