aboutsummaryrefslogtreecommitdiff
path: root/payloads/libpayload/libc/console.c
diff options
context:
space:
mode:
Diffstat (limited to 'payloads/libpayload/libc/console.c')
-rw-r--r--payloads/libpayload/libc/console.c29
1 files changed, 15 insertions, 14 deletions
diff --git a/payloads/libpayload/libc/console.c b/payloads/libpayload/libc/console.c
index 59d5bccb48..8c0664d125 100644
--- a/payloads/libpayload/libc/console.c
+++ b/payloads/libpayload/libc/console.c
@@ -37,6 +37,7 @@ static console_input_type last_getchar_input_type;
void console_add_output_driver(struct console_output_driver *out)
{
+ die_if(!out->putchar && !out->write, "Need at least one output func\n");
out->next = console_out;
console_out = out;
}
@@ -63,33 +64,33 @@ void console_init(void)
#endif
}
-static void device_putchar(unsigned char c)
+void console_write(const void *buffer, size_t count)
{
+ const char *ptr;
struct console_output_driver *out;
for (out = console_out; out != 0; out = out->next)
- out->putchar(c);
+ if (out->write)
+ out->write(buffer, count);
+ else
+ for (ptr = buffer; (void *)ptr < buffer + count; ptr++)
+ out->putchar(*ptr);
}
-int putchar(unsigned int c)
+int putchar(unsigned int i)
{
- c &= 0xff;
- if (c == '\n')
- device_putchar('\r');
- device_putchar(c);
- return c;
+ unsigned char c = (unsigned char)i;
+ console_write(&c, 1);
+ return (int)c;
}
int puts(const char *s)
{
- int n = 0;
+ size_t size = strlen(s);
- while (*s) {
- putchar(*s++);
- n++;
- }
+ console_write(s, size);
putchar('\n');
- return n + 1;
+ return size + 1;
}
int havekey(void)