static off64_t strio_seek(mdb_io_t *io, off64_t offset, int whence) { str_data_t *sd = io->io_data; char *nptr; if (io->io_next != NULL) return (IOP_SEEK(io->io_next, offset, whence)); switch (whence) { case SEEK_SET: nptr = sd->str_base + offset; break; case SEEK_CUR: nptr = sd->str_ptr + offset; break; case SEEK_END: nptr = sd->str_base + sd->str_len + offset; break; default: return (set_errno(EINVAL)); } if (nptr < sd->str_base || nptr > sd->str_ptr + sd->str_len) return (set_errno(EINVAL)); sd->str_ptr = nptr; return ((off64_t)(nptr - sd->str_base)); }
static off64_t memio_seek(mdb_io_t *io, off64_t offset, int whence) { mem_data_t *mdp = io->io_data; if (io->io_next == NULL) { switch (whence) { case SEEK_SET: mdp->md_off = offset; break; case SEEK_CUR: mdp->md_off += offset; break; case SEEK_END: mdp->md_off = mdp->md_size + offset; if (mdp->md_off > mdp->md_size) mdp->md_off = mdp->md_size; break; default: return (-1); } return (mdp->md_off); } return (IOP_SEEK(io->io_next, offset, whence)); }
static off64_t pio_seek(mdb_io_t *io, off64_t offset, int whence) { if (io->io_next == NULL) return (set_errno(ENOTSUP)); return (IOP_SEEK(io->io_next, offset, whence)); }
static off64_t fdio_seek(mdb_io_t *io, off64_t offset, int whence) { fd_data_t *fdp = io->io_data; if (io->io_next == NULL) return (lseek64(fdp->fd_fd, offset, whence)); return (IOP_SEEK(io->io_next, offset, whence)); }
static ssize_t rf_write(mdb_io_t *io, const void *buf, size_t nbytes, uint64_t addr) { if (io == NULL) return (set_errno(EMDB_NOMAP)); if (IOP_SEEK(io, addr, SEEK_SET) == -1) return (-1); /* errno is set for us */ return (IOP_WRITE(io, buf, nbytes)); }
static ssize_t rf_read(mdb_io_t *io, void *buf, size_t nbytes, uint64_t addr) { ssize_t rbytes; if (io == NULL) return (set_errno(EMDB_NOMAP)); if (IOP_SEEK(io, addr, SEEK_SET) == -1) return (-1); /* errno is set for us */ if ((rbytes = IOP_READ(io, buf, nbytes)) == 0) (void) set_errno(EMDB_EOF); return (rbytes); }
{ return (rf_write(RF_OBJECT(t->t_data), buf, nbytes, addr)); } static int rf_print_map(mdb_io_t *io, const char *type, int tflags, mdb_tgt_map_f *func, void *private) { mdb_map_t map; (void) mdb_iob_snprintf(map.map_name, MDB_TGT_MAPSZ, "%s (%s)", IOP_NAME(io), type); map.map_base = 0; map.map_size = IOP_SEEK(io, 0, SEEK_END); map.map_flags = MDB_TGT_MAP_R; if (tflags & MDB_TGT_F_RDWR) map.map_flags |= MDB_TGT_MAP_W; return (func(private, &map, map.map_name)); } static int rf_mapping_iter(mdb_tgt_t *t, mdb_tgt_map_f *func, void *private) { rf_data_t *rf = t->t_data; if (rf->r_object_fio != NULL && rf_print_map(rf->r_object_fio, "object file", t->t_flags, func, private) != 0)