#include "dever_ffi.h" #include #include extern long long fixture_triple(long long value); static int invoke(void *context, dever_ffi_slice operation, dever_ffi_slice payload, dever_ffi_output *output) { (void)context; if (operation.size == 6 && memcmp(operation.data, "reject", 6) == 0) { const char *error = "{\"error\":\"example.Rejected\",\"payload\":null}"; memcpy(output->data, error, strlen(error)); output->size = strlen(error); return DEVER_FFI_ERROR; } if (operation.size == 10 && memcmp(operation.data, "bad_length", 10) == 0) { output->size = output->capacity + 1; return DEVER_FFI_OK; } if (operation.size == 5 && memcmp(operation.data, "fault", 5) == 0) return DEVER_FFI_FAULT; if (payload.size >= 64) return DEVER_FFI_FAULT; char input[64]; memcpy(input, payload.data, (size_t)payload.size); input[payload.size] = 0; long long value = 0; if (sscanf(input, "{\"value\":%lld}", &value) != 1 || value > 1000000 || value < -1000000) return DEVER_FFI_FAULT; int size = snprintf(output->data, (size_t)output->capacity, "{\"value\":%lld}", fixture_triple(value)); if (size < 0 || (uint64_t)size >= output->capacity) return DEVER_FFI_FAULT; output->size = (uint64_t)size; return DEVER_FFI_OK; } static void closed(void *context) { (void)context; fputs("closed\n", stderr); } int main(void) { const dever_ffi_handler handler = {DEVER_FFI_ABI_V1, NULL, NULL, invoke, closed}; return dever_ffi_serve(&handler); }