|
@@ -1901,7 +1901,7 @@ static int run_list_real(struct pipe *pi)
|
|
|
last_return_code = -rcode - 2;
|
|
|
return -2; /* exit */
|
|
|
}
|
|
|
- last_return_code=(rcode == 0) ? 0 : 1;
|
|
|
+ last_return_code = rcode;
|
|
|
#endif
|
|
|
#ifndef __U_BOOT__
|
|
|
pi->num_progs = save_num_progs; /* restore number of programs */
|
|
@@ -3211,7 +3211,15 @@ static int parse_stream_outer(struct in_str *inp, int flag)
|
|
|
printf("exit not allowed from main input shell.\n");
|
|
|
continue;
|
|
|
}
|
|
|
- break;
|
|
|
+ /*
|
|
|
+ * DANGER
|
|
|
+ * Return code -2 is special in this context,
|
|
|
+ * it indicates exit from inner pipe instead
|
|
|
+ * of return code itself, the return code is
|
|
|
+ * stored in 'last_return_code' variable!
|
|
|
+ * DANGER
|
|
|
+ */
|
|
|
+ return -2;
|
|
|
}
|
|
|
if (code == -1)
|
|
|
flag_repeat = 0;
|
|
@@ -3248,9 +3256,9 @@ int parse_string_outer(const char *s, int flag)
|
|
|
#endif /* __U_BOOT__ */
|
|
|
{
|
|
|
struct in_str input;
|
|
|
+ int rcode;
|
|
|
#ifdef __U_BOOT__
|
|
|
char *p = NULL;
|
|
|
- int rcode;
|
|
|
if (!s)
|
|
|
return 1;
|
|
|
if (!*s)
|
|
@@ -3262,11 +3270,12 @@ int parse_string_outer(const char *s, int flag)
|
|
|
setup_string_in_str(&input, p);
|
|
|
rcode = parse_stream_outer(&input, flag);
|
|
|
free(p);
|
|
|
- return rcode;
|
|
|
+ return rcode == -2 ? last_return_code : rcode;
|
|
|
} else {
|
|
|
#endif
|
|
|
setup_string_in_str(&input, s);
|
|
|
- return parse_stream_outer(&input, flag);
|
|
|
+ rcode = parse_stream_outer(&input, flag);
|
|
|
+ return rcode == -2 ? last_return_code : rcode;
|
|
|
#ifdef __U_BOOT__
|
|
|
}
|
|
|
#endif
|
|
@@ -3286,7 +3295,7 @@ int parse_file_outer(void)
|
|
|
setup_file_in_str(&input);
|
|
|
#endif
|
|
|
rcode = parse_stream_outer(&input, FLAG_PARSE_SEMICOLON);
|
|
|
- return rcode;
|
|
|
+ return rcode == -2 ? last_return_code : rcode;
|
|
|
}
|
|
|
|
|
|
#ifdef __U_BOOT__
|