CLI argument to shell example callback

Save state of netconf chunked framing between inputs
Treat EBADF in internal protocol (triggered by freebsd+notifications)
Test: chunked encoding: use printf instead of echo
This commit is contained in:
Olof hagsand 2022-04-10 10:31:03 +02:00
parent ac7673bc35
commit ecac027d18
7 changed files with 45 additions and 17 deletions

View file

@ -556,6 +556,9 @@ cli_set_mode(clicon_handle h,
/*! Start bash from cli callback
* Typical usage: shell("System Bash") <source:rest>, cli_start_shell();
* @param[in] h Clixon handle
* @param[in] cvv Vector of command variables
* @param[in] argv [<shell>], defaults to "sh"
*/
int
cli_start_shell(clicon_handle h,
@ -563,6 +566,7 @@ cli_start_shell(clicon_handle h,
cvec *argv)
{
char *cmd;
char *shcmd = "sh";
struct passwd *pw;
int retval = -1;
char bcmd[128];
@ -570,6 +574,14 @@ cli_start_shell(clicon_handle h,
sigset_t oldsigset;
struct sigaction oldsigaction[32] = {0,};
if (cvec_len(argv) > 1){
clicon_err(OE_PLUGIN, EINVAL, "Received %d arguments. Expected: [<shell>]",
cvec_len(argv));
goto done;
}
if (cvec_len(argv) == 1){
shcmd = cv_string_get(cvec_i(argv, 0));
}
cmd = (cvec_len(vars)>1 ? cv_string_get(cv1) : NULL);
if ((pw = getpwuid(getuid())) == NULL){
clicon_err(OE_UNIX, errno, "getpwuid");
@ -587,19 +599,21 @@ cli_start_shell(clicon_handle h,
cli_signal_flush(h);
cli_signal_unblock(h);
if (cmd){
snprintf(bcmd, 128, "bash -l -c \"%s\"", cmd);
snprintf(bcmd, 128, "%s -l -c \"%s\"", shcmd, cmd);
if (system(bcmd) < 0){
cli_signal_block(h);
clicon_err(OE_UNIX, errno, "system(bash -c)");
goto done;
}
}
else
if (system("bash -l") < 0){
else{
snprintf(bcmd, 128, "%s -l", shcmd);
if (system(bcmd) < 0){
cli_signal_block(h);
clicon_err(OE_UNIX, errno, "system(bash)");
goto done;
}
}
cli_signal_block(h);
#if 0 /* Allow errcodes from bash */
if (retval != 0){
@ -729,7 +743,7 @@ compare_xmls(cxobj *xc1,
/*! Compare two dbs using XML. Write to file and run diff
* @param[in] h Clicon handle
* @param[in] cvv
* @param[in] arg arg: 0 as xml, 1: as text
* @param[in] argv arg: 0 as xml, 1: as text
*/
int
compare_dbs(clicon_handle h,
@ -1459,3 +1473,4 @@ cli_restart_plugin(clicon_handle h,
done:
return retval;
}

View file

@ -79,6 +79,8 @@
* <foo/> ..wait 1min ]]>]]>
*/
#define NETCONF_HASH_BUF "netconf_input_cbuf"
#define NETCONF_FRAME_STATE "netconf_input_frame_state"
#define NETCONF_FRAME_SIZE "netconf_input_frame_size"
/*! Ignore errors on packet errors: continue */
static int ignore_packet_errors = 1;
@ -509,13 +511,23 @@ netconf_input_cb(int s,
size_t cdatlen = 0;
clicon_hash_t *cdat = clicon_data(h); /* Save cbuf between calls if not done */
int poll;
int frame_state = 0;
int i;
int len;
int frame_state;
size_t frame_size;
int ret;
int eof = 0; /* Set to 1 if pending close socket */
if (clicon_option_exists(h, NETCONF_FRAME_STATE) == 0)
frame_state = 0;
else
if ((frame_state = clicon_option_int(h, NETCONF_FRAME_STATE)) < 0)
goto done;
if (clicon_option_exists(h, NETCONF_FRAME_SIZE) == 0)
frame_size = 0;
else
if ((frame_size = clicon_option_int(h, NETCONF_FRAME_SIZE)) < 0)
goto done;
if ((ptr = clicon_hash_value(cdat, NETCONF_HASH_BUF, &cdatlen)) != NULL){
if (cdatlen != sizeof(cb)){
clicon_err(OE_XML, errno, "size mismatch %lu %lu",
@ -577,6 +589,7 @@ netconf_input_cb(int s,
else{
cprintf(cb, "%c", buf[i]);
if (detect_endtag("]]>]]>", buf[i], &frame_state)){
frame_state = 0;
/* OK, we have an xml string from a client */
/* Remove trailer */
*(((char*)cbuf_get(cb)) + cbuf_len(cb) - strlen("]]>]]>")) = '\0';
@ -596,13 +609,15 @@ netconf_input_cb(int s,
/* No data to read, save data and continue on next round */
if (cbuf_len(cb) != 0){
if (clicon_hash_add(cdat, NETCONF_HASH_BUF, &cb, sizeof(cb)) == NULL)
return -1;
goto done;
cb = NULL;
}
break;
}
} /* while */
ok:
clicon_option_int_set(h, NETCONF_FRAME_STATE, frame_state);
clicon_option_int_set(h, NETCONF_FRAME_SIZE, frame_size);
retval = 0;
done:
if (cb)