hush: add #defines to switch off break/continue if loops are not supported
*: remove a few inline keywords no code changes
This commit is contained in:
parent
e1ee48e0fd
commit
dadfb4975b
@ -263,7 +263,7 @@ static int FAST_FUNC include_conf_dir_act(const char *filename UNUSED_PARAM,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int inline include_conf_recursive(struct include_conf_t *conf, const char *filename)
|
static int include_conf_recursive(struct include_conf_t *conf, const char *filename)
|
||||||
{
|
{
|
||||||
return recursive_action(filename, ACTION_RECURSE,
|
return recursive_action(filename, ACTION_RECURSE,
|
||||||
include_conf_file_act,
|
include_conf_file_act,
|
||||||
|
@ -17,7 +17,7 @@ extern int delete_module(const char *module, unsigned int flags);
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ENABLE_FEATURE_2_6_MODULES
|
#if ENABLE_FEATURE_2_6_MODULES
|
||||||
static inline void filename2modname(char *modname, const char *afterslash)
|
static void filename2modname(char *modname, const char *afterslash)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
int kr_chk = 1;
|
int kr_chk = 1;
|
||||||
|
@ -498,7 +498,7 @@ static void get_dev_fields(char *bp, struct interface *ife, int procnetdev_vsn)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int procnetdev_version(char *buf)
|
static int procnetdev_version(char *buf)
|
||||||
{
|
{
|
||||||
if (strstr(buf, "compressed"))
|
if (strstr(buf, "compressed"))
|
||||||
return 2;
|
return 2;
|
||||||
|
@ -819,7 +819,7 @@ packet_ok(unsigned char *buf, int cc, struct sockaddr_in *from, int seq)
|
|||||||
* If the nflag has been supplied, give
|
* If the nflag has been supplied, give
|
||||||
* numeric value, otherwise try for symbolic name.
|
* numeric value, otherwise try for symbolic name.
|
||||||
*/
|
*/
|
||||||
static inline void
|
static void
|
||||||
print_inetname(struct sockaddr_in *from)
|
print_inetname(struct sockaddr_in *from)
|
||||||
{
|
{
|
||||||
const char *ina;
|
const char *ina;
|
||||||
@ -836,7 +836,7 @@ print_inetname(struct sockaddr_in *from)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static void
|
||||||
print(unsigned char *buf, int cc, struct sockaddr_in *from)
|
print(unsigned char *buf, int cc, struct sockaddr_in *from)
|
||||||
{
|
{
|
||||||
struct ip *ip;
|
struct ip *ip;
|
||||||
|
@ -152,7 +152,7 @@ static const char* get_file(proc_file *pf)
|
|||||||
return pf->file;
|
return pf->file;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline ullong read_after_slash(const char *p)
|
static ullong read_after_slash(const char *p)
|
||||||
{
|
{
|
||||||
p = strchr(p, '/');
|
p = strchr(p, '/');
|
||||||
if (!p) return 0;
|
if (!p) return 0;
|
||||||
|
17
shell/hush.c
17
shell/hush.c
@ -434,13 +434,17 @@ struct globals {
|
|||||||
struct pipe *toplevel_list;
|
struct pipe *toplevel_list;
|
||||||
smallint ctrl_z_flag;
|
smallint ctrl_z_flag;
|
||||||
#endif
|
#endif
|
||||||
|
#if ENABLE_HUSH_LOOPS
|
||||||
smallint flag_break_continue;
|
smallint flag_break_continue;
|
||||||
|
#endif
|
||||||
smallint fake_mode;
|
smallint fake_mode;
|
||||||
/* these three support $?, $#, and $1 */
|
/* these three support $?, $#, and $1 */
|
||||||
smalluint last_return_code;
|
smalluint last_return_code;
|
||||||
char **global_argv;
|
char **global_argv;
|
||||||
int global_argc;
|
int global_argc;
|
||||||
|
#if ENABLE_HUSH_LOOPS
|
||||||
unsigned depth_break_continue;
|
unsigned depth_break_continue;
|
||||||
|
#endif
|
||||||
pid_t last_bg_pid;
|
pid_t last_bg_pid;
|
||||||
const char *ifs;
|
const char *ifs;
|
||||||
const char *cwd;
|
const char *cwd;
|
||||||
@ -722,8 +726,10 @@ static int builtin_shift(char **argv);
|
|||||||
static int builtin_source(char **argv);
|
static int builtin_source(char **argv);
|
||||||
static int builtin_umask(char **argv);
|
static int builtin_umask(char **argv);
|
||||||
static int builtin_unset(char **argv);
|
static int builtin_unset(char **argv);
|
||||||
|
#if ENABLE_HUSH_LOOPS
|
||||||
static int builtin_break(char **argv);
|
static int builtin_break(char **argv);
|
||||||
static int builtin_continue(char **argv);
|
static int builtin_continue(char **argv);
|
||||||
|
#endif
|
||||||
//static int builtin_not_written(char **argv);
|
//static int builtin_not_written(char **argv);
|
||||||
|
|
||||||
/* Table of built-in functions. They can be forked or not, depending on
|
/* Table of built-in functions. They can be forked or not, depending on
|
||||||
@ -753,9 +759,13 @@ static const struct built_in_command bltins[] = {
|
|||||||
#if ENABLE_HUSH_JOB
|
#if ENABLE_HUSH_JOB
|
||||||
BLTIN("bg" , builtin_fg_bg, "Resume a job in the background"),
|
BLTIN("bg" , builtin_fg_bg, "Resume a job in the background"),
|
||||||
#endif
|
#endif
|
||||||
|
#if ENABLE_HUSH_LOOPS
|
||||||
BLTIN("break" , builtin_break, "Exit from a loop"),
|
BLTIN("break" , builtin_break, "Exit from a loop"),
|
||||||
|
#endif
|
||||||
BLTIN("cd" , builtin_cd, "Change directory"),
|
BLTIN("cd" , builtin_cd, "Change directory"),
|
||||||
|
#if ENABLE_HUSH_LOOPS
|
||||||
BLTIN("continue", builtin_continue, "Start new loop iteration"),
|
BLTIN("continue", builtin_continue, "Start new loop iteration"),
|
||||||
|
#endif
|
||||||
BLTIN("echo" , builtin_echo, "Write to stdout"),
|
BLTIN("echo" , builtin_echo, "Write to stdout"),
|
||||||
BLTIN("eval" , builtin_eval, "Construct and run shell command"),
|
BLTIN("eval" , builtin_eval, "Construct and run shell command"),
|
||||||
BLTIN("exec" , builtin_exec, "Execute command, don't return to shell"),
|
BLTIN("exec" , builtin_exec, "Execute command, don't return to shell"),
|
||||||
@ -2246,13 +2256,15 @@ static int run_list(struct pipe *pi)
|
|||||||
debug_printf_exec(": run_pipe with %d members\n", pi->num_progs);
|
debug_printf_exec(": run_pipe with %d members\n", pi->num_progs);
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
|
#if ENABLE_HUSH_LOOPS
|
||||||
flag_break_continue = 0;
|
flag_break_continue = 0;
|
||||||
|
#endif
|
||||||
rcode = r = run_pipe(pi); /* NB: rcode is a smallint */
|
rcode = r = run_pipe(pi); /* NB: rcode is a smallint */
|
||||||
if (r != -1) {
|
if (r != -1) {
|
||||||
/* we only ran a builtin: rcode is already known
|
/* we only ran a builtin: rcode is already known
|
||||||
* and we don't need to wait for anything. */
|
* and we don't need to wait for anything. */
|
||||||
|
#if ENABLE_HUSH_LOOPS
|
||||||
/* was it "break" or "continue"? */
|
/* was it "break" or "continue"? */
|
||||||
|
|
||||||
if (flag_break_continue) {
|
if (flag_break_continue) {
|
||||||
smallint fbc = flag_break_continue;
|
smallint fbc = flag_break_continue;
|
||||||
/* we might fall into outer *loop*,
|
/* we might fall into outer *loop*,
|
||||||
@ -2271,6 +2283,7 @@ static int run_list(struct pipe *pi)
|
|||||||
bb_error_msg("break/continue: only meaningful in a loop");
|
bb_error_msg("break/continue: only meaningful in a loop");
|
||||||
/* bash compat: exit code is still 0 */
|
/* bash compat: exit code is still 0 */
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
} else if (pi->followup == PIPE_BG) {
|
} else if (pi->followup == PIPE_BG) {
|
||||||
/* what does bash do with attempts to background builtins? */
|
/* what does bash do with attempts to background builtins? */
|
||||||
/* even bash 3.2 doesn't do that well with nested bg:
|
/* even bash 3.2 doesn't do that well with nested bg:
|
||||||
@ -4534,6 +4547,7 @@ static int builtin_unset(char **argv)
|
|||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if ENABLE_HUSH_LOOPS
|
||||||
static int builtin_break(char **argv)
|
static int builtin_break(char **argv)
|
||||||
{
|
{
|
||||||
flag_break_continue++; /* BC_BREAK = 1 */
|
flag_break_continue++; /* BC_BREAK = 1 */
|
||||||
@ -4554,3 +4568,4 @@ static int builtin_continue(char **argv)
|
|||||||
flag_break_continue++; /* BC_CONTINUE = 2 = 1+1 */
|
flag_break_continue++; /* BC_CONTINUE = 2 = 1+1 */
|
||||||
return builtin_break(argv);
|
return builtin_break(argv);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
2
shell/hush_test/hush-misc/builtin1.right
Normal file
2
shell/hush_test/hush-misc/builtin1.right
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
VARIABLE=export
|
||||||
|
OK:0
|
6
shell/hush_test/hush-misc/builtin1.tests
Executable file
6
shell/hush_test/hush-misc/builtin1.tests
Executable file
@ -0,0 +1,6 @@
|
|||||||
|
# builtins, unlike keywords like "while", can be constructed
|
||||||
|
# with substitutions
|
||||||
|
VARIABLE=export
|
||||||
|
$VARIABLE VARIABLE
|
||||||
|
env | grep ^VARIABLE
|
||||||
|
echo OK:$?
|
Loading…
Reference in New Issue
Block a user