[FFI] how to bind to a function with variable number of args


#1

I’m looking at ruby-ffi 0.2.0 with MRI 1.8.7 (haven’t tried with
rubinius yet) and I can get to attach to setproctitle(3) defined like
this:

 void
 setproctitle(const char *fmt, ...);

require “ffi”

module LibC
extend FFI::Library

attach_function :setproctitle, [:string, :string], []
end

LibC.setproctitle(“Ruby: executing %s”, $0)

gives

FFI::NotFoundError: Function ‘setproctitle’ not found in [[current
process]]
from
/opt/local/lib/ruby/gems/1.8/gems/ffi-0.2.0/lib/ffi/library.rb:65:in
`attach_function’

Any idea?


#2

On 16 janv. 09, at 18:00, Ollivier R. wrote:

I’m looking at ruby-ffi 0.2.0 with MRI 1.8.7 (haven’t tried with
rubinius yet) and I can get to attach to setproctitle(3) defined like
this:

void
setproctitle(const char *fmt, ...);

This would be defined like this:

module LibC
extend FFI::Library
attach_function : setproctitle, [:string, :varargs], :void
end

And then used like this:

LibC.setproctitle("%d-%d", [:string, “foo”, :int, 42])


#3

On 17 janv. 09, at 11:31, Luc H. wrote:

LibC.setproctitle("%d-%d", [:string, “foo”, :int, 42])

Er, the format string should have obviously been “%s-%d” here, sorry.


#4

In article removed_email_address@domain.invalid,
Luc H. removed_email_address@domain.invalid wrote:

This would be defined like this:

The following does not work:

module LibC
extend FFI::Library

attach_function :setproctitle, [:string, :varargs], :void
end

LibC.setproctitle(“Ruby: executing %s”, [:string, $0])

Same error:
/opt/local/lib/ruby/gems/1.8/gems/ffi-0.2.0/lib/ffi/library.rb:65:in
`attach_function’: Function ‘setproctitle’ not found in [[current
process]]
(FFI::NotFoundError) from proc.rb:12

(OS X, 10.5.6, Ruby from MacPorts)

UPDATE: setproctitle may not be available in OS X. Retrying on FreeBSD
leads
to this:

/usr/local/lib/ruby/gems/1.8/gems/ffi-0.2.0/lib/ffi/types.rb:18:in
find_type': Unable to resolve type 'stringproc.rb' (FFI::TypeError) from /usr/local/lib/ruby/gems/1.8/gems/ffi-0.2.0/lib/ffi/variadic.rb:23:incall’
from (eval):3:in `setproctitle’
from proc.rb:15


#5

In article removed_email_address@domain.invalid,
Luc H. removed_email_address@domain.invalid wrote:

This is the right way to call variadic functions using FFI (remove the
[ ]):

LibC.setproctitle(“Ruby: executing %s”, :string, $0)

… and the winner is you :slight_smile:

47629 ph S+ 0:00.26 ruby: Ruby: executing proc.rb (ruby)

(some redundancy there… :slight_smile: )

Sorry about the wrong answers… :confused:

No worry, merci.


#6

On 19 janv. 09, at 12:23, Ollivier R. wrote:

UPDATE: setproctitle may not be available in OS X.

Right. setproctitle is not available on OS X.

Retrying on FreeBSD leads
to this:

/usr/local/lib/ruby/gems/1.8/gems/ffi-0.2.0/lib/ffi/types.rb:18:in
`find_type’: Unable to resolve type ‘stringproc.rb’ (FFI::TypeError)

Yes, and that’s because I need some sleep :wink:

This is the right way to call variadic functions using FFI (remove the
[ ]):

LibC.setproctitle(“Ruby: executing %s”, :string, $0)

Sorry about the wrong answers… :confused: