#include <mdb/mdb_modapi.h>
#include <mdb/mdb_err.h>
#include <mdb/mdb_io_impl.h>
#include <mdb/mdb.h>
static ssize_t
logio_read(mdb_io_t *io, void *buf, size_t nbytes)
{
mdb_io_t *logio = io->io_data;
ssize_t rbytes;
if (io->io_next != NULL) {
rbytes = IOP_READ(io->io_next, buf, nbytes);
if (rbytes > 0) {
(void) IOP_WRITE(logio, mdb.m_prompt, mdb.m_promptlen);
(void) IOP_WRITE(logio, buf, rbytes);
}
return (rbytes);
}
return (-1);
}
static ssize_t
logio_write(mdb_io_t *io, const void *buf, size_t nbytes)
{
mdb_io_t *logio = io->io_data;
ssize_t wbytes;
if (io->io_next != NULL) {
wbytes = IOP_WRITE(io->io_next, buf, nbytes);
if (wbytes > 0)
(void) IOP_WRITE(logio, buf, wbytes);
return (wbytes);
}
return (-1);
}
static void
logio_close(mdb_io_t *io)
{
mdb_io_rele(io->io_data);
}
static const char *
logio_name(mdb_io_t *io)
{
if (io->io_next != NULL)
return (IOP_NAME(io->io_next));
return ("(log)");
}
static const mdb_io_ops_t logio_ops = {
.io_read = logio_read,
.io_write = logio_write,
.io_seek = no_io_seek,
.io_ctl = no_io_ctl,
.io_close = logio_close,
.io_name = logio_name,
.io_link = no_io_link,
.io_unlink = no_io_unlink,
.io_setattr = no_io_setattr,
.io_suspend = no_io_suspend,
.io_resume = no_io_resume
};
mdb_io_t *
mdb_logio_create(mdb_io_t *logio)
{
mdb_io_t *io = mdb_alloc(sizeof (mdb_io_t), UM_SLEEP);
io->io_ops = &logio_ops;
io->io_data = mdb_io_hold(logio);
io->io_next = NULL;
io->io_refcnt = 0;
return (io);
}