ioctl-sys 0.4.0

IO Control for POSIX-and-beyond systems
Documentation
`ioctl`
=======

[![Travis](https://img.shields.io/travis/cmr/ioctl.svg?style=flat-square)](https://travis-ci.org/cmr/ioctl)
[![Crates.io](https://img.shields.io/crates/v/ioctl.svg?style=flat-square)](https://crates.io/crates/ioctl)

[Documentation](https://cmr.github.io/ioctl)

Helpers for binding `ioctl`s in Rust. Currently supports Linux on all architectures
except SPARC and Alpha. Other platforms welcome!

This library is pretty low-level and messy. `ioctl` is not fun.

What is an `ioctl`?
===================

The `ioctl` function is the grab-bag system call on POSIX systems. Don't want
to add a new syscall? Make it an `ioctl`! `ioctl` refers to both the syscall,
and the commands that can be send with it. `ioctl` stands for "IO control",
and the commands are always sent to a file descriptor.

What does this library support?
===============================

This library provides the `ioctl!` macro, for binding `ioctl`s. It also tries
to bind every `ioctl` supported by the system with said macro, but
many `ioctl`s require some amount of manual work to support (usually by
providing `struct`s or other types) that this library does not support yet.

Additionally, in `etc`, there are scripts for scraping system headers for
`ioctl` definitions, and generating calls to `ioctl!` corresponding to them.

How do I get the magic numbers?
===============================

Look at your system's headers. For example, `/usr/include/linxu/input.h` has a
lot of lines defining macros which use `_IOR`, `_IOW`, `_IOC`, and `_IORW`.
These macros correspond to the `ior!`, `iow!`, `ioc!`, and `iorw!` macros
defined in this crate. Additionally, there is the `ioctl!` macro for
creating a wrapper around `ioctl` that is somewhat more type-safe.

Most `ioctl`s have no or little documentation. You'll need to scrounge through
the source to figure out what they do and how they should be used.

Example
=======

```rust
#[macro_use]
extern crate ioctl;

ioctl!(bad kiocsound with 0x4B2F);
ioctl!(none drm_ioctl_set_master with b'd', 0x1e);
ioctl!(read ev_get_version with b'E', 0x01; u32);
ioctl!(write ev_set_repeat with b'E', 0x03; [u32; 2]);

fn main() {
    let mut x = 0;
    let ret = unsafe { ev_get_version(0, &mut x) };
    println!("returned {}, x = {}", ret, x);
}
```

## License

Licensed under either of

 * Apache License, Version 2.0, ([LICENSE-APACHE]LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
 * MIT license ([LICENSE-MIT]LICENSE-MIT or http://opensource.org/licenses/MIT)

at your option.

### Contribution

Unless you explicitly state otherwise, any contribution intentionally
submitted for inclusion in the work by you, as defined in the Apache-2.0
license, shall be dual licensed as above, without any additional terms or
conditions.