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

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Ollivier R. (Guest)
on 2009-01-16 19:01
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?
Luc H. (Guest)
on 2009-01-17 12:34
(Received via mailing list)
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])
Luc H. (Guest)
on 2009-01-17 12:37
(Received via mailing list)
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.
Ollivier R. (Guest)
on 2009-01-19 13:28
(Received via mailing list)
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:in
`call'
        from (eval):3:in `setproctitle'
        from proc.rb:15
Luc H. (Guest)
on 2009-01-19 14:07
(Received via mailing list)
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 ;)

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... :/
Ollivier R. (Guest)
on 2009-01-19 14:53
(Received via mailing list)
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 :)

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

(some redundancy there... :) )

>Sorry about the wrong answers... :/

No worry, merci.
This topic is locked and can not be replied to.