/* $NetBSD: accessors.c,v 1.3 2016/01/26 23:12:17 pooka Exp $ */ /* * Copyright (c) 2007-2011 Antti Kantee. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * This file contains various data structure accessor routines. * They are meant to help clients that make calls into the depths * of the kernel (e.g. at vfs layer) bypassing the syscall layer. */ #include __KERNEL_RCSID(0, "$NetBSD: accessors.c,v 1.3 2016/01/26 23:12:17 pooka Exp $"); #include #include #include #include #include struct uio * rump_uio_setup(void *buf, size_t bufsize, off_t offset, enum rump_uiorw rw) { struct uio *uio; enum uio_rw uiorw; switch (rw) { case RUMPUIO_READ: uiorw = UIO_READ; break; case RUMPUIO_WRITE: uiorw = UIO_WRITE; break; default: panic("%s: invalid rw %d", __func__, rw); } uio = kmem_alloc(sizeof(struct uio), KM_SLEEP); uio->uio_iov = kmem_alloc(sizeof(struct iovec), KM_SLEEP); uio->uio_iov->iov_base = buf; uio->uio_iov->iov_len = bufsize; uio->uio_iovcnt = 1; uio->uio_offset = offset; uio->uio_resid = bufsize; uio->uio_rw = uiorw; uio->uio_vmspace = curproc->p_vmspace; return uio; } size_t rump_uio_getresid(struct uio *uio) { return uio->uio_resid; } off_t rump_uio_getoff(struct uio *uio) { return uio->uio_offset; } size_t rump_uio_free(struct uio *uio) { size_t resid; resid = uio->uio_resid; kmem_free(uio->uio_iov, sizeof(*uio->uio_iov)); kmem_free(uio, sizeof(*uio)); return resid; } kauth_cred_t rump_cred_create(uid_t uid, gid_t gid, size_t ngroups, gid_t *groups) { kauth_cred_t cred; int rv; cred = kauth_cred_alloc(); kauth_cred_setuid(cred, uid); kauth_cred_seteuid(cred, uid); kauth_cred_setsvuid(cred, uid); kauth_cred_setgid(cred, gid); kauth_cred_setgid(cred, gid); kauth_cred_setegid(cred, gid); kauth_cred_setsvgid(cred, gid); rv = kauth_cred_setgroups(cred, groups, ngroups, 0, UIO_SYSSPACE); /* oh this is silly. and by "this" I mean kauth_cred_setgroups() */ assert(rv == 0); return cred; } void rump_cred_put(kauth_cred_t cred) { kauth_cred_free(cred); }