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; }
/* * 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) ); }