diff options
author | jlemon <jlemon@FreeBSD.org> | 2001-02-16 14:31:49 +0000 |
---|---|---|
committer | jlemon <jlemon@FreeBSD.org> | 2001-02-16 14:31:49 +0000 |
commit | c7ba1f9694fa8b0335305d6b36f179a03a55fee9 (patch) | |
tree | 62247d63383508e8961a98d00ff66b72291651a0 /sys/kern/kern_subr.c | |
parent | 65a56b38f14e356f543283221b0cc6ff39d53725 (diff) | |
download | FreeBSD-src-c7ba1f9694fa8b0335305d6b36f179a03a55fee9.zip FreeBSD-src-c7ba1f9694fa8b0335305d6b36f179a03a55fee9.tar.gz |
Introduce copyinfrom and copyinstrfrom, which can copy data from either
user or kernel space. This will allow layering of os-compat (e.g.: linux)
system calls. Apply the changes to mount.
Diffstat (limited to 'sys/kern/kern_subr.c')
-rw-r--r-- | sys/kern/kern_subr.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/sys/kern/kern_subr.c b/sys/kern/kern_subr.c index 6b51c5c..ac4bad6 100644 --- a/sys/kern/kern_subr.c +++ b/sys/kern/kern_subr.c @@ -387,3 +387,39 @@ uio_yield() PICKUP_GIANT(); splx(s); } + +int +copyinfrom(const void *src, void *dst, size_t len, int seg) +{ + int error = 0; + + switch (seg) { + case UIO_USERSPACE: + error = copyin(src, dst, len); + break; + case UIO_SYSSPACE: + bcopy(src, dst, len); + break; + default: + panic("copyinfrom: bad seg %d\n", seg); + } + return (error); +} + +int +copyinstrfrom(const void *src, void *dst, size_t len, size_t *copied, int seg) +{ + int error = 0; + + switch (seg) { + case UIO_USERSPACE: + error = copyinstr(src, dst, len, copied); + break; + case UIO_SYSSPACE: + error = copystr(src, dst, len, copied); + break; + default: + panic("copyinstrfrom: bad seg %d\n", seg); + } + return (error); +} |