aboutsummaryrefslogtreecommitdiff
path: root/externals/gridflow/devices4ruby/ioctl.rb
diff options
context:
space:
mode:
Diffstat (limited to 'externals/gridflow/devices4ruby/ioctl.rb')
-rw-r--r--externals/gridflow/devices4ruby/ioctl.rb66
1 files changed, 66 insertions, 0 deletions
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