@ -30,6 +30,7 @@
# include <common.h>
# include <watchdog.h>
# include <command.h>
# include <malloc.h>
# include <version.h>
# ifdef CONFIG_MODEM_SUPPORT
# include <malloc.h> /* for free() prototype */
@ -1373,6 +1374,90 @@ int run_command(const char *cmd, int flag)
# endif
}
# ifndef CONFIG_SYS_HUSH_PARSER
/**
* Execute a list of command separated by ; or \ n using the built - in parser .
*
* This function cannot take a const char * for the command , since if it
* finds newlines in the string , it replaces them with \ 0.
*
* @ param cmd String containing list of commands
* @ param flag Execution flags ( CMD_FLAG_ . . . )
* @ return 0 on success , or ! = 0 on error .
*/
static int builtin_run_command_list ( char * cmd , int flag )
{
char * line , * next ;
int rcode = 0 ;
/*
* Break into individual lines , and execute each line ; terminate on
* error .
*/
line = next = cmd ;
while ( * next ) {
if ( * next = = ' \n ' ) {
* next = ' \0 ' ;
/* run only non-empty commands */
if ( * line ) {
debug ( " ** exec: \" %s \" \n " , line ) ;
if ( builtin_run_command ( line , 0 ) < 0 ) {
rcode = 1 ;
break ;
}
}
line = next + 1 ;
}
+ + next ;
}
if ( rcode = = 0 & & * line )
rcode = ( builtin_run_command ( line , 0 ) > = 0 ) ;
return rcode ;
}
# endif
int run_command_list ( const char * cmd , int len , int flag )
{
int need_buff = 1 ;
char * buff = ( char * ) cmd ; /* cast away const */
int rcode = 0 ;
if ( len = = - 1 ) {
len = strlen ( cmd ) ;
# ifdef CONFIG_SYS_HUSH_PARSER
/* hush will never change our string */
need_buff = 0 ;
# else
/* the built-in parser will change our string if it sees \n */
need_buff = strchr ( cmd , ' \n ' ) ! = NULL ;
# endif
}
if ( need_buff ) {
buff = malloc ( len + 1 ) ;
if ( ! buff )
return 1 ;
memcpy ( buff , cmd , len ) ;
buff [ len ] = ' \0 ' ;
}
# ifdef CONFIG_SYS_HUSH_PARSER
rcode = parse_string_outer ( buff , FLAG_PARSE_SEMICOLON ) ;
# else
/*
* This function will overwrite any \ n it sees with a \ 0 , which
* is why it can ' t work with a const char * . Here we are making
* using of internal knowledge of this function , to avoid always
* doing a malloc ( ) which is actually required only in a case that
* is pretty rare .
*/
rcode = builtin_run_command_list ( buff , flag ) ;
if ( need_buff )
free ( buff ) ;
# endif
return rcode ;
}
/****************************************************************************/
# if defined(CONFIG_CMD_RUN)