push out uci error messages to lua as well
[project/uci.git] / uci_internal.h
index 67a2473..111982e 100644 (file)
@@ -43,7 +43,7 @@ __plugin void *uci_malloc(struct uci_context *ctx, size_t size);
 __plugin void *uci_realloc(struct uci_context *ctx, void *ptr, size_t size);
 __plugin char *uci_strdup(struct uci_context *ctx, const char *str);
 __plugin bool uci_validate_str(const char *str, bool name);
-__plugin void uci_add_history(struct uci_context *ctx, struct uci_list *list, int cmd, char *section, char *option, char *value);
+__plugin void uci_add_history(struct uci_context *ctx, struct uci_list *list, int cmd, const char *section, const char *option, const char *value);
 __plugin void uci_free_history(struct uci_history *h);
 __plugin struct uci_package *uci_alloc_package(struct uci_context *ctx, const char *name);
 
@@ -114,9 +114,10 @@ struct uci_backend _var = {                \
        ctx->err = 0;                   \
        if (!ctx)                       \
                return UCI_ERR_INVAL;   \
-       if (!ctx->internal)             \
+       if (!ctx->internal && !ctx->nested) \
                __val = setjmp(ctx->trap); \
        ctx->internal = false;          \
+       ctx->nested = false;            \
        if (__val) {                    \
                DPRINTF("LEAVE: %s, ret=%d\n", __func__, __val); \
                ctx->err = __val;       \
@@ -155,6 +156,18 @@ struct uci_backend _var = {                \
        func(ctx, __VA_ARGS__);         \
 } while (0)
 
+/**
+ * UCI_NESTED: Do an normal nested call of a public API function
+ * 
+ * Sets Exception handling to passthrough mode.
+ * Allows API functions to change behavior compared to public use
+ */
+#define UCI_NESTED(func, ctx, ...) do { \
+       ctx->nested = true;             \
+       func(ctx, __VA_ARGS__);         \
+} while (0)
+
+
 /*
  * check the specified condition.
  * throw an invalid argument exception if it's false