Subject: [ruby-ffi] Low-level dbus API, ffi and strings |
From: Christoph Kappel |
Date: 2/10/10 4:20 AM |
To: ruby-ffi |
Hello, I have some problems calling following C function with a string as value: dbus_bool_t dbus_message_iter_append_basic(DBusMessageIter *iter, int type, const void *value) I attached it via ffi: attach_function(:dbus_message_iter_append_basic, :dbus_message_iter_append_basic, [ :pointer, DBusType, :pointer ], :bool ) (DBusType is an enum with the allowed types as integer.) In C it should look like this and it allows several types casted to void: DBusMessageIter iter; char *value = "foobar"; dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &value); I will now post what I tried with the related error message: 1) pname = FFI::MemoryPointer.new(:pointer) pname.write_string("subtle") dbus_message_iter_append_basic(piter, :type_string, pname) Ruby exception: IndexError: Memory access offset=0 size=6 is out of bounds 2) pname = FFI::MemoryPointer.new(:string) pname.write_string("subtle") dbus_message_iter_append_basic(piter, :type_string, pname) Ruby exception: ArgumentError: Unknown native type 3) pname = FFI::MemoryPointer.from_string("subtle") dbus_message_iter_append_basic(piter, :type_string, pname) Segmentation fault: (Backtrace from valgrind) ==8501== Invalid read of size 1 ==8501== at 0x4024878: strlen (in /usr/lib/valgrind/ vgpreload_memcheck-x86-linux.so) ==8501== by 0x5A56B8C: _dbus_marshal_write_basic (in /usr/lib/ libdbus-1.so.3.4.0) ==8501== by 0x5A42962: _dbus_type_writer_write_basic (in /usr/lib/ libdbus-1.so.3.4.0) ==8501== by 0x5A4789D: dbus_message_iter_append_basic (in /usr/lib/ libdbus-1.so.3.4.0) ... 4) I attached another function and changed value type to :string: attach_function(:dbus_message_iter_append_string, :dbus_message_iter_append_basic, [ :pointer, DBusType, :string ], :bool ) Segmentation fault again: ==8524== Invalid read of size 1 ==8524== at 0x4024878: strlen (in /usr/lib/valgrind/ vgpreload_memcheck-x86-linux.so) ==8524== by 0x5A56B8C: _dbus_marshal_write_basic (in /usr/lib/ libdbus-1.so.3.4.0) ==8524== by 0x5A42962: _dbus_type_writer_write_basic (in /usr/lib/ libdbus-1.so.3.4.0) ==8524== by 0x5A4789D: dbus_message_iter_append_basic (in /usr/lib/ libdbus-1.so.3.4.0) ... Any options left? Thanks in advance.