};
/* belongs in busybox.h */
-static inline int max(int a, int b) {
+static int max(int a, int b) {
return (a>b)?a:b;
}
vfprintf(stderr, format, args);
va_end(args);
}
+/* broken, of course, but OK for testing */
+static char *indenter(int i)
+{
+ static char blanks[]=" ";
+ return &blanks[sizeof(blanks)-i-1];
+}
#else
-static inline void debug_printf(const char *format ATTRIBUTE_UNUSED, ...) { }
+#define debug_printf(...) do {;} while(0);
#endif
#define final_printf debug_printf
static void __syntax(char *file, int line) {
bb_error_msg("syntax error %s:%d", file, line);
}
-#define syntax() __syntax(__FILE__, __LINE__)
+// NB: was __FILE__, but that produces full path sometimess, so...
+#define syntax() __syntax("hush.c", __LINE__)
/* Index of subroutines: */
/* function prototypes for builtins */
static void mark_closed(int fd);
static void close_all(void);
/* "run" the final data structures: */
-static char *indenter(int i);
static int free_pipe_list(struct pipe *head, int indent);
static int free_pipe(struct pipe *pi, int indent);
/* really run the final data structures: */
/* Table of built-in functions. They can be forked or not, depending on
* context: within pipes, they fork. As simple commands, they do not.
* When used in non-forking context, they can change global variables
- * in the parent shell process. If forked, of course they can not.
+ * in the parent shell process. If forked, of course they cannot.
* For example, 'unset foo | whatever' will parse and run, but foo will
* still be set at the end. */
static const struct built_in_command bltins[] = {
char *name = child->argv[1];
if (name == NULL) {
- return (builtin_env(child));
+ return builtin_env(child);
}
name = strdup(name);
/* XXX search through $PATH is missing */
input = fopen(child->argv[1], "r");
if (!input) {
- bb_error_msg("Couldn't open file '%s'", child->argv[1]);
+ bb_error_msg("cannot open '%s'", child->argv[1]);
return EXIT_FAILURE;
}
status = parse_file_outer(input);
mark_closed(fileno(input));
fclose(input);
- return (status);
+ return status;
}
static int builtin_umask(struct child_prog *child)
return *i->p;
}
-static inline void cmdedit_set_initial_prompt(void)
+static void cmdedit_set_initial_prompt(void)
{
#ifndef CONFIG_FEATURE_SH_FANCY_PROMPT
PS1 = NULL;
#endif
}
-static inline void setup_prompt_string(int promptmode, char **prompt_str)
+static void setup_prompt_string(int promptmode, char **prompt_str)
{
debug_printf("setup_prompt_string %d ",promptmode);
#ifndef CONFIG_FEATURE_SH_FANCY_PROMPT
#endif
debug_printf("exec of %s\n",child->argv[0]);
execvp(child->argv[0],child->argv);
- bb_perror_msg("couldn't exec: %s",child->argv[0]);
+ bb_perror_msg("cannot exec: %s",child->argv[0]);
_exit(1);
} else if (child->group) {
debug_printf("runtime nesting to group\n");
if (i==fg_pipe->num_progs-1)
rcode=WEXITSTATUS(status);
(fg_pipe->num_progs)--;
- return(rcode);
+ return rcode;
}
}
}
int i;
int nextin, nextout;
int pipefds[2]; /* pipefds[0] is for reading */
- struct child_prog *child = NULL;
+ struct child_prog *child;
const struct built_in_command *x;
char *p;
* Builtins within pipes have to fork anyway, and are handled in
* pseudo_exec. "echo foo | read bar" doesn't work on bash, either.
*/
- if (pi->num_progs == 1) child = & (pi->progs[0]);
+ child = & (pi->progs[0]);
if (pi->num_progs == 1 && child->group && child->subshell == 0) {
int squirrel[] = {-1, -1, -1};
int rcode;
* variable. */
int export_me=0;
char *name, *value;
- name = bb_xstrdup(child->argv[i]);
+ name = xstrdup(child->argv[i]);
debug_printf("Local environment set: %s\n", name);
value = strchr(name, '=');
if (value)
return rcode;
}
-/* broken, of course, but OK for testing */
-static char *indenter(int i)
-{
- static char blanks[]=" ";
- return &blanks[sizeof(blanks)-i-1];
-}
-
/* return code is the exit status of the pipe */
static int free_pipe(struct pipe *pi, int indent)
{
struct child_prog *child;
struct redir_struct *r, *rnext;
int a, i, ret_code=0;
- char *ind = indenter(indent);
if (pi->stopped_progs > 0)
return ret_code;
- final_printf("%s run pipe: (pid %d)\n",ind,getpid());
+ final_printf("%s run pipe: (pid %d)\n",indenter(indent),getpid());
for (i=0; i<pi->num_progs; i++) {
child = &pi->progs[i];
- final_printf("%s command %d:\n",ind,i);
+ final_printf("%s command %d:\n",indenter(indent),i);
if (child->argv) {
for (a=0,p=child->argv; *p; a++,p++) {
- final_printf("%s argv[%d] = %s\n",ind,a,*p);
+ final_printf("%s argv[%d] = %s\n",indenter(indent),a,*p);
}
globfree(&child->glob_result);
child->argv=NULL;
} else if (child->group) {
- final_printf("%s begin group (subshell:%d)\n",ind, child->subshell);
+ final_printf("%s begin group (subshell:%d)\n",indenter(indent), child->subshell);
ret_code = free_pipe_list(child->group,indent+3);
- final_printf("%s end group\n",ind);
+ final_printf("%s end group\n",indenter(indent));
} else {
- final_printf("%s (nil)\n",ind);
+ final_printf("%s (nil)\n",indenter(indent));
}
for (r=child->redirects; r; r=rnext) {
- final_printf("%s redirect %d%s", ind, r->fd, redir_table[r->type].descrip);
+ final_printf("%s redirect %d%s", indenter(indent), r->fd, redir_table[r->type].descrip);
if (r->dup == -1) {
/* guard against the case >$FOO, where foo is unset or blank */
if (r->word.gl_pathv) {
{
int rcode=0; /* if list has no members */
struct pipe *pi, *next;
- char *ind = indenter(indent);
for (pi=head; pi; pi=next) {
- final_printf("%s pipe reserved mode %d\n", ind, pi->r_mode);
+ final_printf("%s pipe reserved mode %d\n", indenter(indent), pi->r_mode);
rcode = free_pipe(pi, indent);
- final_printf("%s pipe followup code %d\n", ind, pi->followup);
+ final_printf("%s pipe followup code %d\n", indenter(indent), pi->followup);
next=pi->next;
pi->next=NULL;
free(pi);
return 1; /* syntax error, groups and arglists don't mix */
}
initialize_context(&sub);
- switch(ch) {
+ switch (ch) {
case '(': endch=')'; child->subshell=1; break;
case '{': endch='}'; break;
default: syntax(); /* really logic error */
/* Initialize some more globals to non-zero values */
set_cwd();
-#ifdef CONFIG_FEATURE_COMMAND_EDITING
- cmdedit_set_initial_prompt();
-#else
- PS1 = NULL;
-#endif
+ if (ENABLE_FEATURE_COMMAND_EDITING) cmdedit_set_initial_prompt();
+ else PS1 = NULL;
PS2 = "> ";
/* initialize our shell local variables with the values
debug_printf("\nrunning script '%s'\n", argv[optind]);
global_argv = argv+optind;
global_argc = argc-optind;
- input = bb_xfopen(argv[optind], "r");
+ input = xfopen(argv[optind], "r");
opt = parse_file_outer(input);
#ifdef CONFIG_FEATURE_CLEAN_UP
#endif
final_return:
- return(opt?opt:last_return_code);
+ return opt ? opt : last_return_code;
}
static char *insert_var_value(char *inp)