From 75f9922f6d3c1e5bbbe7b90ca170392cc0f5efbc Mon Sep 17 00:00:00 2001 From: Jari Vetoniemi Date: Sun, 21 Oct 2018 16:23:23 +0300 Subject: Refactor io utils, add *-address-rw tools Namespace io_ stuff into mem_io_ to be less likely to collision with anything else. Add io-stream utility for working with streams instead of direct buffers. Add address-rw tools for simple memory read/write, where regions aren't needed. --- src/mem/io-uio.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/mem/io-uio.c (limited to 'src/mem/io-uio.c') diff --git a/src/mem/io-uio.c b/src/mem/io-uio.c new file mode 100644 index 0000000..c649a45 --- /dev/null +++ b/src/mem/io-uio.c @@ -0,0 +1,41 @@ +#include "io.h" +#include +#include +#include + +static size_t +mem_io_uio_do(const struct mem_io *io, const void *ptr, const size_t offset, const size_t size, ssize_t (*iofun)(pid_t, const struct iovec*, unsigned long, const struct iovec*, unsigned long, unsigned long)) +{ + const struct iovec lio = { .iov_base = (void*)ptr, .iov_len = size }; + const struct iovec rio = { .iov_base = (void*)(intptr_t)offset, .iov_len = size }; + return iofun(io->pid, &lio, 1, &rio, 1, 0); +} + +static size_t +mem_io_uio_write(const struct mem_io *io, const void *ptr, const size_t offset, const size_t size) +{ + const size_t ret = mem_io_uio_do(io, ptr, offset, size, process_vm_writev); + + if (ret == (size_t)-1) + warn("process_vm_writev(%u)", io->pid); + + return (ret == (size_t)-1 ? 0 : ret); +} + +static size_t +mem_io_uio_read(const struct mem_io *io, void *ptr, const size_t offset, const size_t size) +{ + const size_t ret = mem_io_uio_do(io, ptr, offset, size, process_vm_readv); + + if (ret == (size_t)-1) + warn("process_vm_readv(%u)", io->pid); + + return (ret == (size_t)-1 ? 0 : ret); +} + +bool +mem_io_uio_init(struct mem_io *io, const pid_t pid) +{ + *io = (struct mem_io){ .pid = pid, .read = mem_io_uio_read, .write = mem_io_uio_write }; + return true; +} -- cgit v1.2.3