From 5e2a1bc9e56003349e533f7e5841041ba5c04e28 Mon Sep 17 00:00:00 2001 From: "N.N." Date: Tue, 4 Oct 2005 02:02:15 +0000 Subject: starting to commit gridflow 0.8.0 ... if you know how to use "cvs import" please mail me and i'll use it for 0.8.1 svn path=/trunk/; revision=3646 --- externals/gridflow/devices4ruby/ioctl.rb | 66 ++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 externals/gridflow/devices4ruby/ioctl.rb (limited to 'externals/gridflow/devices4ruby/ioctl.rb') diff --git a/externals/gridflow/devices4ruby/ioctl.rb b/externals/gridflow/devices4ruby/ioctl.rb new file mode 100644 index 00000000..100d138d --- /dev/null +++ b/externals/gridflow/devices4ruby/ioctl.rb @@ -0,0 +1,66 @@ +# general-purpose code for performing +# less-than-trivial IOCTL operations. +# note that this is quite hackish +# but is still better than writing actual C code. + +module Linux; DEVICES_VERSION = "0.1.1"; end + +module IoctlClass + def ioctl_reader(sym,cmd_in) + module_eval %{def #{sym} + ioctl_intp_in(#{cmd_in}) + end} + end + def ioctl_writer(sym,cmd_out) + module_eval %{def #{sym}=(v) + ioctl_intp_out(#{cmd_out},v) + #{sym} if respond_to? :#{sym} + end} + end + def ioctl_accessor(sym,cmd_in,cmd_out) + ioctl_reader(sym,cmd_in) + ioctl_writer(sym,cmd_out) + end +end + +module Ioctl + # this method is not used anymore + def int_from_4(foo) + # if it crashes, just insert foo=foo.reverse here. + (foo[0]+0x100*foo[1])+0x10000*(foo[2]+0x100*foo[3]) + end + +# this was a big hack (from hell) that i used until I actually +# learned the other feature of ioctl(). +=begin + def ioctl_intp_out(arg1,arg2) + tmp = arg2 + 2**32 + foo = [2*tmp.id + 16].pack("l").unpack("P4")[0] + tmp_ptr = int_from_4(foo) +# STDOUT.printf "tmp_ptr=%x\n", tmp_ptr + ioctl(arg1,tmp_ptr) + end + + def ioctl_intp_in(arg1) + tmp = 0xdeadbeef + 2**32 + foo = [2*tmp.id + 16].pack("l").unpack("P4")[0] + tmp_ptr = int_from_4(foo) +# tmp_ptr = foo.unpack("l")[0] +# STDOUT.printf "tmp_ptr=%x\n", tmp_ptr + ioctl(arg1,tmp_ptr) + tmp & (2**32-1) + end +=end + + def ioctl_intp_out(arg1,arg2) + ioctl(arg1,[arg2].pack("l")) + end + + def ioctl_intp_in(arg1) + ioctl(arg1,s="blah") + return s.unpack("l")[0] + end + +end + +class IO; include Ioctl; end -- cgit v1.2.1