示例#1
0
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));
}
示例#2
0
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));
}
示例#3
0
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));
}
示例#4
0
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));
}
示例#5
0
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));
}
示例#6
0
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);
}
示例#7
0
{
	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)