projects
/
oweals
/
busybox.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Vodz, last_patch_114
[oweals/busybox.git]
/
shell
/
lash.c
diff --git
a/shell/lash.c
b/shell/lash.c
index 5c4e97f4aa47c083a81db4433514b44a6290b955..1fcd63bdf5f731d6af2c55257a049a07913daa59 100644
(file)
--- a/
shell/lash.c
+++ b/
shell/lash.c
@@
-2,8
+2,7
@@
/*
* lash -- the BusyBox Lame-Ass SHell
*
/*
* lash -- the BusyBox Lame-Ass SHell
*
- * Copyright (C) 1999,2000 by Lineo, inc. and Erik Andersen
- * Copyright (C) 1999,2000,2001 by Erik Andersen <andersee@debian.org>
+ * Copyright (C) 1999-2003 by Erik Andersen <andersen@codepoet.org>
*
* Based in part on ladsh.c by Michael K. Johnson and Erik W. Troan, which is
* under the following liberal license: "We have placed this source code in the
*
* Based in part on ladsh.c by Michael K. Johnson and Erik W. Troan, which is
* under the following liberal license: "We have placed this source code in the
@@
-246,7
+245,7
@@
static int builtin_cd(struct child_prog *child)
}
cwd = xgetcwd((char *)cwd);
if (!cwd)
}
cwd = xgetcwd((char *)cwd);
if (!cwd)
- cwd = unknown;
+ cwd =
bb_msg_
unknown;
return EXIT_SUCCESS;
}
return EXIT_SUCCESS;
}
@@
-284,12
+283,12
@@
static int builtin_fg_bg(struct child_prog *child)
}
}
if (!job) {
}
}
if (!job) {
- error_msg("%s: no current job", child->argv[0]);
+
bb_
error_msg("%s: no current job", child->argv[0]);
return EXIT_FAILURE;
}
} else {
if (sscanf(child->argv[1], "%%%d", &jobnum) != 1) {
return EXIT_FAILURE;
}
} else {
if (sscanf(child->argv[1], "%%%d", &jobnum) != 1) {
- error_msg("%s: bad argument '%s'", child->argv[0], child->argv[1]);
+
bb_
error_msg("%s: bad argument '%s'", child->argv[0], child->argv[1]);
return EXIT_FAILURE;
}
for (job = child->family->job_list->head; job; job = job->next) {
return EXIT_FAILURE;
}
for (job = child->family->job_list->head; job; job = job->next) {
@@
-298,7
+297,7
@@
static int builtin_fg_bg(struct child_prog *child)
}
}
if (!job) {
}
}
if (!job) {
- error_msg("%s: %d: no such job", child->argv[0], jobnum);
+
bb_
error_msg("%s: %d: no such job", child->argv[0], jobnum);
return EXIT_FAILURE;
}
}
return EXIT_FAILURE;
}
}
@@
-320,7
+319,7
@@
static int builtin_fg_bg(struct child_prog *child)
if (i == ESRCH) {
remove_job(&job_list, job);
} else {
if (i == ESRCH) {
remove_job(&job_list, job);
} else {
- perror_msg("kill (SIGCONT)");
+
bb_
perror_msg("kill (SIGCONT)");
}
}
}
}
@@
-371,7
+370,7
@@
static int builtin_pwd(struct child_prog *dummy)
{
cwd = xgetcwd((char *)cwd);
if (!cwd)
{
cwd = xgetcwd((char *)cwd);
if (!cwd)
- cwd = unknown;
+ cwd =
bb_msg_
unknown;
puts(cwd);
return EXIT_SUCCESS;
}
puts(cwd);
return EXIT_SUCCESS;
}
@@
-489,7
+488,7
@@
static void mark_closed(int fd)
{
struct close_me *tmp;
if (close_me_head == NULL || close_me_head->fd != fd)
{
struct close_me *tmp;
if (close_me_head == NULL || close_me_head->fd != fd)
- error_msg_and_die("corrupt close_me");
+
bb_
error_msg_and_die("corrupt close_me");
tmp = close_me_head;
close_me_head = close_me_head->next;
free(tmp);
tmp = close_me_head;
close_me_head = close_me_head->next;
free(tmp);
@@
-518,12
+517,9
@@
static void free_job(struct job *cmd)
if (cmd->progs[i].redirects)
free(cmd->progs[i].redirects);
}
if (cmd->progs[i].redirects)
free(cmd->progs[i].redirects);
}
- if (cmd->progs)
- free(cmd->progs);
- if (cmd->text)
- free(cmd->text);
- if (cmd->cmdbuf)
- free(cmd->cmdbuf);
+ free(cmd->progs);
+ free(cmd->text);
+ free(cmd->cmdbuf);
keep = cmd->job_list;
memset(cmd, 0, sizeof(struct job));
cmd->job_list = keep;
keep = cmd->job_list;
memset(cmd, 0, sizeof(struct job));
cmd->job_list = keep;
@@
-602,7
+598,7
@@
static void checkjobs(struct jobset *j_list)
}
if (childpid == -1 && errno != ECHILD)
}
if (childpid == -1 && errno != ECHILD)
- perror_msg("waitpid");
+
bb_
perror_msg("waitpid");
}
/* squirrel != NULL means we squirrel away copies of stdin, stdout,
}
/* squirrel != NULL means we squirrel away copies of stdin, stdout,
@@
-631,7
+627,7
@@
static int setup_redirects(struct child_prog *prog, int squirrel[])
if (openfd < 0) {
/* this could get lost if stderr has been redirected, but
bash and ash both lose it as well (though zsh doesn't!) */
if (openfd < 0) {
/* this could get lost if stderr has been redirected, but
bash and ash both lose it as well (though zsh doesn't!) */
- perror_msg("error opening %s", redir->filename);
+
bb_
perror_msg("error opening %s", redir->filename);
return 1;
}
return 1;
}
@@
-677,8
+673,7
@@
static inline void setup_prompt_string(char **prompt_str)
#ifndef CONFIG_FEATURE_SH_FANCY_PROMPT
/* Set up the prompt */
if (shell_context == 0) {
#ifndef CONFIG_FEATURE_SH_FANCY_PROMPT
/* Set up the prompt */
if (shell_context == 0) {
- if (PS1)
- free(PS1);
+ free(PS1);
PS1=xmalloc(strlen(cwd)+4);
sprintf(PS1, "%s %s", cwd, ( geteuid() != 0 ) ? "$ ":"# ");
*prompt_str = PS1;
PS1=xmalloc(strlen(cwd)+4);
sprintf(PS1, "%s %s", cwd, ( geteuid() != 0 ) ? "$ ":"# ");
*prompt_str = PS1;
@@
-807,7
+802,7
@@
static int expand_arguments(char *command)
while( command && command[ix]) {
if (command[ix] == '\\') {
const char *tmp = command+ix+1;
while( command && command[ix]) {
if (command[ix] == '\\') {
const char *tmp = command+ix+1;
- command[ix] = process_escape_sequence( &tmp );
+ command[ix] =
bb_
process_escape_sequence( &tmp );
memmove(command+ix + 1, tmp, strlen(tmp)+1);
}
ix++;
memmove(command+ix + 1, tmp, strlen(tmp)+1);
}
ix++;
@@
-820,7
+815,7
@@
static int expand_arguments(char *command)
/* We need a clean copy, so strsep can mess up the copy while
* we write stuff into the original (in a minute) */
/* We need a clean copy, so strsep can mess up the copy while
* we write stuff into the original (in a minute) */
- cmd = cmd_copy = xstrdup(command);
+ cmd = cmd_copy =
bb_
xstrdup(command);
*command = '\0';
for (ix = 0, tmpcmd = cmd;
(tmpcmd = strsep_space(cmd, &ix)) != NULL; cmd += ix, ix=0) {
*command = '\0';
for (ix = 0, tmpcmd = cmd;
(tmpcmd = strsep_space(cmd, &ix)) != NULL; cmd += ix, ix=0) {
@@
-833,13
+828,13
@@
static int expand_arguments(char *command)
if (retval == GLOB_NOSPACE) {
/* Mem may have been allocated... */
globfree (&expand_result);
if (retval == GLOB_NOSPACE) {
/* Mem may have been allocated... */
globfree (&expand_result);
- error_msg(out_of_space);
+
bb_
error_msg(out_of_space);
return FALSE;
} else if (retval != 0) {
/* Some other error. GLOB_NOMATCH shouldn't
* happen because of the GLOB_NOCHECK flag in
* the glob call. */
return FALSE;
} else if (retval != 0) {
/* Some other error. GLOB_NOMATCH shouldn't
* happen because of the GLOB_NOCHECK flag in
* the glob call. */
- error_msg("syntax error");
+
bb_
error_msg("syntax error");
return FALSE;
} else {
/* Convert from char** (one word per string) to a simple char*,
return FALSE;
} else {
/* Convert from char** (one word per string) to a simple char*,
@@
-847,7
+842,7
@@
static int expand_arguments(char *command)
for (i=0; i < expand_result.gl_pathc; i++) {
length=strlen(expand_result.gl_pathv[i]);
if (total_length+length+1 >= BUFSIZ) {
for (i=0; i < expand_result.gl_pathc; i++) {
length=strlen(expand_result.gl_pathv[i]);
if (total_length+length+1 >= BUFSIZ) {
- error_msg(out_of_space);
+
bb_
error_msg(out_of_space);
return FALSE;
}
strcat(command+total_length, " ");
return FALSE;
}
strcat(command+total_length, " ");
@@
-890,7
+885,7
@@
static int expand_arguments(char *command)
case '0':case '1':case '2':case '3':case '4':
case '5':case '6':case '7':case '8':case '9':
{
case '0':case '1':case '2':case '3':case '4':
case '5':case '6':case '7':case '8':case '9':
{
- int ixx=*(dst
+ 1)-48
;
+ int ixx=*(dst
+1)-48+1
;
if (ixx >= argc) {
var='\0';
} else {
if (ixx >= argc) {
var='\0';
} else {
@@
-934,7
+929,7
@@
static int expand_arguments(char *command)
int subst_len = strlen(var);
int trail_len = strlen(src);
if (dst+subst_len+trail_len >= command+BUFSIZ) {
int subst_len = strlen(var);
int trail_len = strlen(src);
if (dst+subst_len+trail_len >= command+BUFSIZ) {
- error_msg(out_of_space);
+
bb_
error_msg(out_of_space);
return FALSE;
}
/* Move stuff to the end of the string to accommodate
return FALSE;
}
/* Move stuff to the end of the string to accommodate
@@
-1010,7
+1005,7
@@
static int parse_command(char **command_ptr, struct job *job, int *inbg)
if (*src == '\\') {
src++;
if (!*src) {
if (*src == '\\') {
src++;
if (!*src) {
- error_msg("character expected after \\");
+
bb_
error_msg("character expected after \\");
free_job(job);
return 1;
}
free_job(job);
return 1;
}
@@
-1094,7
+1089,7
@@
static int parse_command(char **command_ptr, struct job *job, int *inbg)
chptr++;
if (!*chptr) {
chptr++;
if (!*chptr) {
- error_msg("file name expected after %c", *(src-1));
+
bb_
error_msg("file name expected after %c", *(src-1));
free_job(job);
job->num_progs=0;
return 1;
free_job(job);
job->num_progs=0;
return 1;
@@
-1113,7
+1108,7
@@
static int parse_command(char **command_ptr, struct job *job, int *inbg)
if (*prog->argv[argc_l] || saw_quote)
argc_l++;
if (!argc_l) {
if (*prog->argv[argc_l] || saw_quote)
argc_l++;
if (!argc_l) {
- error_msg("empty command in pipe");
+
bb_
error_msg("empty command in pipe");
free_job(job);
job->num_progs=0;
return 1;
free_job(job);
job->num_progs=0;
return 1;
@@
-1140,7
+1135,7
@@
static int parse_command(char **command_ptr, struct job *job, int *inbg)
src++;
if (!*src) {
src++;
if (!*src) {
- error_msg("empty command in pipe");
+
bb_
error_msg("empty command in pipe");
free_job(job);
job->num_progs=0;
return 1;
free_job(job);
job->num_progs=0;
return 1;
@@
-1159,7
+1154,7
@@
static int parse_command(char **command_ptr, struct job *job, int *inbg)
case '\\':
src++;
if (!*src) {
case '\\':
src++;
if (!*src) {
- error_msg("character expected after \\");
+
bb_
error_msg("character expected after \\");
free_job(job);
return 1;
}
free_job(job);
return 1;
}
@@
-1221,7
+1216,7
@@
static int pseudo_exec(struct child_prog *child)
/* Check if the command matches any of the forking builtins. */
for (x = bltins_forking; x->cmd; x++) {
if (strcmp(child->argv[0], x->cmd) == 0) {
/* Check if the command matches any of the forking builtins. */
for (x = bltins_forking; x->cmd; x++) {
if (strcmp(child->argv[0], x->cmd) == 0) {
- applet_name=x->cmd;
+
bb_
applet_name=x->cmd;
_exit (x->function(child));
}
}
_exit (x->function(child));
}
}
@@
-1229,7
+1224,7
@@
static int pseudo_exec(struct child_prog *child)
/* Check if the command matches any busybox internal
* commands ("applets") here. Following discussions from
* November 2000 on busybox@busybox.net, don't use
/* Check if the command matches any busybox internal
* commands ("applets") here. Following discussions from
* November 2000 on busybox@busybox.net, don't use
- * get_last_path_component(). This way explicit (with
+ *
bb_
get_last_path_component(). This way explicit (with
* slashes) filenames will never be interpreted as an
* applet, just like with builtins. This way the user can
* override an applet with an explicit filename reference.
* slashes) filenames will never be interpreted as an
* applet, just like with builtins. This way the user can
* override an applet with an explicit filename reference.
@@
-1245,7
+1240,7
@@
static int pseudo_exec(struct child_prog *child)
* /bin/cat exists on the filesystem and is _not_ busybox.
* Some systems want this, others do not. Choose wisely. :-)
*/
* /bin/cat exists on the filesystem and is _not_ busybox.
* Some systems want this, others do not. Choose wisely. :-)
*/
- name = get_last_path_component(name);
+ name =
bb_
get_last_path_component(name);
#endif
{
#endif
{
@@
-1259,9
+1254,9
@@
static int pseudo_exec(struct child_prog *child)
execvp(child->argv[0], child->argv);
execvp(child->argv[0], child->argv);
- /* Do not use perror_msg_and_die() here, since we must not
+ /* Do not use
bb_
perror_msg_and_die() here, since we must not
* call exit() but should call _exit() instead */
* call exit() but should call _exit() instead */
- fprintf(stderr, "%s: %
s\n", child->argv[0], strerror(err)
);
+ fprintf(stderr, "%s: %
m\n", child->argv[0]
);
_exit(EXIT_FAILURE);
}
_exit(EXIT_FAILURE);
}
@@
-1303,7
+1298,7
@@
static void insert_job(struct job *newjob, int inbg)
/* move the new process group into the foreground */
/* suppress messages when run from /linuxrc mag@sysgo.de */
if (tcsetpgrp(shell_terminal, newjob->pgrp) && errno != ENOTTY)
/* move the new process group into the foreground */
/* suppress messages when run from /linuxrc mag@sysgo.de */
if (tcsetpgrp(shell_terminal, newjob->pgrp) && errno != ENOTTY)
- perror_msg("tcsetpgrp");
+
bb_
perror_msg("tcsetpgrp");
}
}
}
}
@@
-1321,7
+1316,7
@@
static int run_command(struct job *newjob, int inbg, int outpipe[2])
child = & (newjob->progs[i]);
if ((i + 1) < newjob->num_progs) {
child = & (newjob->progs[i]);
if ((i + 1) < newjob->num_progs) {
- if (pipe(pipefds)<0) perror_msg_and_die("pipe");
+ if (pipe(pipefds)<0)
bb_
perror_msg_and_die("pipe");
nextout = pipefds[1];
} else {
if (outpipe[1]!=-1) {
nextout = pipefds[1];
} else {
if (outpipe[1]!=-1) {
@@
-1468,7
+1463,7
@@
static int busy_loop(FILE * input)
if (waitpid(job_list.fg->progs[i].pid, &status, WUNTRACED)<0) {
if (errno != ECHILD) {
if (waitpid(job_list.fg->progs[i].pid, &status, WUNTRACED)<0) {
if (errno != ECHILD) {
- perror_msg_and_die("waitpid(%d)",job_list.fg->progs[i].pid);
+
bb_
perror_msg_and_die("waitpid(%d)",job_list.fg->progs[i].pid);
}
}
}
}
@@
-1500,7
+1495,7
@@
static int busy_loop(FILE * input)
/* move the shell to the foreground */
/* suppress messages when run from /linuxrc mag@sysgo.de */
if (tcsetpgrp(shell_terminal, getpgrp()) && errno != ENOTTY)
/* move the shell to the foreground */
/* suppress messages when run from /linuxrc mag@sysgo.de */
if (tcsetpgrp(shell_terminal, getpgrp()) && errno != ENOTTY)
- perror_msg("tcsetpgrp");
+
bb_
perror_msg("tcsetpgrp");
}
}
}
}
}
}
@@
-1508,7
+1503,7
@@
static int busy_loop(FILE * input)
/* return controlling TTY back to parent process group before exiting */
if (tcsetpgrp(shell_terminal, parent_pgrp) && errno != ENOTTY)
/* return controlling TTY back to parent process group before exiting */
if (tcsetpgrp(shell_terminal, parent_pgrp) && errno != ENOTTY)
- perror_msg("tcsetpgrp");
+
bb_
perror_msg("tcsetpgrp");
/* return exit status if called with "-c" */
if (input == NULL && WIFEXITED(status))
/* return exit status if called with "-c" */
if (input == NULL && WIFEXITED(status))
@@
-1521,7
+1516,7
@@
static int busy_loop(FILE * input)
#ifdef CONFIG_FEATURE_CLEAN_UP
void free_memory(void)
{
#ifdef CONFIG_FEATURE_CLEAN_UP
void free_memory(void)
{
- if (cwd && cwd!=unknown) {
+ if (cwd && cwd!=
bb_msg_
unknown) {
free((char*)cwd);
}
if (local_pending_command)
free((char*)cwd);
}
if (local_pending_command)
@@
-1536,7
+1531,7
@@
void free_memory(void)
/* Make sure we have a controlling tty. If we get started under a job
* aware app (like bash for example), make sure we are now in charge so
* we don't fight over who gets the foreground */
/* Make sure we have a controlling tty. If we get started under a job
* aware app (like bash for example), make sure we are now in charge so
* we don't fight over who gets the foreground */
-static void setup_job_control()
+static void setup_job_control(
void
)
{
int status;
{
int status;
@@
-1598,8
+1593,8
@@
int lash_main(int argc_l, char **argv_l)
case 'c':
input = NULL;
if (local_pending_command != 0)
case 'c':
input = NULL;
if (local_pending_command != 0)
- error_msg_and_die("multiple -c arguments");
- local_pending_command = xstrdup(argv[optind]);
+
bb_
error_msg_and_die("multiple -c arguments");
+ local_pending_command =
bb_
xstrdup(argv[optind]);
optind++;
argv = argv+optind;
break;
optind++;
argv = argv+optind;
break;
@@
-1607,7
+1602,7
@@
int lash_main(int argc_l, char **argv_l)
interactive = TRUE;
break;
default:
interactive = TRUE;
break;
default:
- show_usage();
+
bb_
show_usage();
}
}
/* A shell is interactive if the `-i' flag was given, or if all of
}
}
/* A shell is interactive if the `-i' flag was given, or if all of
@@
-1631,14
+1626,14
@@
int lash_main(int argc_l, char **argv_l)
#endif
} else if (local_pending_command==NULL) {
//printf( "optind=%d argv[optind]='%s'\n", optind, argv[optind]);
#endif
} else if (local_pending_command==NULL) {
//printf( "optind=%d argv[optind]='%s'\n", optind, argv[optind]);
- input = xfopen(argv[optind], "r");
+ input =
bb_
xfopen(argv[optind], "r");
mark_open(fileno(input)); /* be lazy, never mark this closed */
}
/* initialize the cwd -- this is never freed...*/
cwd = xgetcwd(0);
if (!cwd)
mark_open(fileno(input)); /* be lazy, never mark this closed */
}
/* initialize the cwd -- this is never freed...*/
cwd = xgetcwd(0);
if (!cwd)
- cwd = unknown;
+ cwd =
bb_msg_
unknown;
#ifdef CONFIG_FEATURE_CLEAN_UP
atexit(free_memory);
#ifdef CONFIG_FEATURE_CLEAN_UP
atexit(free_memory);