diff options
Diffstat (limited to 'common')
| -rw-r--r-- | common/command.c | 41 | ||||
| -rw-r--r-- | common/hush.c | 52 | ||||
| -rw-r--r-- | common/main.c | 37 | 
3 files changed, 53 insertions, 77 deletions
| diff --git a/common/command.c b/common/command.c index fe290759c..aa0fb0a3d 100644 --- a/common/command.c +++ b/common/command.c @@ -499,7 +499,7 @@ void fixup_cmdtable(cmd_tbl_t *cmdtp, int size)   * @param argv		Arguments   * @return 0 if command succeeded, else non-zero (CMD_RET_...)   */ -int cmd_call(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +static int cmd_call(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  {  	int result; @@ -508,3 +508,42 @@ int cmd_call(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  		debug("Command failed, result=%d", result);  	return result;  } + +enum command_ret_t cmd_process(int flag, int argc, char * const argv[], +			       int *repeatable) +{ +	enum command_ret_t rc = CMD_RET_SUCCESS; +	cmd_tbl_t *cmdtp; + +	/* Look up command in command table */ +	cmdtp = find_cmd(argv[0]); +	if (cmdtp == NULL) { +		printf("Unknown command '%s' - try 'help'\n", argv[0]); +		return 1; +	} + +	/* found - check max args */ +	if (argc > cmdtp->maxargs) +		rc = CMD_RET_USAGE; + +#if defined(CONFIG_CMD_BOOTD) +	/* avoid "bootd" recursion */ +	else if (cmdtp->cmd == do_bootd) { +		if (flag & CMD_FLAG_BOOTD) { +			puts("'bootd' recursion detected\n"); +			rc = CMD_RET_FAILURE; +		} else { +			flag |= CMD_FLAG_BOOTD; +		} +	} +#endif + +	/* If OK so far, then do the command */ +	if (!rc) { +		rc = cmd_call(cmdtp, flag, argc, argv); +		*repeatable &= cmdtp->repeatable; +	} +	if (rc == CMD_RET_USAGE) +		rc = cmd_usage(cmdtp); +	return rc; +} diff --git a/common/hush.c b/common/hush.c index 3aa9d5011..672ab9e15 100644 --- a/common/hush.c +++ b/common/hush.c @@ -1538,7 +1538,6 @@ static int run_pipe_real(struct pipe *pi)  	int nextin;  	int flag = do_repeat ? CMD_FLAG_REPEAT : 0;  	struct child_prog *child; -	cmd_tbl_t *cmdtp;  	char *p;  # if __GNUC__  	/* Avoid longjmp clobbering */ @@ -1652,47 +1651,20 @@ static int run_pipe_real(struct pipe *pi)  			return rcode;  		}  #else -			/* check ";", because ,example , argv consist from -			 * "help;flinfo" must not execute -			 */ -			if (strchr(child->argv[i], ';')) { -				printf ("Unknown command '%s' - try 'help' or use 'run' command\n", -					child->argv[i]); -				return -1; -			} -			/* Look up command in command table */ - - -			if ((cmdtp = find_cmd(child->argv[i])) == NULL) { -				printf ("Unknown command '%s' - try 'help'\n", child->argv[i]); -				return -1;	/* give up after bad command */ -			} else { -				int rcode; -#if defined(CONFIG_CMD_BOOTD) -				/* avoid "bootd" recursion */ -				if (cmdtp->cmd == do_bootd) { -					if (flag & CMD_FLAG_BOOTD) { -						printf ("'bootd' recursion detected\n"); -						return -1; -					} -				else -					flag |= CMD_FLAG_BOOTD; -				} -#endif -				/* found - check max args */ -				if ((child->argc - i) > cmdtp->maxargs) -					return cmd_usage(cmdtp); -#endif -				/* OK - call function to do the command */ -				rcode = cmd_call(cmdtp, flag,  child->argc, -						 child->argv); -				if (!cmdtp->repeatable) -					flag_repeat = 0; -				return rcode; -			} +		/* check ";", because ,example , argv consist from +		 * "help;flinfo" must not execute +		 */ +		if (strchr(child->argv[i], ';')) { +			printf("Unknown command '%s' - try 'help' or use " +					"'run' command\n", child->argv[i]); +			return -1;  		} -#ifndef __U_BOOT__ +		/* Process the command */ +		return cmd_process(flag, child->argc, child->argv, +				   &flag_repeat); +#endif  	} +#ifndef __U_BOOT__  	for (i = 0; i < pi->num_progs; i++) {  		child = & (pi->progs[i]); diff --git a/common/main.c b/common/main.c index 6a3eac28a..4adc17a9f 100644 --- a/common/main.c +++ b/common/main.c @@ -1261,7 +1261,6 @@ static void process_macros (const char *input, char *output)   */  static int builtin_run_command(const char *cmd, int flag)  { -	cmd_tbl_t *cmdtp;  	char cmdbuf[CONFIG_SYS_CBSIZE];	/* working copy of cmd		*/  	char *token;			/* start of token in cmdbuf	*/  	char *sep;			/* end of token (separator) in cmdbuf */ @@ -1339,41 +1338,7 @@ static int builtin_run_command(const char *cmd, int flag)  			continue;  		} -		/* Look up command in command table */ -		if ((cmdtp = find_cmd(argv[0])) == NULL) { -			printf ("Unknown command '%s' - try 'help'\n", argv[0]); -			rc = -1;	/* give up after bad command */ -			continue; -		} - -		/* found - check max args */ -		if (argc > cmdtp->maxargs) { -			cmd_usage(cmdtp); -			rc = -1; -			continue; -		} - -#if defined(CONFIG_CMD_BOOTD) -		/* avoid "bootd" recursion */ -		if (cmdtp->cmd == do_bootd) { -#ifdef DEBUG_PARSER -			printf ("[%s]\n", finaltoken); -#endif -			if (flag & CMD_FLAG_BOOTD) { -				puts ("'bootd' recursion detected\n"); -				rc = -1; -				continue; -			} else { -				flag |= CMD_FLAG_BOOTD; -			} -		} -#endif - -		/* OK - call function to do the command */ -		if (cmd_call(cmdtp, flag, argc, argv) != 0) -			rc = -1; - -		repeatable &= cmdtp->repeatable; +		rc = cmd_process(flag, argc, argv, &repeatable);  		/* Did the user stop this? */  		if (had_ctrlc ()) |