Skip to content

crystal-posix/ioctl.cr

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

39 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ioctl.cr

libc's ioctl for Crystal.

Features

  • Maps in the libc ioctl function.

  • Provides C equivalent methods 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)
    _IOC_DIR IOCTL._IOC_DIR(dir)
    _IOC_TYPE IOCTL._IOC_TYPE(type)
    _IOC_NR IOCTL._IOC_NR(nr)
    _IOC_SIZE IOCTL._IOC_SIZE(size)

Installation

  1. Add the dependency to your shard.yml:

    dependencies:
      ioctl:
        github: postmodern/ioctl.cr
  2. Run shards install

Usage

require "ioctl"

output = MyStruct.new

begin
  IOCTL.ioctl(fd, IOCTL::..., pointerof(output))
request error : IOCTL::Error
  # ...
end

Returning -1 instead of raising an exception:

if LibC.ioctl(fd, IOCTL::..., pointerof(output)) == -1
  # ...
end

Examples

Get the terminal window size:

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 (https://github.com/postmodern/ioctl/fork)
  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