Thanks to the awesome help from Benvie, we figured out the issue.

When declaring the structs, I wanted to create a property that is a pointer 
to another struct.  Following my intuition and my understanding of 
ref-struct I did:
pst_desc_tree.defineProperty('next', ref.refType(pst_desc_tree));  The 
assumption here is that ref.refType(struct_name) will return a pointer to 
that struct.  However struct_name was already a pointer to the struct so in 
fast ref.refType was returning a pointer to a pointer to a struct.
Therefore the correct definition is:  pst_desc_tree.defineProperty('next', 
pst_desc_tree); which means "next" is a pointer to struct named 
pst_desc_tree which is defined by simply: var pst_desc_tree = new Struct();

Anyways, I thought I'd circle back and provide the answer in case anyone 
else is interested in delving into the awesome world of FFI.

Roy

On Thursday, September 6, 2012 1:21:59 AM UTC-4, rhasson wrote:
>
> So the example I used here was just for the sake of understanding how ref 
> and struct work.  I think I get it now.
>
> Now I started all this because I wanted to create FFI bindings to libpst (
> http://www.five-ten-sg.com/libpst/).  I started by creating all the 
> necessary structs and made a call to the first function which opens the 
> .PST file (outlook personal file), followed by calls to create the indexes. 
>  The basic members of the struct are populated fine, however the nested 
> structs are not.  They come back with strange memory addresses 
> which obviously cause seg fault when I try to access them.
>
> The main code is here 
> https://github.com/rhasson/node-libpst/blob/master/ffi_nodepst.js#L1153-L1175scrolling
>  to the top of the source you will see all the struct declarations.
>
> Here is the output of GDB:
>
> (gdb) run
> Starting program: /usr/local/bin/node ffi_nodepst.js
> Reading symbols for shared libraries 
> ++++.........................................................................................................................................
>  
> done
> Reading symbols for shared libraries . done
> Reading symbols for shared libraries . done
> Reading symbols for shared libraries . done
> File outlook.pst was opened successfully  //outlook.pst is the file I'm 
> opening and is populated within the pst_file struct and returned correctly
> Loading index...
> index ret:  0  //0 means that the indexes were loaded correctly, however 
> here is where the nested structs are malloced and populated by the library
> Loading extended attributes...
> extended ret:  1  //1 means that the extended attributes where loaded 
> correctly, again I can't access them
> f:  { _pointer: <Buffer@0x1010644f0 a0 30 69 75 ff 7f 00 00 00 14 81 02 01 
> 00 00 00 d0 04 20 02 01 00 00 00 00 00 00 00 00 00 00 00 90 0d 20 02 01 00 
> 00 00 30 12 20 02 01 00 00 00 60 12 20 ...> }
> i_head:  false  //this is just a ref.isNull() test on each of the nested 
> structs
> i_tail:  false
> d_head:  false
> d_tail:  false
> x_head:  false
> block_head:  false
>
> Program received signal EXC_BAD_ACCESS, Could not access memory.   //here 
> I try to do f.i_head.deref() which fails since the memory location is not 
> valid, but I can't figure out why.
> Reason: KERN_INVALID_ADDRESS at address: 0x0000000000007600
> 0x0000000100167dcc in 
> v8::internal::ElementsAccessorBase<v8::internal::ExternalUnsignedByteElementsAccessor,
>  
> v8::internal::ElementsKindTraits<(v8::internal::ElementsKind)9> >::Get ()
> (gdb) 
>
>
> On Wednesday, September 5, 2012 5:12:55 PM UTC-4, Nathan Rajlich wrote:
>>
>> Glad you're figuring it out on your own :p 
>>
>> I don't get your latest question: you're already passing a struct in 
>> by reference in the setT() function so I'm not sure what's different. 
>>
>> On Wed, Sep 5, 2012 at 1:44 PM, rhasson <rha...@gmail.com> wrote: 
>> > Now, the issue I'm having is in trying to port this methodology to an 
>> > external library out of my control (libpst) which does not use malloc 
>> on 
>> > local structs that then have pointers assigned to the main struct that 
>> was 
>> > passed in by reference which are then overwritten.  Is there a way to 
>> > address this using node-ref and node-struct ? 
>> > 
>> > 
>> > On Wednesday, September 5, 2012 1:09:48 AM UTC-4, rhasson wrote: 
>> >> 
>> >> Nate, 
>> >> 
>> >> I'm back with some more questions about node-struct and handling 
>> nested 
>> >> structures. 
>> >> 
>> >> In the example below, I created one simple struct with a single Int 
>> and 
>> >> another struct with an Int and a pointer to the first struct. 
>> >> What I noticed is that I can't access the int inside the nested 
>> structure. 
>> >> Another thing I noticed is that if I do something like this: 
>> >> var myStruct = Struct(); 
>> >> myStruct.defineProperty('someProp', ref.refType('int')); 
>> >> 
>> >> var t = new myStruct(); 
>> >> 
>> >> accessing t.someProp fails.  If I change the definition above to 
>> >> ('someProp', ref.types.int), I can access t.someProp with no problem. 
>> >> 
>> >> Why is this and how to deal with this? 
>> >> 
>> >> Below you can see I'm running into the same issue, however since I'm 
>> >> defining the property is a refType(struct_one) I can't figure out how 
>> to 
>> >> access its propertied.  It seems like it's an unrecognized type. 
>> >> 
>> >> I have this .js file: 
>> >> 
>> >> var ffi = require('ffi'); 
>> >> var ref = require('ref'); 
>> >> var Struct = require('ref-struct'); 
>> >> 
>> >> //define a simple struct 
>> >> var t = Struct({ 
>> >>   't_i': 'int' 
>> >> }); 
>> >> 
>> >> //define a second stuct with a pointer to an instance of the first 
>> struct 
>> >> var f = new Struct(); 
>> >>   f.defineProperty('fp_i', ref.types.int); 
>> >>   f.defineProperty('t_p', ref.refType(t)); 
>> >> 
>> >> var tPtr = ref.refType(t); 
>> >> var fPtr = ref.refType(f); 
>> >> 
>> >> var lib = './libffi.so.1.0.1'; 
>> >> 
>> >> var l = ffi.Library(lib, { 
>> >>         'setT': ['void', [fPtr]] 
>> >>         }); 
>> >> 
>> >> var _f = new f(); 
>> >> var x = null, d = null; 
>> >> console.log(_f);  //I see the buffer that's created 
>> >> l.setT(_f.ref()); 
>> >> 
>> >> console.log(_f);  //I see the updated buffer 
>> >> 
>> >> console.log('fp_i: ', _f.fp_i);  //works great, returns the expected 
>> value 
>> >> 
>> >> console.log('t_i: ', _f.t_p.t_i); //this is undefined, not sure how to 
>> >> access the nested struct's members. 
>> >> 
>> >> My .c file looks like this: 
>> >> 
>> >> #include <stdio.h> 
>> >> #include <string.h> 
>> >> 
>> >> typedef struct t { 
>> >>   int t_i; 
>> >> } t; 
>> >> 
>> >> typedef struct f { 
>> >>   int fp_i; 
>> >>   struct t *t_p; 
>> >> } f; 
>> >> 
>> >> void setT(f *i) { 
>> >>   t *tt; 
>> >> 
>> >>   i->fp_i = 5; 
>> >>   tt->t_i = 6; 
>> >>   i->t_p = tt; 
>> >>   printf("\tThis is a test: %i\n", i->t_p->t_i);  //successfully 
>> prints 6 
>> >> } 
>> >> 
>> >> void main(){} 
>> >> 
>> >> 
>> > -- 
>> > Job Board: http://jobs.nodejs.org/ 
>> > Posting guidelines: 
>> > https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines 
>> > You received this message because you are subscribed to the Google 
>> > Groups "nodejs" group. 
>> > To post to this group, send email to nod...@googlegroups.com 
>> > To unsubscribe from this group, send email to 
>> > nodejs+un...@googlegroups.com 
>> > For more options, visit this group at 
>> > http://groups.google.com/group/nodejs?hl=en?hl=en 
>>
>

-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to nodejs@googlegroups.com
To unsubscribe from this group, send email to
nodejs+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

Reply via email to