#include <defs.h>
|
|
#include <stdio.h>
|
|
#include <dev.h>
|
|
#include <vfs.h>
|
|
#include <iobuf.h>
|
|
#include <inode.h>
|
|
#include <unistd.h>
|
|
#include <error.h>
|
|
#include <assert.h>
|
|
|
|
static int
|
|
stdout_open(struct device *dev, uint32_t open_flags) {
|
|
if (open_flags != O_WRONLY) {
|
|
return -E_INVAL;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
stdout_close(struct device *dev) {
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
stdout_io(struct device *dev, struct iobuf *iob, bool write) {
|
|
if (write) {
|
|
char *data = iob->io_base;
|
|
for (; iob->io_resid != 0; iob->io_resid --) {
|
|
cputchar(*data ++);
|
|
}
|
|
return 0;
|
|
}
|
|
return -E_INVAL;
|
|
}
|
|
|
|
static int
|
|
stdout_ioctl(struct device *dev, int op, void *data) {
|
|
return -E_INVAL;
|
|
}
|
|
|
|
static void
|
|
stdout_device_init(struct device *dev) {
|
|
dev->d_blocks = 0;
|
|
dev->d_blocksize = 1;
|
|
dev->d_open = stdout_open;
|
|
dev->d_close = stdout_close;
|
|
dev->d_io = stdout_io;
|
|
dev->d_ioctl = stdout_ioctl;
|
|
}
|
|
|
|
void
|
|
dev_init_stdout(void) {
|
|
struct inode *node;
|
|
if ((node = dev_create_inode()) == NULL) {
|
|
panic("stdout: dev_create_node.\n");
|
|
}
|
|
stdout_device_init(vop_info(node, device));
|
|
|
|
int ret;
|
|
if ((ret = vfs_add_dev("stdout", node, 0)) != 0) {
|
|
panic("stdout: vfs_add_dev: %e.\n", ret);
|
|
}
|
|
}
|
|
|