| .Dd February 15, 2008 |
| .Dt ffi_call 3 |
| .Sh NAME |
| .Nm ffi_call |
| .Nd Invoke a foreign function. |
| .Sh SYNOPSIS |
| .In ffi.h |
| .Ft void |
| .Fo ffi_call |
| .Fa "ffi_cif *cif" |
| .Fa "void (*fn)(void)" |
| .Fa "void *rvalue" |
| .Fa "void **avalue" |
| .Fc |
| .Sh DESCRIPTION |
| The |
| .Nm ffi_call |
| function provides a simple mechanism for invoking a function without |
| requiring knowledge of the function's interface at compile time. |
| .Fa fn |
| is called with the values retrieved from the pointers in the |
| .Fa avalue |
| array. The return value from |
| .Fa fn |
| is placed in storage pointed to by |
| .Fa rvalue . |
| .Fa cif |
| contains information describing the data types, sizes and alignments of the |
| arguments to and return value from |
| .Fa fn , |
| and must be initialized with |
| .Nm ffi_prep_cif |
| before it is used with |
| .Nm ffi_call . |
| .Pp |
| .Fa rvalue |
| must point to storage that is sizeof(long) or larger. For smaller |
| return value sizes, the |
| .Nm ffi_arg |
| or |
| .Nm ffi_sarg |
| integral type must be used to hold |
| the return value. |
| .Sh EXAMPLES |
| .Bd -literal |
| #include <ffi/ffi.h> |
| #include <stdio.h> |
| |
| unsigned char |
| foo(unsigned int, float); |
| |
| int |
| main(int argc, const char **argv) |
| { |
| ffi_cif cif; |
| ffi_type *arg_types[2]; |
| void *arg_values[2]; |
| ffi_status status; |
| |
| // Because the return value from foo() is smaller than sizeof(long), it |
| // must be passed as ffi_arg or ffi_sarg. |
| ffi_arg result; |
| |
| // Specify the data type of each argument. Available types are defined |
| // in <ffi/ffi.h>. |
| arg_types[0] = &ffi_type_uint; |
| arg_types[1] = &ffi_type_float; |
| |
| // Prepare the ffi_cif structure. |
| if ((status = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, |
| 2, &ffi_type_uint8, arg_types)) != FFI_OK) |
| { |
| // Handle the ffi_status error. |
| } |
| |
| // Specify the values of each argument. |
| unsigned int arg1 = 42; |
| float arg2 = 5.1; |
| |
| arg_values[0] = &arg1; |
| arg_values[1] = &arg2; |
| |
| // Invoke the function. |
| ffi_call(&cif, FFI_FN(foo), &result, arg_values); |
| |
| // The ffi_arg 'result' now contains the unsigned char returned from foo(), |
| // which can be accessed by a typecast. |
| printf("result is %hhu", (unsigned char)result); |
| |
| return 0; |
| } |
| |
| // The target function. |
| unsigned char |
| foo(unsigned int x, float y) |
| { |
| unsigned char result = x - y; |
| return result; |
| } |
| .Ed |
| .Sh SEE ALSO |
| .Xr ffi 3 , |
| .Xr ffi_prep_cif 3 |