From: Brian Caswell Date: 2005-12-28T07:31:32+09:00 Subject: dl/loader ptr issue --Apple-Mail-2-649242102 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed I'm having fits with passing pointers to a function I've imported via DL::Importable. I'm wrapping a simple opaque blob library (part of libdnet). However, the function I'm wrapping doesn't seem to work as I expect it to. extern "int blob_read(void *blob, void *buf, int size)" Basically, read the specified amount (size) from the blob, and put it in buf. return status code. From what I've read, I should be able to wrap this with something akin to: def read (blob, len) ptr = DL.malloc(len) ret = Dnet.blob_read(blob, ptr.ref, len) return ret.to_s end However, I get a EXC_BAD_ACCESS segv duing the to_s call. How should I be getting access to buf? My current test is attached. I have validated that the shared object works as expected, when using dlopen/dlsym in C. (dnet.c works as an example usage of the C api) Brian --Apple-Mail-2-649242102 Content-Transfer-Encoding: 7bit Content-Type: application/octet-stream; x-unix-mode=0644; name="dnet.rb" Content-Disposition: attachment; filename=dnet.rb #!ruby require 'dl/import' module Dnet extend DL::Importable dlload "/sw/lib/libdnet.dylib" extern "void *blob_new()" extern "int blob_read(void *, void *, int)" extern "int blob_write(void *, void *, int)" extern "int blob_seek(void *, int, int)" class Blob @blob = nil def initialize @blob = Dnet.blob_new() end def write(str) ret = Dnet.blob_write(@blob, str.to_ptr, str.length) end def rewind() ret = Dnet.blob_seek(@blob, 0, 0) end def read(len) ptr = DL.malloc(len) ret = Dnet.blob_read(@blob, ptr.ref, len) if ptr.size == 0 '' else ptr.to_s end end end end if $0 == __FILE__ blob = Dnet::Blob.new() blob.write("hi") blob.write("mom") blob.rewind() a = blob.read(2) if a != "hi" print "ACK! #{a} should be hi\n" end end --Apple-Mail-2-649242102 Content-Transfer-Encoding: 7bit Content-Type: text/plain; x-unix-mode=0644; name="dnet.c" Content-Disposition: attachment; filename=dnet.c #include #include #include #include main() { void *handle; void *(*blob_new)(void); int (*blob_write)(void *, void *, int); int (*blob_read)(void *, void *, int); int (*blob_seek)(void *, int, int); int (*blob_free)(void *); char *c; char tmp[32]; void *blob; handle = dlopen("/sw/lib/libdnet.dylib", 1); if(dlerror()) { fprintf(stderr, "couldnt open libdnet.dylib\n"); abort(); } blob_new = dlsym(handle, "blob_new"); if(dlerror()) { fprintf(stderr, "couldnt get blob_new symbol\n"); abort(); } blob_write = dlsym(handle, "blob_write"); if(dlerror()) { fprintf(stderr, "couldnt get blob_write symbol\n"); abort(); } blob_read = dlsym(handle, "blob_read"); if(dlerror()) { fprintf(stderr, "couldnt get blob_read symbol\n"); abort(); } blob_seek = dlsym(handle, "blob_seek"); if(dlerror()) { fprintf(stderr, "couldnt get blob_seek symbol\n"); abort(); } blob_free = dlsym(handle, "blob_free"); if(dlerror()) { fprintf(stderr, "couldnt get blob_free symbol\n"); abort(); } blob = blob_new(); blob_write(blob, "foo", 3); blob_write(blob, "bar", 3); blob_seek(blob, 0, 0); blob_read(blob, tmp, 3); tmp[4] = 0; printf("GOT %s\n", tmp); blob_read(blob, tmp, 3); printf("GOT %s\n", tmp); tmp[4] = 0; blob_seek(blob, 0, 0); blob_read(blob, tmp, 6); tmp[7] = 0; printf("GOT %s\n", tmp); blob_free(blob); dlclose(handle); } --Apple-Mail-2-649242102--