---
name: "cap_rights_limit"
section: "2"
platform: "freebsd"
package: "base"
version: "16.0-CURRENT-20261027-61c70dc16a79"
release: "FreeBSD 16.0-CURRENT (2026-10-27)"
platforms: ["freebsd"]
url: "https://carta.tech/man/cap_rights_limit"
---

# cap\_rights\_limit(2)

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 [fhopen(2)](/man/fhopen/2.md), [kqueue(2)](/man/kqueue/2.md), [mq\_open(2)](/man/mq_open/2.md), [open(2)](/man/open/2.md), [pdfork(2)](/man/pdfork/2.md), [pipe(2)](/man/pipe/2.md), [shm\_open(2)](/man/shm_open/2.md), [socket(2)](/man/socket/2.md) or [socketpair(2)](/man/socketpair/2.md), it is assigned all capability rights; for [accept(2)](/man/accept/2.md), [accept4(2)](/man/accept4/2.md) or [openat(2)](/man/openat/2.md), it inherits capability rights from the "parent" file descriptor. 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)](/man/cap_rights_init/3.md) family of functions.

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

The complete list of the capability rights can be found in the [rights(4)](/man/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*.

- \[ENOSYS\]

  The running kernel was compiled without **options CAPABILITY\_MODE**.

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