Empty yang type. Relaxed yang types for unions, eg two strings with different length.
This commit is contained in:
parent
bc2b606167
commit
319e7707d8
14 changed files with 64 additions and 113 deletions
|
|
@ -495,7 +495,7 @@ compare_dbs(clicon_handle h, cvec *cvv, cg_var *arg)
|
|||
* cvv[2] = "bgp"
|
||||
* arg = "/interfaces/interface/%s/type"
|
||||
* op: OP_MERGE
|
||||
* @see cli_callback_xmlkeyfmt_generate where arg is generated
|
||||
* @see cli_callback_generate where arg is generated
|
||||
*/
|
||||
static int
|
||||
cli_dbxml(clicon_handle h,
|
||||
|
|
@ -508,17 +508,20 @@ cli_dbxml(clicon_handle h,
|
|||
char *xkfmt; /* xml key format */
|
||||
char *xk = NULL; /* xml key */
|
||||
cg_var *cval;
|
||||
char *val = NULL;
|
||||
int len;
|
||||
|
||||
xkfmt = cv_string_get(arg);
|
||||
if (xmlkeyfmt2key(xkfmt, cvv, &xk) < 0)
|
||||
goto done;
|
||||
cval = cvec_i(cvv, cvec_len(cvv)-1);
|
||||
if ((val = cv2str_dup(cval)) == NULL){
|
||||
clicon_err(OE_UNIX, errno, "cv2str_dup");
|
||||
goto done;
|
||||
len = cvec_len(cvv);
|
||||
if (len > 1){
|
||||
cval = cvec_i(cvv, len-1);
|
||||
if ((str = cv2str_dup(cval)) == NULL){
|
||||
clicon_err(OE_UNIX, errno, "cv2str_dup");
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
if (clicon_rpc_change(h, "candidate", op, xk, val) < 0)
|
||||
if (clicon_rpc_change(h, "candidate", op, xk, str) < 0)
|
||||
goto done;
|
||||
if (clicon_autocommit(h)) {
|
||||
if (clicon_rpc_commit(h, "candidate", "running", 0, 0) < 0)
|
||||
|
|
|
|||
|
|
@ -72,104 +72,31 @@
|
|||
/*=====================================================================
|
||||
* YANG generate CLI
|
||||
*=====================================================================*/
|
||||
#if 0 /* examples/ntp */
|
||||
ntp("Network Time Protocol"),cli_set("ntp");{
|
||||
logging("Configure NTP message logging"),cli_set("ntp.logging");{
|
||||
status (<status:bool>),cli_set("ntp.logging $status:bool");
|
||||
}
|
||||
server("Configure NTP Server") (<ipv4addr:ipv4addr>("IPv4 address of peer")),cli_set("ntp.server[] $!ipv4addr:ipv4addr");
|
||||
}
|
||||
#endif
|
||||
#if 0 /* examples/datamodel */
|
||||
|
||||
WITH COMPLETION:
|
||||
a (<x:number>|<x:number expand_dbvar_auto("candidate a[] $!x")>),cli_set("a[] $!x");{
|
||||
b,cli_set("a[].b $!x");{
|
||||
y (<y:string>|<y:string expand_dbvar_auto("candidate a[].b $!x $y")>),cli_set("a[].b $!x $y");
|
||||
}
|
||||
z (<z:string>|<z:string expand_dbvar_auto("candidate a[] $!x $z")>),cli_set("a[] $!x $z");
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_CLIGEN_MAX2STR /* XXX cligen 3.6 feature */
|
||||
|
||||
/*! Print max value of a CLIgen variable type as string
|
||||
* @param[in] type CLIgen variable type
|
||||
* @param[out] str Max value printed in this string
|
||||
* @param[in] size Length of 'str'
|
||||
* @retval len How many bytes printed
|
||||
* @see cvtype_max2str_dup
|
||||
* You can use str=NULL to get the expected length.
|
||||
* The number of (potentially if str=NULL) written bytes is returned.
|
||||
*/
|
||||
static int
|
||||
cvtype_max2str(enum cv_type type, char *str, size_t size)
|
||||
{
|
||||
int len = 0;
|
||||
|
||||
switch (type){
|
||||
case CGV_INT8:
|
||||
len = snprintf(str, size, "%" PRId8, INT8_MAX);
|
||||
break;
|
||||
case CGV_INT16:
|
||||
len = snprintf(str, size, "%" PRId16, INT16_MAX);
|
||||
break;
|
||||
case CGV_INT32:
|
||||
len = snprintf(str, size, "%" PRId32, INT32_MAX);
|
||||
break;
|
||||
case CGV_INT64:
|
||||
len = snprintf(str, size, "%" PRId64, INT64_MAX);
|
||||
break;
|
||||
case CGV_UINT8:
|
||||
len = snprintf(str, size, "%" PRIu8, UINT8_MAX);
|
||||
break;
|
||||
case CGV_UINT16:
|
||||
len = snprintf(str, size, "%" PRIu16, UINT16_MAX);
|
||||
break;
|
||||
case CGV_UINT32:
|
||||
len = snprintf(str, size, "%" PRIu32, UINT32_MAX);
|
||||
break;
|
||||
case CGV_UINT64:
|
||||
len = snprintf(str, size, "%" PRIu64, UINT64_MAX);
|
||||
break;
|
||||
case CGV_DEC64:
|
||||
len = snprintf(str, size, "%" PRId64 ".0", INT64_MAX);
|
||||
break;
|
||||
case CGV_BOOL:
|
||||
len = snprintf(str, size, "true");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
/*
|
||||
This is an example yang module:
|
||||
module m {
|
||||
container x {
|
||||
list m1 {
|
||||
key "a";
|
||||
leaf a {
|
||||
type string;
|
||||
}
|
||||
leaf b {
|
||||
type string;
|
||||
}
|
||||
}
|
||||
return len;
|
||||
}
|
||||
}
|
||||
|
||||
/*! Print max value of a CLIgen variable type as string
|
||||
*
|
||||
* The string should be freed after use.
|
||||
* @param[in] type CLIgen variable type
|
||||
* @retval str Malloced string containing value. Should be freed after use.
|
||||
* @see cvtype_max2str
|
||||
*/
|
||||
static char *
|
||||
cvtype_max2str_dup(enum cv_type type)
|
||||
You can see which CLISPEC it generates via clixon_cli -D 1:
|
||||
Jan 2 11:17:58: yang2cli: buf
|
||||
} x,cli_set("/x");{
|
||||
m1 (<a:string>|<a:string expand_dbvar("candidate /x/m1/%s/a")>),cli_set("/x/m1/%s");
|
||||
{
|
||||
int len;
|
||||
char *str;
|
||||
|
||||
if ((len = cvtype_max2str(type, NULL, 0)) < 0)
|
||||
return NULL;
|
||||
if ((str = (char *)malloc (len+1)) == NULL)
|
||||
return NULL;
|
||||
memset (str, '\0', len+1);
|
||||
if ((cvtype_max2str(type, str, len+1)) < 0){
|
||||
free(str);
|
||||
return NULL;
|
||||
}
|
||||
return str;
|
||||
}
|
||||
#endif /* HAVE_CLIGEN_MAX2STR */
|
||||
b (<b:string>|<b:string expand_dbvar("candidate /x/m1/%s/b")>),cli_set("/x/m1/%s/b");
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
/*! Create cligen variable expand entry with xmlkey format string as argument
|
||||
* @param[in] h clicon handle
|
||||
|
|
|
|||
|
|
@ -377,6 +377,9 @@ main(int argc, char **argv)
|
|||
/* Join rest of argv to a single command */
|
||||
restarg = clicon_strjoin(argc, argv, " ", __FUNCTION__);
|
||||
|
||||
/* If several cligen object variables match same preference, select first */
|
||||
cligen_match_cgvar_same(1);
|
||||
|
||||
/* Call start function in all plugins before we go interactive
|
||||
Pass all args after the standard options to plugin_start
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -81,9 +81,9 @@ static int xml2csv(FILE *f, cxobj *x, cvec *cvv);
|
|||
* Returns an expand-type list of commands as used by cligen 'expand'
|
||||
* functionality.
|
||||
*
|
||||
* Assume callback given in a cligen spec: a <x:int expand_dbvar_auto("arg")
|
||||
* Assume callback given in a cligen spec: a <x:int expand_dbvar("arg")
|
||||
* @param[in] h clicon handle
|
||||
* @param[in] name Name of this function (eg "expand_dbvar-auto")
|
||||
* @param[in] name Name of this function (eg "expand_dbvar")
|
||||
* @param[in] cvv The command so far. Eg: cvec [0]:"a 5 b"; [1]: x=5;
|
||||
* @param[in] arg Argument given at the callback "<db> <xmlkeyfmt>"
|
||||
* @param[out] len len of return commands & helptxt
|
||||
|
|
@ -121,7 +121,7 @@ expand_dbvar(void *h,
|
|||
clicon_err(OE_PLUGIN, 0, "%s: requires string argument", __FUNCTION__);
|
||||
goto done;
|
||||
}
|
||||
/* In the example, str = "candidate a[].b[] $!x $!y" */
|
||||
/* In the example, str = "candidate /x/m1/%s/b" */
|
||||
if ((vec = clicon_strsplit(str, " ", &nvec, __FUNCTION__)) == NULL){
|
||||
clicon_err(OE_PLUGIN, errno, "clicon_strsplit");
|
||||
goto done;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue