Skip to content
/ ioctl Public
forked from codyps/ioctl

Helpers for binding ioctls in Rust (fork to add ARM evdev support)

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT
Notifications You must be signed in to change notification settings

acmumn/ioctl

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

64 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ioctl-sys & ioctls

Travis ioctl-sys Crates.io ioctls Crates.io ioctl-sys ioctl-sys Documentation ioctls ioctls Documentation

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

The ioctl-sys crate provides a basic interface to write your own ioctl wrappers.

The ioctls crate provides wrappers for a bunch of ioctls.

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 ioctls. It also tries to bind every ioctl supported by the system with said macro, but many ioctls require some amount of manual work to support (usually by providing structs 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 ioctls 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.

How do I figure out an ioctl's calling convention?

For linux, you must look at the ioctl handlers in the kernel itself to determine how the value passed is being used. Look for the copy_from_user() and get_user() calls, these copy memory from userspace and may indicate that the ioctl's arg is a pointer. In othercases, the ioctl argument may simply be cast to an integer of some sort.

Example

#[macro_use]
extern crate ioctl_sys;

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

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.

About

Helpers for binding ioctls in Rust (fork to add ARM evdev support)

Topics

Resources

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Rust 90.7%
  • Python 9.3%