Example #1
0
struct uio *
afsio_partialcopy(struct uio *auio, size_t size)
{
    struct uio *res;
    int i;
    user_addr_t iovaddr;
    user_size_t iovsize;

    if (proc_is64bit(current_proc())) {
	res = uio_create(uio_iovcnt(auio), uio_offset(auio),
			 uio_isuserspace(auio) ? UIO_USERSPACE64 : UIO_SYSSPACE32,
			 uio_rw(auio));
    } else {
	res = uio_create(uio_iovcnt(auio), uio_offset(auio),
			 uio_isuserspace(auio) ? UIO_USERSPACE32 : UIO_SYSSPACE32,
			 uio_rw(auio));
    }

    for (i = 0;i < uio_iovcnt(auio) && size > 0;i++) {
	if (uio_getiov(auio, i, &iovaddr, &iovsize))
	    break;
	if (iovsize > size)
	    iovsize = size;
	if (uio_addiov(res, iovaddr, iovsize))
	    break;
	size -= iovsize;
    }
    return res;
}
Example #2
0
/*
 *  Support for BSD-IOKit data exchange. Most of this is from
 *  IOStorageFamily-92.9 (IOMediaBSDClient.cpp).
 */
IOMemoryDescriptor *IOMemoryDescriptorFromUIO(struct uio *uio)
{
	return IOMemoryDescriptor::withOptions(
		uio,
		uio_iovcnt(uio),
		0,
		(uio_isuserspace(uio)) ? current_task() : kernel_task,
		kIOMemoryTypeUIO | kIOMemoryAsReference |
			((uio_rw(uio) == UIO_READ) ? kIODirectionIn : kIODirectionInOut)
		);
}