Files
mango/kernel/console.c

65 lines
1.3 KiB
C
Raw Normal View History

#include <socks/console.h>
#include <socks/queue.h>
#include <socks/locks.h>
#include <socks/libc/string.h>
static struct queue consoles;
static spin_lock_t consoles_lock = SPIN_LOCK_INIT;
kern_status_t console_register(struct console *con)
{
unsigned long flags;
spin_lock_irqsave(&consoles_lock, &flags);
queue_foreach (struct console, cur, &consoles, c_list) {
if (!strcmp(cur->c_name, con->c_name)) {
spin_unlock_irqrestore(&consoles_lock, flags);
return KERN_NAME_EXISTS;
}
}
queue_push_back(&consoles, &con->c_list);
spin_unlock_irqrestore(&consoles_lock, flags);
return KERN_OK;
}
kern_status_t console_unregister(struct console *con)
{
unsigned long flags;
spin_lock_irqsave(&consoles_lock, &flags);
queue_delete(&consoles, &con->c_list);
spin_unlock_irqrestore(&consoles_lock, flags);
return KERN_OK;
}
struct queue *get_consoles(unsigned long *flags)
{
spin_lock_irqsave(&consoles_lock, flags);
return &consoles;
}
void put_consoles(struct queue *consoles, unsigned long flags)
{
(void)consoles;
spin_unlock_irqrestore(&consoles_lock, flags);
}
void console_write(struct console *con, const char *s, unsigned int len)
{
if (con->c_write) {
con->c_write(con, s, len);
}
}
int console_read(struct console *con, char *s, unsigned int len)
{
int ret = -1;
if (con->c_read) {
ret = con->c_read(con, s, len);
}
return ret;
}