Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/lucab/caps-rs

A pure-Rust library to work with Linux capabilities
https://github.com/lucab/caps-rs

capabilities capget capset linux posix-1e

Last synced: 3 days ago
JSON representation

A pure-Rust library to work with Linux capabilities

Awesome Lists containing this project

README

        

# caps

[![Build Status](https://travis-ci.com/lucab/caps-rs.svg?branch=master)](https://travis-ci.com/lucab/caps-rs)
[![crates.io](https://img.shields.io/crates/v/caps.svg)](https://crates.io/crates/caps)
[![Documentation](https://docs.rs/caps/badge.svg)](https://docs.rs/caps)

A pure-Rust library to work with Linux capabilities.

`caps` provides support for manipulating capabilities available in modern Linux
kernels. It supports traditional POSIX sets (Effective, Inheritable, Permitted)
as well as Linux-specific Ambient and Bounding capabilities sets.

`caps` provides a simple and idiomatic interface to handle capabilities on Linux.
See `capabilities(7)` for more details.

## Motivations

This library tries to achieve the following goals:
* fully support modern kernels, including recent capabilities and sets
* provide an idiomatic interface
* be usable in static targets, without requiring an external C library

## Example

```rust
type ExResult = Result>;

fn manipulate_caps() -> ExResult<()> {
use caps::{Capability, CapSet};

// Retrieve permitted set.
let cur = caps::read(None, CapSet::Permitted)?;
println!("Current permitted caps: {:?}.", cur);

// Retrieve effective set.
let cur = caps::read(None, CapSet::Effective)?;
println!("Current effective caps: {:?}.", cur);

// Check if CAP_CHOWN is in permitted set.
let perm_chown = caps::has_cap(None, CapSet::Permitted, Capability::CAP_CHOWN)?;
if !perm_chown {
return Err("Try running this as root!".into());
}

// Clear all effective caps.
caps::clear(None, CapSet::Effective)?;
println!("Cleared effective caps.");
let cur = caps::read(None, CapSet::Effective)?;
println!("Current effective caps: {:?}.", cur);

// Since `CAP_CHOWN` is still in permitted, it can be raised again.
caps::raise(None, CapSet::Effective, Capability::CAP_CHOWN)?;
println!("Raised CAP_CHOWN in effective set.");
let cur = caps::read(None, CapSet::Effective)?;
println!("Current effective caps: {:?}.", cur);

Ok(())
}
```

Some more examples are available under [examples](examples).

## License

Licensed under either of

* MIT license -
* Apache License, Version 2.0 -

at your option.