You probably want to take this to the ruby-ffi project here:

http://kenai.com/projects/ruby-ffi

Aston wrote:
> Hello,
> 
> I am trying to learn ruby-ffi now (after sadly leaving dl library), I 
> have some trouble here too
> 
> I will present a simple example where I want to pass a struct between 
> ruby and C
> I am facing problems while setting fields of struct if that field is of 
> type string(char*, not char[])
> I understand we have to allocate the char* field of struct first than 
> assign some literal srting
> 
> consider the C file
> 
> ********************** C FILE**********************
> #include <stdlib.h>
> #include <stdio.h>
> #include <string.h>
> 
> typedef struct
> {
>     char *name;
>     double val;
> } INFO, *INFO_PTR;
> 
> INFO_PTR create( char* name, double val)
> {
>     INFO_PTR p = (INFO_PTR)malloc( sizeof(INFO));
>     p->val = val;
>     p->name = (char*)malloc( strlen(name) + 1);
>     strcpy( p->name, name);
>     return p;
> }
> 
> int show( INFO_PTR pInfo)
> {
>     return printf( "%s - %f\n", pInfo->name, pInfo->val);
> }
> 
> ********************** END C FILE**********************
> 
> ********************** RUBY FILE**********************
> require 'ffi'
> 
> module LibTest
>   class Info < FFI::Struct
>     layout :name, :string,
>            :val, :double
>   end
> 
>   extend FFI::Library
>   ffi_lib "./libtest.so"
>   attach_function :create, [:string, :double], :pointer
>   attach_function :show, [:pointer], :int
> end
> 
> include FFI
> 
> ptr = LibTest.create( "test string", 11.27)
> obj = LibTest::Info.new(ptr)
> LibTest.show(ptr)
> obj[:val] = 27.11 # this works
> # obj[:name] = "new string" # this gives error, `[]=': Cannot set 
> :string fields (ArgumentError)
> LibTest.show(ptr)
> ********************** END RUBY FILE**********************
> 
> how can I set string values from ruby ?
> If I refuse to declare name field as type char[] from char* then I have 
> to allocate before I can assign
> then my approach below core dumps :(
> 
> 1 str = "test string"
> 2 p = MemoryPointer.new( str.size)
> 3 p.write_string(str)
> 4 puts p.read_string # "test string"
> 5 obj[:name].write_pointer(p) # core dumps here!
> 
> line # 5 core dumps everytime one tries to write anything there, since 
> pointer is invalid I guess
> how do I allocate memory there ? once allocated can i treat that 
> allocated memory as ruby string ?
> 
> Goal I want to achieve is I shall allocate in ruby, assign in ruby and 
> pass in to C code only for modification or read only purpose
> how do I go from here ? can you comment on this ?
> 
> Aston
> 
> 
> ------------------------------------------------------------------------
> Now surf faster and smarter ! Check out the new Firefox 3 - Yahoo! 
> Edition * Click here! 
> <http://in.rd.yahoo.com/tagline_firefox_1/*http://downloads.yahoo.com/in/firefox/?fr=om_email_firefox>