#include <sys/wait.h>
#include <unistd.h>
#include <getopt.h>
+#include "busybox.h"
+#include "cmdedit.h"
#ifdef BB_LOCALE_SUPPORT
#include <locale.h>
#include <glob.h>
#define expand_t glob_t
#endif
-#include "busybox.h"
-#include "cmdedit.h"
static const int MAX_READ = 128; /* size of input buffer for `read' builtin */
/* Globals that are static to this file */
-static char *cwd;
+static const char *cwd;
static char *local_pending_command = NULL;
static struct jobset job_list = { NULL, NULL };
static int argc;
printf("cd: %s: %m\n", newdir);
return EXIT_FAILURE;
}
- cwd = xgetcwd(cwd);
-
+ cwd = xgetcwd((char *)cwd);
+ if (!cwd)
+ cwd = unknown;
return EXIT_SUCCESS;
}
/* built-in 'pwd' handler */
static int builtin_pwd(struct child_prog *dummy)
{
- printf( "%s\n", cwd);
+ cwd = xgetcwd((char *)cwd);
+ if (!cwd)
+ cwd = unknown;
+ puts(cwd);
return EXIT_SUCCESS;
}
if (v == NULL) {
char **e;
for (e = environ; *e; e++) {
- printf( "%s\n", *e);
+ puts(*e);
}
return 0;
}
res = putenv(v);
if (res)
fprintf(stderr, "export: %m\n");
-#ifndef BB_FEATURE_SH_SIMPLE_PROMPT
+#ifdef BB_FEATURE_SH_FANCY_PROMPT
if (strncmp(v, "PS1=", 4)==0)
PS1 = getenv("PS1");
#endif
static inline void cmdedit_set_initial_prompt(void)
{
-#ifdef BB_FEATURE_SH_SIMPLE_PROMPT
+#ifndef BB_FEATURE_SH_FANCY_PROMPT
PS1 = NULL;
#else
PS1 = getenv("PS1");
static inline void setup_prompt_string(char **prompt_str)
{
-#ifdef BB_FEATURE_SH_SIMPLE_PROMPT
+#ifndef BB_FEATURE_SH_FANCY_PROMPT
/* Set up the prompt */
if (shell_context == 0) {
if (PS1)
(tmpcmd = strsep_space(cmd, &ix)) != NULL; cmd += ix, ix=0) {
if (*tmpcmd == '\0')
break;
+ /* we need to trim() the result for glob! */
+ trim(tmpcmd);
retval = glob(tmpcmd, flags, NULL, &expand_result);
free(tmpcmd); /* Free mem allocated by strsep_space */
if (retval == GLOB_NOSPACE) {
error_msg(out_of_space);
return FALSE;
}
- if (i>0) {
- strcat(command+total_length, " ");
- total_length+=1;
- }
+ strcat(command+total_length, " ");
+ total_length+=1;
strcat(command+total_length, expand_result.gl_pathv[i]);
total_length+=length;
}
else
var = itoa(last_bg_pid);
break;
- /* Everything else like $$, $#, $[0-9], etc should all be
+ /* Everything else like $$, $#, $[0-9], etc. should all be
* expanded by wordexp(), so we can in theory skip that stuff
- * here, but just to be on the safe side (i.e. since uClibc
+ * here, but just to be on the safe side (i.e., since uClibc
* wordexp doesn't do this stuff yet), lets leave it in for
* now. */
case '$':
int argc_l = 0;
int done = 0;
int argv_alloced;
- int i;
+ int i, saw_quote = 0;
char quote = '\0';
int count;
struct child_prog *prog;
*src == ']') *buf++ = '\\';
*buf++ = *src;
} else if (isspace(*src)) {
- if (*prog->argv[argc_l]) {
+ if (*prog->argv[argc_l] || saw_quote) {
buf++, argc_l++;
/* +1 here leaves room for the NULL which ends argv */
if ((argc_l + 1) == argv_alloced) {
argv_alloced);
}
prog->argv[argc_l] = buf;
+ saw_quote = 0;
}
} else
switch (*src) {
case '"':
case '\'':
quote = *src;
+ saw_quote = 1;
break;
case '#': /* comment */
case '|': /* pipe */
/* finish this command */
- if (*prog->argv[argc_l])
+ if (*prog->argv[argc_l] || saw_quote)
argc_l++;
if (!argc_l) {
error_msg("empty command in pipe");
src++;
}
- if (*prog->argv[argc_l]) {
+ if (*prog->argv[argc_l] || saw_quote) {
argc_l++;
}
if (!argc_l) {
if (!job_list.fg) {
/* move the shell to the foreground */
/* suppress messages when run from /linuxrc mag@sysgo.de */
- if (tcsetpgrp(0, getpid()) && errno != ENOTTY)
+ if (tcsetpgrp(0, getpgrp()) && errno != ENOTTY)
perror_msg("tcsetpgrp");
}
}
{
if (cwd) {
free(cwd);
- cwd = NULL;
}
if (local_pending_command)
free(local_pending_command);
if (interactive==TRUE) {
//printf( "optind=%d argv[optind]='%s'\n", optind, argv[optind]);
/* Looks like they want an interactive shell */
- printf( "\n\nBusyBox v%s (%s) Built-in shell (lash)\n", BB_VER, BB_BT);
+ printf( "\n\n" BB_BANNER " Built-in shell (lash)\n");
printf( "Enter 'help' for a list of built-in commands.\n\n");
} else if (local_pending_command==NULL) {
//printf( "optind=%d argv[optind]='%s'\n", optind, argv[optind]);
/* initialize the cwd -- this is never freed...*/
cwd = xgetcwd(0);
+ if (!cwd)
+ cwd = unknown;
#ifdef BB_FEATURE_CLEAN_UP
atexit(free_memory);