https://github.com/postmodern/ioctl.cr
Crystal bindings for libc's ioctl(2)
https://github.com/postmodern/ioctl.cr
crystal-lang ioctl
Last synced: 10 months ago
JSON representation
Crystal bindings for libc's ioctl(2)
- Host: GitHub
- URL: https://github.com/postmodern/ioctl.cr
- Owner: postmodern
- License: mit
- Created: 2025-08-18T19:09:58.000Z (10 months ago)
- Default Branch: main
- Last Pushed: 2025-08-19T05:36:57.000Z (10 months ago)
- Last Synced: 2025-08-30T16:35:18.010Z (10 months ago)
- Topics: crystal-lang, ioctl
- Language: Crystal
- Homepage:
- Size: 17.6 KB
- Stars: 1
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
Awesome Lists containing this project
README
# ioctl.cr
* [Source](https://github.com/postmodern/ioctl.cr)
* [Issues](https://github.com/postmodern/ioctl.cr/issues)
* [Docs](https://postmodern.github.io/docs/ioctrl.cr/index.html)
libc's [ioctl] for [Crystal][crystal].
## Features
### Functions
* Maps in the libc `ioctl` function.
* Provides C equivalent macros for defining and working with ioctl numbers:
| C | Crystal |
|-------------|-------------------------------|
| `_IOC` | `ioctl_ioc(dir,type,nr,size)` |
| `_IO` | `ioctl_io(type,nr)` |
| `_IOR` | `ioctl_ior(type,nr,size)` |
| `_IOW` | `ioctl_iow(type,nr,size)` |
| `_IOWR` | `ioctl_iowr(type,nr,size)` |
| `_IOR_BAD` | `ioctl_ior_bad(type,nr,size)` |
| `_IOW_BAD` | `ioctl_iow_bad(type,nr,size)` |
| `_IOWR_BAD` | `ioctl_iowr_bad(type,nr,size)`|
| `_IOC_DIR` | `ioctl_dir(nr)` |
| `_IOC_TYPE` | `ioctl_type(nr)` |
| `_IOC_NR` | `ioctl_nr(nr)` |
| `_IOC_SIZE` | `ioctl_size(nr)` |
## Installation
1. Add the dependency to your `shard.yml`:
```yaml
dependencies:
ioctl:
github: postmodern/ioctl.cr
```
2. Run `shards install`
## Usage
```crystal
require "ioctl"
output = MyStruct.new
begin
IOCTL.ioctl(fd, IOCTL::..., pointerof(output))
rescue error : IOCTL::Error
# ...
end
```
Returning `-1` instead of raising an exception:
```crystal
if LibC.ioctl(fd, IOCTL::..., pointerof(output)) == -1
# ...
end
```
### Examples
Get the terminal window size:
```crystal
winsize = LibC::Winsize.new
begin
IOCTL.ioctl(STDOUT.fd, IOCTL::TIOCGWINSZ, pointerof(winsize))
rescue error : IOCTL::Error
STDERR.puts error.message
exit -1
end
puts "Rows: #{winsize.ws_row}"
puts "Cols: #{winsize.ws_col}"
```
## TODO
* macOS / BSD support
## Contributing
1. Fork it ()
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create a new Pull Request
## Contributors
- [Postmodern](https://github.com/postmodern) - creator and maintainer
[ioctl]: http://man7.org/linux/man-pages/man2/ioctl.2.html
[crystal]: https://crystal-lang.org/