diff --git a/src/libsrx/src/srx_val.c b/src/libsrx/src/srx_val.c index 961e72fa..ac820458 100644 --- a/src/libsrx/src/srx_val.c +++ b/src/libsrx/src/srx_val.c @@ -149,28 +149,59 @@ bool srx_isset(sr_session_ctx_t *session, const char *fmt, ...) return isset; } -int srx_set_item(sr_session_ctx_t *session, const sr_val_t *val, sr_edit_options_t opts, - const char *fmt, ...) +static int set_vaitem(sr_session_ctx_t *session, const sr_val_t *val, sr_edit_options_t opts, + const char *fmt, va_list ap) { + va_list apdup; char *xpath; - va_list ap; size_t len; - va_start(ap, fmt); - len = vsnprintf(NULL, 0, fmt, ap) + 1; - va_end(ap); + va_copy(apdup, ap); + len = vsnprintf(NULL, 0, fmt, apdup) + 1; + va_end(apdup); xpath = alloca(len); if (!xpath) return -1; - va_start(ap, fmt); - vsnprintf(xpath, len, fmt, ap); - va_end(ap); + va_copy(apdup, ap); + vsnprintf(xpath, len, fmt, apdup); + va_end(apdup); return sr_set_item(session, xpath, val, opts); } +int srx_set_item(sr_session_ctx_t *session, const sr_val_t *val, sr_edit_options_t opts, + const char *fmt, ...) +{ + va_list ap; + int rc; + + va_start(ap, fmt); + rc = set_vaitem(session, val, opts, fmt, ap); + va_end(ap); + + return rc; +} + +int srx_set_bool(sr_session_ctx_t *session, bool ena, sr_edit_options_t opts, + const char *fmt, ...) +{ + sr_val_t val = { + .type = SR_BOOL_T, + .data.bool_val = ena + }; + va_list ap; + int rc; + + va_start(ap, fmt); + rc = set_vaitem(session, &val, opts, fmt, ap); + va_end(ap); + + return rc; +} + + int srx_set_str(sr_session_ctx_t *session, const char *str, sr_edit_options_t opts, const char *fmt, ...) { diff --git a/src/libsrx/src/srx_val.h b/src/libsrx/src/srx_val.h index e95a3f79..1b2d1ada 100644 --- a/src/libsrx/src/srx_val.h +++ b/src/libsrx/src/srx_val.h @@ -20,6 +20,8 @@ int srx_set_item(sr_session_ctx_t *, const sr_val_t *, sr_edit_options_t, const __attribute__ ((format (printf, 4, 5))); int srx_set_str(sr_session_ctx_t *, const char *, sr_edit_options_t, const char *fmt, ...) __attribute__ ((format (printf, 4, 5))); +int srx_set_bool(sr_session_ctx_t *session, bool ena, sr_edit_options_t opts, const char *fmt, ...) + __attribute__ ((format (printf, 4, 5))); char *srx_get_str (sr_session_ctx_t *session, const char *fmt, ...) __attribute__ ((format (printf, 2, 3)));