#include "config.h"
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#include "dwarf_incl.h"
#include "dwarf_alloc.h"
#include "dwarfstring.h"
#include "dwarf_error.h"
#include "dwarf_errmsg_list.h"
void
dwarf_error_creation(Dwarf_Debug dbg,
Dwarf_Error *err,
char *errmsg)
{
dwarfstring m;
if(!dbg) {
return;
}
dwarfstring_constructor(&m);
dwarfstring_append(&m,"DW_DLE_USER_DECLARED_ERROR: ");
dwarfstring_append(&m,errmsg);
_dwarf_error_string(dbg,err,
DW_DLE_USER_DECLARED_ERROR,
dwarfstring_string(&m));
dwarfstring_destructor(&m);
}
void
_dwarf_error(Dwarf_Debug dbg, Dwarf_Error * error,
Dwarf_Signed errval)
{
_dwarf_error_string(dbg,error,errval,0);
}
void
_dwarf_error_string(Dwarf_Debug dbg, Dwarf_Error * error,
Dwarf_Signed errval,char *msg)
{
Dwarf_Error errptr;
if (error) {
if (dbg) {
errptr =
(Dwarf_Error) _dwarf_get_alloc(dbg, DW_DLA_ERROR, 1);
if (!errptr) {
errptr = &_dwarf_failsafe_error;
errptr->er_static_alloc = DE_STATIC;
} else {
errptr->er_static_alloc = DE_STANDARD;
}
} else {
errptr = _dwarf_special_no_dbg_error_malloc();
if (!errptr) {
errptr = &_dwarf_failsafe_error;
errptr->er_static_alloc = DE_STATIC;
} else {
errptr->er_static_alloc = DE_MALLOC;
}
}
errptr->er_errval = errval;
if (msg) {
dwarfstring *em = 0;
#ifdef DEBUG
printf("libdwarfdetector ALLOC creating error string %s errval %ld errptr 0x%lx \n",msg,(long)errval,(unsigned long)errptr);
#endif
em = (dwarfstring *)calloc(1,sizeof(dwarfstring));
if (em) {
dwarfstring_constructor(em);
dwarfstring_append(em,msg);
errptr->er_msg = (void*)em;
}
}
*error = errptr;
return;
}
if (dbg != NULL && dbg->de_errhand != NULL) {
errptr = (Dwarf_Error) _dwarf_get_alloc(dbg, DW_DLA_ERROR, 1);
if (errptr == NULL) {
errptr = &_dwarf_failsafe_error;
errptr->er_static_alloc = DE_STATIC;
}
errptr->er_errval = errval;
dbg->de_errhand(errptr, dbg->de_errarg);
return;
}
fflush(stdout);
fprintf(stdout,
"\nNow abort() in libdwarf. "
"No error argument or handler available.\n");
fflush(stdout);
abort();
}
Dwarf_Unsigned
dwarf_errno(Dwarf_Error error)
{
if (!error) {
return (0);
}
return (error->er_errval);
}
char*
dwarf_errmsg_by_number(Dwarf_Unsigned errornum )
{
if (errornum >=
(Dwarf_Signed)(sizeof(_dwarf_errmsgs) / sizeof(char *))) {
return "Dwarf_Error value out of range";
}
return ((char *) _dwarf_errmsgs[errornum]);
}
char *
dwarf_errmsg(Dwarf_Error error)
{
if (!error) {
return "Dwarf_Error is NULL";
}
if (error->er_msg) {
return dwarfstring_string(error->er_msg);
}
return dwarf_errmsg_by_number(error->er_errval);
}