August 28, 2005 COPY 9

### NAME

copy, copyin, copyout, copystr, copyinstr, copyoutstr - kernel space to/from user space copy functions

### SYNOPSIS

```int` copyin(```const void *uaddr``, void *kaddr``, size_t len`)
```int` copyout(```const void *kaddr``, void *uaddr``, size_t len`)
```int` copystr(```const void *kfaddr``, void *kdaddr``, size_t len``, size_t *done`)
```int` copyinstr(```const void *uaddr``, void *kaddr``, size_t len``, size_t *done`)
```int` copyoutstr(```const void *kaddr``, void *uaddr``, size_t len``, size_t *done`)
```int` copyin_proc(```struct proc *p``, const void *uaddr``, void *kaddr``, size_t len`)
```int` copyout_proc(```struct proc *p``, const void *kaddr``, void *uaddr``, size_t len`)
```int` ioctl_copyin(```int ioctlflags``, const void *src``, void *dst``, size_t len`)
```int` ioctl_copyout(```int ioctlflags``, const void *src``, void *dst``, size_t len`)

### DESCRIPTION

The copy functions are designed to copy contiguous data from one address to another. All but copystr(``) copy data from user-space to kernel-space or vice-versa.

The copy routines provide the following functionality:

copyin(``)
  Copies ```len` bytes of data from the user-space address ```uaddr` in the current process to the kernel-space address ```kaddr`.

copyout(``)
  Copies ```len` bytes of data from the kernel-space address ```kaddr` to the user-space address ```uaddr` in the current process.

copystr(``)
  Copies a NUL-terminated string, at most ```len` bytes long, from kernel-space address ```kfaddr` to kernel-space address ```kdaddr`. If the ```done` argument is non-NULL, the number of bytes actually copied, including the terminating NUL, is returned in ```*done`.

copyinstr(``)
  Copies a NUL-terminated string, at most ```len` bytes long, from user-space address ```uaddr` in the current process to kernel-space address ```kaddr`. If the ```done` argument is non-NULL, the number of bytes actually copied, including the terminating NUL, is returned in ```*done`.

copyoutstr(``)
  Copies a NUL-terminated string, at most ```len` bytes long, from kernel-space address ```kaddr` to user-space address ```uaddr` in the current process. If the ```done` argument is non-NULL, the number of bytes actually copied, including the terminating NUL, is returned in ```*done`.

copyin_proc(``)
  Like copyin(``), except it operates on the address space of the process ```p`.

copyout_proc(``)
  Like copyout(``), except it operates on the address space of the process ```p`.

ioctl_copyin(``)
  Like copyin(``), except it operates on kernel adresses when the ```FKIOCTL` flag is passed in ```ioctlflags` from the ioctl call.

ioctl_copyout(``)
  Like copyout(``), except it operates on kernel adresses when the ```FKIOCTL` flag is passed in ```ioctlflags` from the ioctl call.

### RETURN VALUES

The copy functions return 0 on success or ```EFAULT` if a bad address is encountered. In addition, the copystr(``), copyinstr(``), and copyoutstr(``) functions return ```ENAMETOOLONG` if the string is longer than ```len` bytes.

### SEE ALSO

fetch(9), store(9)