Major rework of the directory structure and the entire build system.
-Erik
This commit is contained in:
40
shell/Makefile
Normal file
40
shell/Makefile
Normal file
@@ -0,0 +1,40 @@
|
||||
# Makefile for busybox
|
||||
#
|
||||
# Copyright (C) 1999,2000,2001 by Erik Andersen <andersee@debian.org>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#
|
||||
|
||||
TOPDIR :=..
|
||||
L_TARGET := shell.a
|
||||
EXTRA_CFLAGS = -DBB_VER='"$(VERSION)"' -DBB_BT='"$(BUILDTIME)"'
|
||||
|
||||
obj-y :=
|
||||
obj-n :=
|
||||
obj- :=
|
||||
|
||||
obj-$(CONFIG_ASH) += ash.o
|
||||
obj-$(CONFIG_HUSH) += hush.o
|
||||
obj-$(CONFIG_LASH) += lash.o
|
||||
obj-$(CONFIG_MSH) += msh.o
|
||||
obj-$(CONFIG_FEATURE_COMMAND_EDITING) += cmdedit.o
|
||||
|
||||
|
||||
# Hand off to toplevel Rules.mak
|
||||
include $(TOPDIR)/Rules.mak
|
||||
|
||||
clean:
|
||||
rm -f $(L_TARGET) *.o core
|
||||
|
||||
34
shell/ash.c
34
shell/ash.c
@@ -265,7 +265,7 @@ union align {
|
||||
#define ALIGN(nbytes) (((nbytes) + sizeof(union align) - 1) & ~(sizeof(union align) - 1))
|
||||
#endif
|
||||
|
||||
#ifdef BB_LOCALE_SUPPORT
|
||||
#ifdef CONFIG_LOCALE_SUPPORT
|
||||
#include <locale.h>
|
||||
static void change_lc_all(const char *value);
|
||||
static void change_lc_ctype(const char *value);
|
||||
@@ -1218,7 +1218,7 @@ static struct var vpath;
|
||||
static struct var vps1;
|
||||
static struct var vps2;
|
||||
static struct var voptind;
|
||||
#ifdef BB_LOCALE_SUPPORT
|
||||
#ifdef CONFIG_LOCALE_SUPPORT
|
||||
static struct var vlc_all;
|
||||
static struct var vlc_ctype;
|
||||
#endif
|
||||
@@ -1261,7 +1261,7 @@ static const struct varinit varinit[] = {
|
||||
NULL },
|
||||
{ &voptind, VSTRFIXED|VTEXTFIXED, "OPTIND=1",
|
||||
getoptsreset },
|
||||
#ifdef BB_LOCALE_SUPPORT
|
||||
#ifdef CONFIG_LOCALE_SUPPORT
|
||||
{ &vlc_all, VSTRFIXED|VTEXTFIXED|VUNSET, "LC_ALL=",
|
||||
change_lc_all },
|
||||
{ &vlc_ctype, VSTRFIXED|VTEXTFIXED|VUNSET, "LC_CTYPE=",
|
||||
@@ -1556,7 +1556,7 @@ static int hashcmd (int, char **);
|
||||
static int helpcmd (int, char **);
|
||||
static int jobscmd (int, char **);
|
||||
static int localcmd (int, char **);
|
||||
#ifndef BB_PWD
|
||||
#ifndef CONFIG_PWD
|
||||
static int pwdcmd (int, char **);
|
||||
#endif
|
||||
static int readcmd (int, char **);
|
||||
@@ -1582,7 +1582,7 @@ static int typecmd (int, char **);
|
||||
static int getoptscmd (int, char **);
|
||||
#endif
|
||||
|
||||
#ifndef BB_TRUE_FALSE
|
||||
#ifndef CONFIG_TRUE_FALSE
|
||||
static int true_main (int, char **);
|
||||
static int false_main (int, char **);
|
||||
#endif
|
||||
@@ -1653,7 +1653,7 @@ static const struct builtincmd builtincmds[] = {
|
||||
{ BUILTIN_REGULAR "let", letcmd },
|
||||
#endif
|
||||
{ BUILTIN_ASSIGN "local", localcmd },
|
||||
#ifndef BB_PWD
|
||||
#ifndef CONFIG_PWD
|
||||
{ BUILTIN_NOSPEC "pwd", pwdcmd },
|
||||
#endif
|
||||
{ BUILTIN_REGULAR "read", readcmd },
|
||||
@@ -1938,7 +1938,7 @@ updatepwd(const char *dir)
|
||||
}
|
||||
|
||||
|
||||
#ifndef BB_PWD
|
||||
#ifndef CONFIG_PWD
|
||||
static int
|
||||
pwdcmd(argc, argv)
|
||||
int argc;
|
||||
@@ -3182,7 +3182,7 @@ returncmd(argc, argv)
|
||||
}
|
||||
|
||||
|
||||
#ifndef BB_TRUE_FALSE
|
||||
#ifndef CONFIG_TRUE_FALSE
|
||||
static int
|
||||
false_main(argc, argv)
|
||||
int argc;
|
||||
@@ -3224,7 +3224,7 @@ setinteractive(int on)
|
||||
is_interactive = on;
|
||||
if (do_banner==0 && is_interactive) {
|
||||
/* Looks like they want an interactive shell */
|
||||
#ifndef BB_FEATURE_SH_EXTRA_QUIET
|
||||
#ifndef CONFIG_FEATURE_SH_EXTRA_QUIET
|
||||
printf( "\n\n" BB_BANNER " Built-in shell (ash)\n");
|
||||
printf( "Enter 'help' for a list of built-in commands.\n\n");
|
||||
#endif
|
||||
@@ -3535,11 +3535,11 @@ tryexec(char *cmd, char **argv, char **envp)
|
||||
{
|
||||
int e;
|
||||
|
||||
#ifdef BB_FEATURE_SH_STANDALONE_SHELL
|
||||
#ifdef CONFIG_FEATURE_SH_STANDALONE_SHELL
|
||||
char *name = cmd;
|
||||
char** argv_l=argv;
|
||||
int argc_l;
|
||||
#ifdef BB_FEATURE_SH_APPLETS_ALWAYS_WIN
|
||||
#ifdef CONFIG_FEATURE_SH_APPLETS_ALWAYS_WIN
|
||||
name = get_last_path_component(name);
|
||||
#endif
|
||||
argv_l=envp;
|
||||
@@ -3766,7 +3766,7 @@ static int helpcmd(int argc, char** argv)
|
||||
col = 0;
|
||||
}
|
||||
}
|
||||
#ifdef BB_FEATURE_SH_STANDALONE_SHELL
|
||||
#ifdef CONFIG_FEATURE_SH_STANDALONE_SHELL
|
||||
{
|
||||
extern const struct BB_applet applets[];
|
||||
extern const size_t NUM_APPLETS;
|
||||
@@ -6023,7 +6023,7 @@ reset(void) {
|
||||
* This file implements the input routines used by the parser.
|
||||
*/
|
||||
|
||||
#ifdef BB_FEATURE_COMMAND_EDITING
|
||||
#ifdef CONFIG_FEATURE_COMMAND_EDITING
|
||||
static const char * cmdedit_prompt;
|
||||
static inline void putprompt(const char *s) {
|
||||
cmdedit_prompt = s;
|
||||
@@ -6090,7 +6090,7 @@ preadfd(void)
|
||||
parsenextc = buf;
|
||||
|
||||
retry:
|
||||
#ifdef BB_FEATURE_COMMAND_EDITING
|
||||
#ifdef CONFIG_FEATURE_COMMAND_EDITING
|
||||
{
|
||||
if (!iflag || parsefile->fd)
|
||||
nr = safe_read(parsefile->fd, buf, BUFSIZ - 1);
|
||||
@@ -7718,7 +7718,7 @@ ash_main(argc, argv)
|
||||
EXECCMD = find_builtin("exec");
|
||||
EVALCMD = find_builtin("eval");
|
||||
|
||||
#ifndef BB_FEATURE_SH_FANCY_PROMPT
|
||||
#ifndef CONFIG_FEATURE_SH_FANCY_PROMPT
|
||||
unsetenv("PS1");
|
||||
unsetenv("PS2");
|
||||
#endif
|
||||
@@ -9331,7 +9331,7 @@ getoptsreset(const char *value)
|
||||
shellparam.optoff = -1;
|
||||
}
|
||||
|
||||
#ifdef BB_LOCALE_SUPPORT
|
||||
#ifdef CONFIG_LOCALE_SUPPORT
|
||||
static void change_lc_all(const char *value)
|
||||
{
|
||||
if(value != 0 && *value != 0)
|
||||
@@ -12730,7 +12730,7 @@ findvar(struct var **vpp, const char *name)
|
||||
/*
|
||||
* Copyright (c) 1999 Herbert Xu <herbert@debian.org>
|
||||
* This file contains code for the times builtin.
|
||||
* $Id: ash.c,v 1.28 2001/10/19 00:22:22 andersen Exp $
|
||||
* $Id: ash.c,v 1.29 2001/10/24 05:00:16 andersen Exp $
|
||||
*/
|
||||
static int timescmd (int argc, char **argv)
|
||||
{
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
|
||||
#include "busybox.h"
|
||||
|
||||
#ifdef BB_LOCALE_SUPPORT
|
||||
#ifdef CONFIG_LOCALE_SUPPORT
|
||||
#define Isprint(c) isprint((c))
|
||||
#else
|
||||
#define Isprint(c) ( (c) >= ' ' && (c) != ((unsigned char)'\233') )
|
||||
@@ -55,32 +55,32 @@
|
||||
|
||||
#else
|
||||
|
||||
#define BB_FEATURE_COMMAND_EDITING
|
||||
#define BB_FEATURE_COMMAND_TAB_COMPLETION
|
||||
#define BB_FEATURE_COMMAND_USERNAME_COMPLETION
|
||||
#define BB_FEATURE_NONPRINTABLE_INVERSE_PUT
|
||||
#define BB_FEATURE_CLEAN_UP
|
||||
#define CONFIG_FEATURE_COMMAND_EDITING
|
||||
#define CONFIG_FEATURE_COMMAND_TAB_COMPLETION
|
||||
#define CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION
|
||||
#define CONFIG_FEATURE_NONPRINTABLE_INVERSE_PUT
|
||||
#define CONFIG_FEATURE_CLEAN_UP
|
||||
|
||||
#define D(x) x
|
||||
|
||||
#endif /* TEST */
|
||||
|
||||
#ifdef BB_FEATURE_COMMAND_TAB_COMPLETION
|
||||
#ifdef CONFIG_FEATURE_COMMAND_TAB_COMPLETION
|
||||
#include <dirent.h>
|
||||
#include <sys/stat.h>
|
||||
#endif
|
||||
|
||||
#ifdef BB_FEATURE_COMMAND_EDITING
|
||||
#ifdef CONFIG_FEATURE_COMMAND_EDITING
|
||||
|
||||
#ifndef BB_FEATURE_COMMAND_TAB_COMPLETION
|
||||
#undef BB_FEATURE_COMMAND_USERNAME_COMPLETION
|
||||
#ifndef CONFIG_FEATURE_COMMAND_TAB_COMPLETION
|
||||
#undef CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION
|
||||
#endif
|
||||
|
||||
#if defined(BB_FEATURE_COMMAND_USERNAME_COMPLETION) || defined(BB_FEATURE_SH_FANCY_PROMPT)
|
||||
#define BB_FEATURE_GETUSERNAME_AND_HOMEDIR
|
||||
#if defined(CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION) || defined(CONFIG_FEATURE_SH_FANCY_PROMPT)
|
||||
#define CONFIG_FEATURE_GETUSERNAME_AND_HOMEDIR
|
||||
#endif
|
||||
|
||||
#ifdef BB_FEATURE_GETUSERNAME_AND_HOMEDIR
|
||||
#ifdef CONFIG_FEATURE_GETUSERNAME_AND_HOMEDIR
|
||||
# ifndef TEST
|
||||
# include "pwd_grp/pwd.h"
|
||||
# else
|
||||
@@ -136,33 +136,33 @@ static int cursor; /* required global for signal handler */
|
||||
static int len; /* --- "" - - "" - -"- --""-- --""--- */
|
||||
static char *command_ps; /* --- "" - - "" - -"- --""-- --""--- */
|
||||
static
|
||||
#ifndef BB_FEATURE_SH_FANCY_PROMPT
|
||||
#ifndef CONFIG_FEATURE_SH_FANCY_PROMPT
|
||||
const
|
||||
#endif
|
||||
char *cmdedit_prompt; /* --- "" - - "" - -"- --""-- --""--- */
|
||||
|
||||
#ifdef BB_FEATURE_GETUSERNAME_AND_HOMEDIR
|
||||
#ifdef CONFIG_FEATURE_GETUSERNAME_AND_HOMEDIR
|
||||
static char *user_buf = "";
|
||||
static char *home_pwd_buf = "";
|
||||
static int my_euid;
|
||||
#endif
|
||||
|
||||
#ifdef BB_FEATURE_SH_FANCY_PROMPT
|
||||
#ifdef CONFIG_FEATURE_SH_FANCY_PROMPT
|
||||
static char *hostname_buf = "";
|
||||
static int num_ok_lines = 1;
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef BB_FEATURE_COMMAND_TAB_COMPLETION
|
||||
#ifdef CONFIG_FEATURE_COMMAND_TAB_COMPLETION
|
||||
|
||||
#ifndef BB_FEATURE_GETUSERNAME_AND_HOMEDIR
|
||||
#ifndef CONFIG_FEATURE_GETUSERNAME_AND_HOMEDIR
|
||||
static int my_euid;
|
||||
#endif
|
||||
|
||||
static int my_uid;
|
||||
static int my_gid;
|
||||
|
||||
#endif /* BB_FEATURE_COMMAND_TAB_COMPLETION */
|
||||
#endif /* CONFIG_FEATURE_COMMAND_TAB_COMPLETION */
|
||||
|
||||
/* It seems that libc5 doesn't know what a sighandler_t is... */
|
||||
#if (__GLIBC__ <= 2) && (__GLIBC_MINOR__ < 1)
|
||||
@@ -207,7 +207,7 @@ static void cmdedit_reset_term(void)
|
||||
handlers_sets &= ~SET_WCHG_HANDLERS;
|
||||
}
|
||||
fflush(stdout);
|
||||
#ifdef BB_FEATURE_CLEAN_UP
|
||||
#ifdef CONFIG_FEATURE_CLEAN_UP
|
||||
if (his_front) {
|
||||
struct history *n;
|
||||
|
||||
@@ -230,7 +230,7 @@ static void cmdedit_set_out_char(int next_char)
|
||||
|
||||
if (c == 0)
|
||||
c = ' '; /* destroy end char? */
|
||||
#ifdef BB_FEATURE_NONPRINTABLE_INVERSE_PUT
|
||||
#ifdef CONFIG_FEATURE_NONPRINTABLE_INVERSE_PUT
|
||||
if (!Isprint(c)) { /* Inverse put non-printable characters */
|
||||
if (c >= 128)
|
||||
c -= 128;
|
||||
@@ -321,7 +321,7 @@ static void put_prompt(void)
|
||||
cmdedit_y = 0; /* new quasireal y */
|
||||
}
|
||||
|
||||
#ifndef BB_FEATURE_SH_FANCY_PROMPT
|
||||
#ifndef CONFIG_FEATURE_SH_FANCY_PROMPT
|
||||
static void parse_prompt(const char *prmt_ptr)
|
||||
{
|
||||
cmdedit_prompt = prmt_ptr;
|
||||
@@ -359,7 +359,7 @@ static void parse_prompt(const char *prmt_ptr)
|
||||
break;
|
||||
c = *prmt_ptr++;
|
||||
switch (c) {
|
||||
#ifdef BB_FEATURE_GETUSERNAME_AND_HOMEDIR
|
||||
#ifdef CONFIG_FEATURE_GETUSERNAME_AND_HOMEDIR
|
||||
case 'u':
|
||||
pbuf = user_buf;
|
||||
break;
|
||||
@@ -382,7 +382,7 @@ static void parse_prompt(const char *prmt_ptr)
|
||||
case '$':
|
||||
c = my_euid == 0 ? '#' : '$';
|
||||
break;
|
||||
#ifdef BB_FEATURE_GETUSERNAME_AND_HOMEDIR
|
||||
#ifdef CONFIG_FEATURE_GETUSERNAME_AND_HOMEDIR
|
||||
case 'w':
|
||||
pbuf = pwd_buf;
|
||||
l = strlen(home_pwd_buf);
|
||||
@@ -526,7 +526,7 @@ static void cmdedit_init(void)
|
||||
}
|
||||
|
||||
if ((handlers_sets & SET_ATEXIT) == 0) {
|
||||
#ifdef BB_FEATURE_GETUSERNAME_AND_HOMEDIR
|
||||
#ifdef CONFIG_FEATURE_GETUSERNAME_AND_HOMEDIR
|
||||
struct passwd *entry;
|
||||
|
||||
my_euid = geteuid();
|
||||
@@ -537,20 +537,20 @@ static void cmdedit_init(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef BB_FEATURE_COMMAND_TAB_COMPLETION
|
||||
#ifdef CONFIG_FEATURE_COMMAND_TAB_COMPLETION
|
||||
|
||||
#ifndef BB_FEATURE_GETUSERNAME_AND_HOMEDIR
|
||||
#ifndef CONFIG_FEATURE_GETUSERNAME_AND_HOMEDIR
|
||||
my_euid = geteuid();
|
||||
#endif
|
||||
my_uid = getuid();
|
||||
my_gid = getgid();
|
||||
#endif /* BB_FEATURE_COMMAND_TAB_COMPLETION */
|
||||
#endif /* CONFIG_FEATURE_COMMAND_TAB_COMPLETION */
|
||||
handlers_sets |= SET_ATEXIT;
|
||||
atexit(cmdedit_reset_term); /* be sure to do this only once */
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef BB_FEATURE_COMMAND_TAB_COMPLETION
|
||||
#ifdef CONFIG_FEATURE_COMMAND_TAB_COMPLETION
|
||||
|
||||
static int is_execute(const struct stat *st)
|
||||
{
|
||||
@@ -561,7 +561,7 @@ static int is_execute(const struct stat *st)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#ifdef BB_FEATURE_COMMAND_USERNAME_COMPLETION
|
||||
#ifdef CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION
|
||||
|
||||
static char **username_tab_completion(char *ud, int *num_matches)
|
||||
{
|
||||
@@ -623,7 +623,7 @@ static char **username_tab_completion(char *ud, int *num_matches)
|
||||
return (matches);
|
||||
}
|
||||
}
|
||||
#endif /* BB_FEATURE_COMMAND_USERNAME_COMPLETION */
|
||||
#endif /* CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION */
|
||||
|
||||
enum {
|
||||
FIND_EXE_ONLY = 0,
|
||||
@@ -720,7 +720,7 @@ static char **exe_n_cwd_tab_completion(char *command, int *num_matches,
|
||||
strcpy(dirbuf, command);
|
||||
/* set dir only */
|
||||
dirbuf[(pfind - command) + 1] = 0;
|
||||
#ifdef BB_FEATURE_COMMAND_USERNAME_COMPLETION
|
||||
#ifdef CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION
|
||||
if (dirbuf[0] == '~') /* ~/... or ~user/... */
|
||||
username_tab_completion(dirbuf, 0);
|
||||
#endif
|
||||
@@ -826,12 +826,12 @@ static int find_match(char *matchBuf, int *len_with_quotes)
|
||||
collapse_pos(j, j + 1);
|
||||
int_buf[j] |= QUOT;
|
||||
i++;
|
||||
#ifdef BB_FEATURE_NONPRINTABLE_INVERSE_PUT
|
||||
#ifdef CONFIG_FEATURE_NONPRINTABLE_INVERSE_PUT
|
||||
if (matchBuf[i] == '\t') /* algorithm equivalent */
|
||||
int_buf[j] = ' ' | QUOT;
|
||||
#endif
|
||||
}
|
||||
#ifdef BB_FEATURE_NONPRINTABLE_INVERSE_PUT
|
||||
#ifdef CONFIG_FEATURE_NONPRINTABLE_INVERSE_PUT
|
||||
else if (matchBuf[i] == '\t')
|
||||
int_buf[j] = ' ';
|
||||
#endif
|
||||
@@ -1000,7 +1000,7 @@ static void input_tab(int *lastWasTab)
|
||||
/* Free up any memory already allocated */
|
||||
input_tab(0);
|
||||
|
||||
#ifdef BB_FEATURE_COMMAND_USERNAME_COMPLETION
|
||||
#ifdef CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION
|
||||
/* If the word starts with `~' and there is no slash in the word,
|
||||
* then try completing this word as a username. */
|
||||
|
||||
@@ -1119,7 +1119,7 @@ static void input_tab(int *lastWasTab)
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* BB_FEATURE_COMMAND_TAB_COMPLETION */
|
||||
#endif /* CONFIG_FEATURE_COMMAND_TAB_COMPLETION */
|
||||
|
||||
static void get_previous_history(struct history **hp, struct history *p)
|
||||
{
|
||||
@@ -1232,7 +1232,7 @@ int cmdedit_read_input(char *prompt, char command[BUFSIZ])
|
||||
* if the len=0 and no chars to delete */
|
||||
if (len == 0) {
|
||||
prepare_to_die:
|
||||
#if !defined(BB_ASH)
|
||||
#if !defined(CONFIG_ASH)
|
||||
printf("exit");
|
||||
goto_new_line();
|
||||
/* cmdedit_reset_term() called in atexit */
|
||||
@@ -1259,7 +1259,7 @@ prepare_to_die:
|
||||
input_backspace();
|
||||
break;
|
||||
case '\t':
|
||||
#ifdef BB_FEATURE_COMMAND_TAB_COMPLETION
|
||||
#ifdef CONFIG_FEATURE_COMMAND_TAB_COMPLETION
|
||||
input_tab(&lastWasTab);
|
||||
#endif
|
||||
break;
|
||||
@@ -1299,7 +1299,7 @@ prepare_to_die:
|
||||
goto prepare_to_die;
|
||||
}
|
||||
switch (c) {
|
||||
#ifdef BB_FEATURE_COMMAND_TAB_COMPLETION
|
||||
#ifdef CONFIG_FEATURE_COMMAND_TAB_COMPLETION
|
||||
case '\t': /* Alt-Tab */
|
||||
|
||||
input_tab(&lastWasTab);
|
||||
@@ -1367,7 +1367,7 @@ prepare_to_die:
|
||||
}
|
||||
|
||||
default: /* If it's regular input, do the normal thing */
|
||||
#ifdef BB_FEATURE_NONPRINTABLE_INVERSE_PUT
|
||||
#ifdef CONFIG_FEATURE_NONPRINTABLE_INVERSE_PUT
|
||||
/* Control-V -- Add non-printable symbol */
|
||||
if (c == 22) {
|
||||
if (safe_read(0, &c, 1) < 1)
|
||||
@@ -1457,7 +1457,7 @@ prepare_to_die:
|
||||
history_counter++;
|
||||
}
|
||||
}
|
||||
#if defined(BB_FEATURE_SH_FANCY_PROMPT)
|
||||
#if defined(CONFIG_FEATURE_SH_FANCY_PROMPT)
|
||||
num_ok_lines++;
|
||||
#endif
|
||||
}
|
||||
@@ -1465,10 +1465,10 @@ prepare_to_die:
|
||||
command[len++] = '\n'; /* set '\n' */
|
||||
command[len] = 0;
|
||||
}
|
||||
#if defined(BB_FEATURE_CLEAN_UP) && defined(BB_FEATURE_COMMAND_TAB_COMPLETION)
|
||||
#if defined(CONFIG_FEATURE_CLEAN_UP) && defined(CONFIG_FEATURE_COMMAND_TAB_COMPLETION)
|
||||
input_tab(0); /* strong free */
|
||||
#endif
|
||||
#if defined(BB_FEATURE_SH_FANCY_PROMPT)
|
||||
#if defined(CONFIG_FEATURE_SH_FANCY_PROMPT)
|
||||
free(cmdedit_prompt);
|
||||
#endif
|
||||
cmdedit_reset_term();
|
||||
@@ -1477,7 +1477,7 @@ prepare_to_die:
|
||||
|
||||
|
||||
|
||||
#endif /* BB_FEATURE_COMMAND_EDITING */
|
||||
#endif /* CONFIG_FEATURE_COMMAND_EDITING */
|
||||
|
||||
|
||||
#ifdef TEST
|
||||
@@ -1485,7 +1485,7 @@ prepare_to_die:
|
||||
const char *applet_name = "debug stuff usage";
|
||||
const char *memory_exhausted = "Memory exhausted";
|
||||
|
||||
#ifdef BB_FEATURE_NONPRINTABLE_INVERSE_PUT
|
||||
#ifdef CONFIG_FEATURE_NONPRINTABLE_INVERSE_PUT
|
||||
#include <locale.h>
|
||||
#endif
|
||||
|
||||
@@ -1493,7 +1493,7 @@ int main(int argc, char **argv)
|
||||
{
|
||||
char buff[BUFSIZ];
|
||||
char *prompt =
|
||||
#if defined(BB_FEATURE_SH_FANCY_PROMPT)
|
||||
#if defined(CONFIG_FEATURE_SH_FANCY_PROMPT)
|
||||
"\\[\\033[32;1m\\]\\u@\\[\\x1b[33;1m\\]\\h:\
|
||||
\\[\\033[34;1m\\]\\w\\[\\033[35;1m\\] \
|
||||
\\!\\[\\e[36;1m\\]\\$ \\[\\E[0m\\]";
|
||||
@@ -1501,7 +1501,7 @@ int main(int argc, char **argv)
|
||||
"% ";
|
||||
#endif
|
||||
|
||||
#ifdef BB_FEATURE_NONPRINTABLE_INVERSE_PUT
|
||||
#ifdef CONFIG_FEATURE_NONPRINTABLE_INVERSE_PUT
|
||||
setlocale(LC_ALL, "");
|
||||
#endif
|
||||
while(1) {
|
||||
|
||||
51
shell/config.in
Normal file
51
shell/config.in
Normal file
@@ -0,0 +1,51 @@
|
||||
#
|
||||
# For a description of the syntax of this configuration file,
|
||||
# see scripts/kbuild/config-language.txt.
|
||||
#
|
||||
|
||||
mainmenu_option next_comment
|
||||
comment 'Bourne Shell'
|
||||
|
||||
choice 'Choose your default shell' \
|
||||
"ash CONFIG_FEATURE_SH_IS_ASH \
|
||||
hush CONFIG_FEATURE_SH_IS_HUSH \
|
||||
lash CONFIG_FEATURE_SH_IS_LASH \
|
||||
msh CONFIG_FEATURE_SH_IS_MSH \
|
||||
none CONFIG_FEATURE_SH_IS_NONE"
|
||||
|
||||
if [ "$CONFIG_FEATURE_SH_IS_ASH" = "y" ] ; then
|
||||
define_bool CONFIG_ASH y
|
||||
else
|
||||
bool 'ash' CONFIG_ASH
|
||||
fi
|
||||
|
||||
if [ "$CONFIG_FEATURE_SH_IS_HUSH" = "y" ] ; then
|
||||
define_bool CONFIG_HUSH y
|
||||
else
|
||||
bool 'hush' CONFIG_HUSH
|
||||
fi
|
||||
|
||||
if [ "$CONFIG_FEATURE_SH_IS_LASH" = "y" ] ; then
|
||||
define_bool CONFIG_LASH y
|
||||
else
|
||||
bool 'lash' CONFIG_LASH
|
||||
fi
|
||||
|
||||
if [ "$CONFIG_FEATURE_SH_IS_MSH" = "y" ] ; then
|
||||
define_bool CONFIG_MSH y
|
||||
else
|
||||
bool 'msh' CONFIG_MSH
|
||||
fi
|
||||
|
||||
|
||||
comment 'Bourne Shell Options'
|
||||
bool 'command line editing' CONFIG_FEATURE_COMMAND_EDITING
|
||||
bool 'tab completion' CONFIG_FEATURE_COMMAND_TAB_COMPLETION
|
||||
bool 'username completion' CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION
|
||||
bool 'Standalone shell' CONFIG_FEATURE_SH_STANDALONE_SHELL
|
||||
bool 'Standalone shell -- applets always win' CONFIG_FEATURE_SH_APPLETS_ALWAYS_WIN
|
||||
bool 'Fancy shell prompts' CONFIG_FEATURE_SH_FANCY_PROMPT
|
||||
bool 'Hide message on interactive shell startup' CONFIG_FEATURE_SH_EXTRA_QUIET
|
||||
|
||||
endmenu
|
||||
|
||||
21
shell/hush.c
21
shell/hush.c
@@ -113,7 +113,8 @@
|
||||
#define applet_name "hush"
|
||||
#include "standalone.h"
|
||||
#define hush_main main
|
||||
#undef BB_FEATURE_SH_FANCY_PROMPT
|
||||
#undef CONFIG_FEATURE_SH_FANCY_PROMPT
|
||||
#define BB_BANNER
|
||||
#endif
|
||||
|
||||
typedef enum {
|
||||
@@ -836,7 +837,7 @@ static int static_peek(struct in_str *i)
|
||||
|
||||
static inline void cmdedit_set_initial_prompt(void)
|
||||
{
|
||||
#ifndef BB_FEATURE_SH_FANCY_PROMPT
|
||||
#ifndef CONFIG_FEATURE_SH_FANCY_PROMPT
|
||||
PS1 = NULL;
|
||||
#else
|
||||
PS1 = getenv("PS1");
|
||||
@@ -848,7 +849,7 @@ static inline void cmdedit_set_initial_prompt(void)
|
||||
static inline void setup_prompt_string(int promptmode, char **prompt_str)
|
||||
{
|
||||
debug_printf("setup_prompt_string %d ",promptmode);
|
||||
#ifndef BB_FEATURE_SH_FANCY_PROMPT
|
||||
#ifndef CONFIG_FEATURE_SH_FANCY_PROMPT
|
||||
/* Set up the prompt */
|
||||
if (promptmode == 1) {
|
||||
if (PS1)
|
||||
@@ -871,7 +872,7 @@ static void get_user_input(struct in_str *i)
|
||||
static char the_command[BUFSIZ];
|
||||
|
||||
setup_prompt_string(i->promptmode, &prompt_str);
|
||||
#ifdef BB_FEATURE_COMMAND_EDITING
|
||||
#ifdef CONFIG_FEATURE_COMMAND_EDITING
|
||||
/*
|
||||
** enable command line editing only while a command line
|
||||
** is actually being read; otherwise, we'll end up bequeathing
|
||||
@@ -1085,18 +1086,18 @@ static void pseudo_exec(struct child_prog *child)
|
||||
* really dislike relying on /proc for things. We could exec ourself
|
||||
* from global_argv[0], but if we are in a chroot, we may not be able
|
||||
* to find ourself... */
|
||||
#ifdef BB_FEATURE_SH_STANDALONE_SHELL
|
||||
#ifdef CONFIG_FEATURE_SH_STANDALONE_SHELL
|
||||
{
|
||||
int argc_l;
|
||||
char** argv_l=child->argv;
|
||||
char *name = child->argv[0];
|
||||
|
||||
#ifdef BB_FEATURE_SH_APPLETS_ALWAYS_WIN
|
||||
#ifdef CONFIG_FEATURE_SH_APPLETS_ALWAYS_WIN
|
||||
/* Following discussions from November 2000 on the busybox mailing
|
||||
* list, the default configuration, (without
|
||||
* get_last_path_component()) lets the user force use of an
|
||||
* external command by specifying the full (with slashes) filename.
|
||||
* If you enable BB_FEATURE_SH_APPLETS_ALWAYS_WIN, then applets
|
||||
* If you enable CONFIG_FEATURE_SH_APPLETS_ALWAYS_WIN, then applets
|
||||
* _aways_ override external commands, so if you want to run
|
||||
* /bin/cat, it will use BusyBox cat even if /bin/cat exists on the
|
||||
* filesystem and is _not_ busybox. Some systems may want this,
|
||||
@@ -2586,7 +2587,7 @@ int hush_main(int argc, char **argv)
|
||||
|
||||
/* Initialize some more globals to non-zero values */
|
||||
set_cwd();
|
||||
#ifdef BB_FEATURE_COMMAND_EDITING
|
||||
#ifdef CONFIG_FEATURE_COMMAND_EDITING
|
||||
cmdedit_set_initial_prompt();
|
||||
#else
|
||||
PS1 = NULL;
|
||||
@@ -2655,7 +2656,7 @@ int hush_main(int argc, char **argv)
|
||||
debug_printf("\ninteractive=%d\n", interactive);
|
||||
if (interactive) {
|
||||
/* Looks like they want an interactive shell */
|
||||
#ifndef BB_FEATURE_SH_EXTRA_QUIET
|
||||
#ifndef CONFIG_FEATURE_SH_EXTRA_QUIET
|
||||
printf( "\n\n" BB_BANNER " hush - the humble shell v0.01 (testing)\n");
|
||||
printf( "Enter 'help' for a list of built-in commands.\n\n");
|
||||
#endif
|
||||
@@ -2673,7 +2674,7 @@ int hush_main(int argc, char **argv)
|
||||
input = xfopen(argv[optind], "r");
|
||||
opt = parse_file_outer(input);
|
||||
|
||||
#ifdef BB_FEATURE_CLEAN_UP
|
||||
#ifdef CONFIG_FEATURE_CLEAN_UP
|
||||
fclose(input);
|
||||
if (cwd && cwd != unknown)
|
||||
free((char*)cwd);
|
||||
|
||||
38
shell/lash.c
38
shell/lash.c
@@ -2,8 +2,8 @@
|
||||
/*
|
||||
* lash -- the BusyBox Lame-Ass SHell
|
||||
*
|
||||
* Copyright (C) 1999,2000,2001 by Lineo, inc.
|
||||
* Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
|
||||
* Copyright (C) 1999,2000 by Lineo, inc. and Erik Andersen
|
||||
* Copyright (C) 1999,2000,2001 by Erik Andersen <andersee@debian.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
|
||||
@@ -25,8 +25,10 @@
|
||||
*
|
||||
*/
|
||||
|
||||
/* This shell's parsing engine is officially at a dead-end.
|
||||
* Future work shell work should be done using hush.c
|
||||
/* This shell's parsing engine is officially at a dead-end. Future
|
||||
* work shell work should be done using hush, msh, or ash. This is
|
||||
* still a very useful, small shell -- it just don't need any more
|
||||
* features beyond what it already has...
|
||||
*/
|
||||
|
||||
//For debugging/development on the shell only...
|
||||
@@ -48,7 +50,7 @@
|
||||
#include "busybox.h"
|
||||
#include "cmdedit.h"
|
||||
|
||||
#ifdef BB_LOCALE_SUPPORT
|
||||
#ifdef CONFIG_LOCALE_SUPPORT
|
||||
#include <locale.h>
|
||||
#endif
|
||||
|
||||
@@ -390,12 +392,12 @@ static int builtin_export(struct child_prog *child)
|
||||
res = putenv(v);
|
||||
if (res)
|
||||
fprintf(stderr, "export: %m\n");
|
||||
#ifdef BB_FEATURE_SH_FANCY_PROMPT
|
||||
#ifdef CONFIG_FEATURE_SH_FANCY_PROMPT
|
||||
if (strncmp(v, "PS1=", 4)==0)
|
||||
PS1 = getenv("PS1");
|
||||
#endif
|
||||
|
||||
#ifdef BB_LOCALE_SUPPORT
|
||||
#ifdef CONFIG_LOCALE_SUPPORT
|
||||
if(strncmp(v, "LC_ALL=", 7)==0)
|
||||
setlocale(LC_ALL, getenv("LC_ALL"));
|
||||
if(strncmp(v, "LC_CTYPE=", 9)==0)
|
||||
@@ -661,7 +663,7 @@ static void restore_redirects(int squirrel[])
|
||||
|
||||
static inline void cmdedit_set_initial_prompt(void)
|
||||
{
|
||||
#ifndef BB_FEATURE_SH_FANCY_PROMPT
|
||||
#ifndef CONFIG_FEATURE_SH_FANCY_PROMPT
|
||||
PS1 = NULL;
|
||||
#else
|
||||
PS1 = getenv("PS1");
|
||||
@@ -672,7 +674,7 @@ static inline void cmdedit_set_initial_prompt(void)
|
||||
|
||||
static inline void setup_prompt_string(char **prompt_str)
|
||||
{
|
||||
#ifndef BB_FEATURE_SH_FANCY_PROMPT
|
||||
#ifndef CONFIG_FEATURE_SH_FANCY_PROMPT
|
||||
/* Set up the prompt */
|
||||
if (shell_context == 0) {
|
||||
if (PS1)
|
||||
@@ -706,7 +708,7 @@ static int get_command(FILE * source, char *command)
|
||||
if (source == stdin) {
|
||||
setup_prompt_string(&prompt_str);
|
||||
|
||||
#ifdef BB_FEATURE_COMMAND_EDITING
|
||||
#ifdef CONFIG_FEATURE_COMMAND_EDITING
|
||||
/*
|
||||
** enable command line editing only while a command line
|
||||
** is actually being read; otherwise, we'll end up bequeathing
|
||||
@@ -1201,7 +1203,7 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg)
|
||||
static int pseudo_exec(struct child_prog *child)
|
||||
{
|
||||
struct built_in_command *x;
|
||||
#ifdef BB_FEATURE_SH_STANDALONE_SHELL
|
||||
#ifdef CONFIG_FEATURE_SH_STANDALONE_SHELL
|
||||
char *name;
|
||||
#endif
|
||||
|
||||
@@ -1223,7 +1225,7 @@ static int pseudo_exec(struct child_prog *child)
|
||||
exit (x->function(child));
|
||||
}
|
||||
}
|
||||
#ifdef BB_FEATURE_SH_STANDALONE_SHELL
|
||||
#ifdef CONFIG_FEATURE_SH_STANDALONE_SHELL
|
||||
/* Check if the command matches any busybox internal
|
||||
* commands ("applets") here. Following discussions from
|
||||
* November 2000 on busybox@opensource.lineo.com, don't use
|
||||
@@ -1237,8 +1239,8 @@ static int pseudo_exec(struct child_prog *child)
|
||||
*/
|
||||
name = child->argv[0];
|
||||
|
||||
#ifdef BB_FEATURE_SH_APPLETS_ALWAYS_WIN
|
||||
/* If you enable BB_FEATURE_SH_APPLETS_ALWAYS_WIN, then
|
||||
#ifdef CONFIG_FEATURE_SH_APPLETS_ALWAYS_WIN
|
||||
/* If you enable CONFIG_FEATURE_SH_APPLETS_ALWAYS_WIN, then
|
||||
* if you run /bin/cat, it will use BusyBox cat even if
|
||||
* /bin/cat exists on the filesystem and is _not_ busybox.
|
||||
* Some systems want this, others do not. Choose wisely. :-)
|
||||
@@ -1504,7 +1506,7 @@ static int busy_loop(FILE * input)
|
||||
}
|
||||
|
||||
|
||||
#ifdef BB_FEATURE_CLEAN_UP
|
||||
#ifdef CONFIG_FEATURE_CLEAN_UP
|
||||
void free_memory(void)
|
||||
{
|
||||
if (cwd && cwd!=unknown) {
|
||||
@@ -1611,7 +1613,7 @@ int lash_main(int argc_l, char **argv_l)
|
||||
if (interactive==TRUE) {
|
||||
//printf( "optind=%d argv[optind]='%s'\n", optind, argv[optind]);
|
||||
/* Looks like they want an interactive shell */
|
||||
#ifndef BB_FEATURE_SH_EXTRA_QUIET
|
||||
#ifndef CONFIG_FEATURE_SH_EXTRA_QUIET
|
||||
printf( "\n\n" BB_BANNER " Built-in shell (lash)\n");
|
||||
printf( "Enter 'help' for a list of built-in commands.\n\n");
|
||||
#endif
|
||||
@@ -1626,11 +1628,11 @@ int lash_main(int argc_l, char **argv_l)
|
||||
if (!cwd)
|
||||
cwd = unknown;
|
||||
|
||||
#ifdef BB_FEATURE_CLEAN_UP
|
||||
#ifdef CONFIG_FEATURE_CLEAN_UP
|
||||
atexit(free_memory);
|
||||
#endif
|
||||
|
||||
#ifdef BB_FEATURE_COMMAND_EDITING
|
||||
#ifdef CONFIG_FEATURE_COMMAND_EDITING
|
||||
cmdedit_set_initial_prompt();
|
||||
#else
|
||||
PS1 = NULL;
|
||||
|
||||
26
shell/msh.c
26
shell/msh.c
@@ -681,7 +681,7 @@ static void * brktop;
|
||||
static void * brkaddr;
|
||||
|
||||
|
||||
#ifdef BB_FEATURE_COMMAND_EDITING
|
||||
#ifdef CONFIG_FEATURE_COMMAND_EDITING
|
||||
static char * current_prompt;
|
||||
#endif
|
||||
|
||||
@@ -732,7 +732,7 @@ extern int msh_main(int argc, char **argv)
|
||||
setval(ifs, " \t\n");
|
||||
|
||||
prompt = lookup("PS1");
|
||||
#ifdef BB_FEATURE_SH_FANCY_PROMPT
|
||||
#ifdef CONFIG_FEATURE_SH_FANCY_PROMPT
|
||||
if (prompt->value == null)
|
||||
#endif
|
||||
setval(prompt, "$ ");
|
||||
@@ -741,7 +741,7 @@ extern int msh_main(int argc, char **argv)
|
||||
prompt->status &= ~EXPORT;
|
||||
}
|
||||
cprompt = lookup("PS2");
|
||||
#ifdef BB_FEATURE_SH_FANCY_PROMPT
|
||||
#ifdef CONFIG_FEATURE_SH_FANCY_PROMPT
|
||||
if (cprompt->value == null)
|
||||
#endif
|
||||
setval(cprompt, "> ");
|
||||
@@ -801,7 +801,7 @@ extern int msh_main(int argc, char **argv)
|
||||
PUSHIO(afile, 0, iof);
|
||||
if (isatty(0) && isatty(1) && !cflag) {
|
||||
interactive++;
|
||||
#ifndef BB_FEATURE_SH_EXTRA_QUIET
|
||||
#ifndef CONFIG_FEATURE_SH_EXTRA_QUIET
|
||||
printf( "\n\n" BB_BANNER " Built-in shell (msh)\n");
|
||||
printf( "Enter 'help' for a list of built-in commands.\n\n");
|
||||
#endif
|
||||
@@ -835,7 +835,7 @@ extern int msh_main(int argc, char **argv)
|
||||
|
||||
for (;;) {
|
||||
if (interactive && e.iop <= iostack) {
|
||||
#ifdef BB_FEATURE_COMMAND_EDITING
|
||||
#ifdef CONFIG_FEATURE_COMMAND_EDITING
|
||||
current_prompt=prompt->value;
|
||||
#else
|
||||
prs(prompt->value);
|
||||
@@ -2171,7 +2171,7 @@ loop:
|
||||
startl = 1;
|
||||
if (multiline || cf & CONTIN) {
|
||||
if (interactive && e.iop <= iostack) {
|
||||
#ifdef BB_FEATURE_COMMAND_EDITING
|
||||
#ifdef CONFIG_FEATURE_COMMAND_EDITING
|
||||
current_prompt=cprompt->value;
|
||||
#else
|
||||
prs(cprompt->value);
|
||||
@@ -2224,7 +2224,7 @@ register int c, c1;
|
||||
return(YYERRCODE);
|
||||
}
|
||||
if (interactive && c == '\n' && e.iop <= iostack) {
|
||||
#ifdef BB_FEATURE_COMMAND_EDITING
|
||||
#ifdef CONFIG_FEATURE_COMMAND_EDITING
|
||||
current_prompt=cprompt->value;
|
||||
#else
|
||||
prs(cprompt->value);
|
||||
@@ -2838,9 +2838,9 @@ char *c, **v, **envp;
|
||||
register char *sp, *tp;
|
||||
int eacces = 0, asis = 0;
|
||||
|
||||
#ifdef BB_FEATURE_SH_STANDALONE_SHELL
|
||||
#ifdef CONFIG_FEATURE_SH_STANDALONE_SHELL
|
||||
char *name = c;
|
||||
#ifdef BB_FEATURE_SH_APPLETS_ALWAYS_WIN
|
||||
#ifdef CONFIG_FEATURE_SH_APPLETS_ALWAYS_WIN
|
||||
name = get_last_path_component(name);
|
||||
#endif
|
||||
optind = 1;
|
||||
@@ -2960,7 +2960,7 @@ static int dohelp()
|
||||
col = 0;
|
||||
}
|
||||
}
|
||||
#ifdef BB_FEATURE_SH_STANDALONE_SHELL
|
||||
#ifdef CONFIG_FEATURE_SH_STANDALONE_SHELL
|
||||
{
|
||||
int i;
|
||||
const struct BB_applet *applet;
|
||||
@@ -4256,7 +4256,7 @@ readc()
|
||||
if (multiline)
|
||||
return e.iop->prev = 0;
|
||||
if (interactive && e.iop == iostack+1) {
|
||||
#ifdef BB_FEATURE_COMMAND_EDITING
|
||||
#ifdef CONFIG_FEATURE_COMMAND_EDITING
|
||||
current_prompt=prompt->value;
|
||||
#else
|
||||
prs(prompt->value);
|
||||
@@ -4462,7 +4462,7 @@ register struct ioarg *ap;
|
||||
return *bp->bufp++ & 0177;
|
||||
}
|
||||
|
||||
#ifdef BB_FEATURE_COMMAND_EDITING
|
||||
#ifdef CONFIG_FEATURE_COMMAND_EDITING
|
||||
if (interactive) {
|
||||
static char mycommand[BUFSIZ];
|
||||
static int position = 0, size = 0;
|
||||
@@ -4721,7 +4721,7 @@ int ec;
|
||||
e.iobase = e.iop;
|
||||
for (;;) {
|
||||
if (interactive && e.iop <= iostack) {
|
||||
#ifdef BB_FEATURE_COMMAND_EDITING
|
||||
#ifdef CONFIG_FEATURE_COMMAND_EDITING
|
||||
current_prompt=cprompt->value;
|
||||
#else
|
||||
prs(cprompt->value);
|
||||
|
||||
Reference in New Issue
Block a user