blob: fd196fea87d2d3c8e27b144633d047d4c28cabb9 [file]
/*
* Copyright 2017, Data61, CSIRO (ABN 41 687 119 230)
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <camkes/error.h>
#include <stdio.h>
#include <utils/util.h>
#include <inttypes.h>
/* The default error handler that is invoked if no other error handler is
* registered.
*/
static camkes_error_action_t default_error_handler(camkes_error_t *error)
{
fprintf(stderr, "-- %s --\n", error->instance);
switch (error->type) {
case CE_BUFFER_LENGTH_EXCEEDED:
fprintf(stderr, "Error: about to exceed buffer length by writing "
"up to %u bytes\n", error->target_length);
break;
case CE_INVALID_METHOD_INDEX:
fprintf(stderr, "Error: invalid method index of %"PRIu64"\n",
error->invalid_index);
break;
case CE_MALFORMED_RPC_PAYLOAD:
fprintf(stderr, "Error: Malformed RPC payload\n");
break;
case CE_SYSCALL_FAILED:
fprintf(stderr, "Error: syscall failed\n");
break;
case CE_ALLOCATION_FAILURE:
fprintf(stderr, "Error: allocation failed\n");
break;
default:
UNREACHABLE();
}
fprintf(stderr, "Occurred at %s:%lu\n", error->filename, error->lineno);
fprintf(stderr, "Details: %s\n", error->description);
return CEA_HALT;
}
/* Currently active error handler. */
static camkes_error_handler_t err = default_error_handler;
camkes_error_action_t camkes_error(camkes_error_t *e)
{
return err(e);
}
camkes_error_handler_t camkes_register_error_handler(camkes_error_handler_t handler)
{
camkes_error_handler_t old = err;
err = handler;
return old;
}