---
name: "cap_rights_limit"
section: "2freebsd"
platform: "linux"
package: "freebsd-manpages"
version: "12.2-2"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/cap_rights_limit/2freebsd"
---

# cap\_rights\_limit(2freebsd)

limit capability rights

## NAME

**cap\_rights\_limit** – limit capability rights

## LIBRARY

Standard C Library (libc, -lc)

## SYNOPSIS

**#include \<sys/capsicum.h\>**

*int*\

**cap\_rights\_limit**(*int fd*, *const cap\_rights\_t \*rights*);

## DESCRIPTION

When a file descriptor is created by a function such as [accept(2)](/accept/2.md), [accept4(2)](/accept4/2.md), [fhopen(2)](/fhopen/2.md), [kqueue(2)](/kqueue/2.md), [mq\_open(2)](/mq_open/2.md), [open(2)](/open/2.md), [openat(2)](/openat/2.md), [pdfork(2)](/pdfork/2.md), [pipe(2)](/pipe/2.md), [shm\_open(2)](/shm_open/2.md), [socket(2)](/socket/2.md) or [socketpair(2)](/socketpair/2.md), it is assigned all capability rights. Those rights can be reduced (but never expanded) by using the **cap\_rights\_limit**() system call. Once capability rights are reduced, operations on the file descriptor will be limited to those permitted by *rights*.

The *rights* argument should be prepared using [cap\_rights\_init(3)](/cap_rights_init/3.md) family of functions.

Capability rights assigned to a file descriptor can be obtained with the [cap\_rights\_get(3)](/cap_rights_get/3.md) function.

The complete list of the capability rights can be found in the [rights(4)](/rights/4.md) manual page.

## RETURN VALUES

The **cap\_rights\_limit()** function returns the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the error.

## EXAMPLES

The following example demonstrates how to limit file descriptor capability rights to allow reading only.

```
cap_rights_t setrights;
char buf[1];
int fd;
fd = open("/tmp/foo", O_RDWR);
if (fd < 0)
	err(1, "open() failed");
if (cap_enter() < 0)
	err(1, "cap_enter() failed");
cap_rights_init(&setrights, CAP_READ);
if (cap_rights_limit(fd, &setrights) < 0)
	err(1, "cap_rights_limit() failed");
buf[0] = 'X';
if (write(fd, buf, sizeof(buf)) > 0)
	errx(1, "write() succeeded!");
if (read(fd, buf, sizeof(buf)) < 0)
	err(1, "read() failed");
```

## ERRORS

**cap\_rights\_limit**() succeeds unless:

- \[EBADF\]

  The *fd* argument is not a valid active descriptor.

- \[EINVAL\]

  An invalid right has been requested in *rights*.

- \[ENOTCAPABLE\]

  The *rights* argument contains capability rights not present for the given file descriptor. Capability rights list can only be reduced, never expanded.

## SEE ALSO

[accept(2)](/accept/2.md), [accept4(2)](/accept4/2.md), [cap\_enter(2)](/cap_enter/2.md), [fhopen(2)](/fhopen/2.md), [kqueue(2)](/kqueue/2.md), [mq\_open(2)](/mq_open/2.md), [open(2)](/open/2.md), [openat(2)](/openat/2.md), [pdfork(2)](/pdfork/2.md), [pipe(2)](/pipe/2.md), [read(2)](/read/2.md), [shm\_open(2)](/shm_open/2.md), [socket(2)](/socket/2.md), [socketpair(2)](/socketpair/2.md), [write(2)](/write/2.md), [cap\_rights\_get(3)](/cap_rights_get/3.md), [cap\_rights\_init(3)](/cap_rights_init/3.md), [err(3)](/err/3.md), [capsicum(4)](/capsicum/4.md), [rights(4)](/rights/4.md)

## HISTORY

The **cap\_rights\_limit**() function first appeared in FreeBSD 8.3. Support for capabilities and capabilities mode was developed as part of the TrustedBSD Project.

## AUTHORS

This function was created by Pawel Jakub Dawidek ⟨*pawel@dawidek.net*⟩ under sponsorship of the FreeBSD Foundation.
