X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fuci.git;a=blobdiff_plain;f=err.h;h=358cadfe942f4685d0166c8fa0bb5eb5641666fb;hp=cf428563e960def9a98c2109b67e3e8f93955452;hb=4094cedb83a0b92a179af13d1781a8fd7d3d943e;hpb=7952092949fb0dccd126d5ff6f73807feb4211b8 diff --git a/err.h b/err.h index cf42856..358cadf 100644 --- a/err.h +++ b/err.h @@ -16,7 +16,7 @@ * functions for debug and error handling, for internal use only */ -#ifdef DEBUG +#ifdef UCI_DEBUG #define DPRINTF(...) fprintf(stderr, __VA_ARGS__) #else #define DPRINTF(...) @@ -27,6 +27,7 @@ * in the context. */ #define UCI_THROW(ctx, err) do { \ + DPRINTF("Exception: %s in %s, %s:%d\n", #err, __func__, __FILE__, __LINE__); \ longjmp(ctx->trap, err); \ } while (0) @@ -36,13 +37,17 @@ * * NB: this does not handle recursion at all. Calling externally visible * functions from other uci functions is only allowed at the end of the - * calling function. + * calling function, or by wrapping the function call in UCI_TRAP_SAVE + * and UCI_TRAP_RESTORE. */ #define UCI_HANDLE_ERR(ctx) do { \ - int __val; \ + DPRINTF("ENTER: %s\n", __func__); \ + int __val = 0; \ if (!ctx) \ return UCI_ERR_INVAL; \ - __val = setjmp(ctx->trap); \ + if (!ctx->internal) \ + __val = setjmp(ctx->trap); \ + ctx->internal = false; \ if (__val) { \ ctx->errno = __val; \ return __val; \ @@ -69,6 +74,17 @@ memcpy(ctx->trap, __old_trap, sizeof(ctx->trap)); \ } while(0) +/** + * UCI_INTERNAL: Do an internal call of a public API function + * + * Sets Exception handling to passthrough mode. + * Allows API functions to change behavior compared to public use + */ +#define UCI_INTERNAL(func, ctx, ...) do { \ + ctx->internal = true; \ + func(ctx, __VA_ARGS__); \ +} while (0) + /* * check the specified condition. * throw an invalid argument exception if it's false