summaryrefslogtreecommitdiff
path: root/README.md
blob: 88e963942b96ca1a4887b99df40082aa0e396099 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# Rust bindings to *nix APIs

[![Build Status](https://travis-ci.org/nix-rust/nix.svg?branch=master)](https://travis-ci.org/nix-rust/nix)
[![crates.io](http://meritbadge.herokuapp.com/nix)](https://crates.io/crates/nix)

[Documentation (Releases)](https://docs.rs/nix/)

[Documentation (Development)](https://nix-rust.github.io/nix/nix/index.html)

Nix seeks to provide friendly bindings to various *nix platform APIs (Linux, Darwin,
...). The goal is to not provide a 100% unified interface, but to unify
what can be while still providing platform specific APIs.

For many system APIs, Nix provides a safe alternative to the unsafe APIs
exposed by the [libc crate](https://github.com/rust-lang/libc).  This is done by
wrapping the libc functionality with types/abstractions that enforce legal/safe
usage.


As an example of what Nix provides, examine the differences between what is
exposed by libc and nix for the
[gethostname](http://man7.org/linux/man-pages/man2/gethostname.2.html) system
call:

```rust,ignore
// libc api (unsafe, requires handling return code/errno)
pub unsafe extern fn gethostname(name: *mut c_char, len: size_t) -> c_int;

// nix api (returns a nix::Result)
pub fn gethostname(name: &mut [u8]) -> Result<()>;
```

## Supported Platforms

nix target support consists of three tiers:

  * Tier 1 - Target is supported and CI both builds and tests
  * Tier 2 - Target is supported and CI builds the target
  * Tier 3 - Target is supported and CI both builds and tests but test failures
             do not block merging code

The following targets are all supported by nix on Rust 1.13.0 or newer:

Tier 1:
  * i686-unknown-linux-gnu
  * x86_64-unknown-linux-gnu
  * i686-apple-darwin
  * x86_64-apple-darwin
  * aarch64-unknown-linux-gnu
  * armv7-unknown-linux-gnueabihf
  * arm-unknown-linux-gnueabi

Tier 2:
  * i686-unknown-freebsd
  * x86_64-unknown-freebsd
  * x86_64-unknown-netbsd

Tier 3:
  * i686-unknown-linux-musl
  * x86_64-unknown-linux-musl
  * mips-unknown-linux-gnu
  * mipsel-unknown-linux-gnu
  * powerpc-unknown-linux-gnu

## Usage

To use `nix`, first add this to your `Cargo.toml`:

```toml
[dependencies]
nix = "0.8.0"
```

Then, add this to your crate root:

```rust,ignore
extern crate nix;
```
## Contributing

Contributions are very welcome.  Please See [CONTRIBUTING](CONTRIBUTING.md) for
additional details.

## License

Nix is licensed under the MIT license.  See [LICENSE](LICENSE) for more details.