| Commit message (Collapse) | Author | Age | Files | Lines |
... | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
The functions to calculate the size of the forkshell data block
returned the total size of funcblock and funcstring. The relocation
map only needs to cover the size of the forkshell structure plus
funcblock, not funcstring.
Revise the *_size() functions to distinguish between funcblock and
funcstring. Avoid complicating the calculation of node sizes
(calcsize() and related functions). This slightly overestimates the
size of funcblock by including strings stored in node structures.
This change increases the binary by 96 bytes but can save several
thousand bytes at runtime.
|
| |
| |
| |
| |
| |
| |
| | |
The MARK_PTR macro was unnecessarily complex. Since the relocation
map is a fixed offset from the start of the forkshell structure we
can obtain a pointer to the flag corresponding to a given destination
pointer knowing just the pointer and the offset. Saves 324 bytes.
|
| |
| |
| |
| |
| |
| | |
Group together the code to mark pointers in the relocation map and
that to store annotations. This allows some optimisations when
forkshell debugging is enabled, saving 32 bytes.
|
| |
| |
| |
| |
| |
| |
| | |
Currently the size of the relocate map is equal to the size of the
forkshell struct plus funcblock and funcstring. This may not always
be the case so record the size of the map separately. This doesn't
affect the size of the binary.
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
The original code kept an array of pointers to pointers that needed
to be adjusted after forkshell (nodeptr). Switch to using a map to
indicate which locations in the data block need to be adjusted.
This requires a larger data block. However the *_size() functions
which calculate the data block size need less information about the
data structures. Saves about 100 bytes in the binary.
|
| |
| |
| |
| |
| |
| |
| |
| | |
Ensure that tblentry structures are properly aligned. The cmdname
array has a size of one but the code doesn't allow for this in case
upstream ever switches to using an empty array.
Remove a couple of unnecessary increments.
|
|\| |
|
| |
| |
| |
| |
| |
| |
| | |
This is *much* better (9 kbytes better) than dropping "*const"
optimization trick.
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
|
| |
| |
| |
| | |
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
|
| |
| |
| |
| |
| | |
Add code to store line editing history in the forkshell data block.
This allows things like 'history | grep whatever' to work.
|
| |
| |
| |
| |
| |
| |
| |
| | |
The alias table has never been copied during forkshell. As a result
any attempts to use the alias command in conjunction with pipes or
backquote expansion, for example, fail.
Fix this by adding the necessary code.
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Upstream BusyBox commit f3634584d (ash,hush: show 'c' in $- if run in
"sh -c CMD") changed the behaviour of -s to match that of bash rather
than dash. This means that the -s and -c options can't be combined.
This combination of options is used by the Windows 'su' applet to
prevent the new console window from shutting down after the command
has run. It's also useful when the shell is to be run with an
initialisation command (GitHub issue #100).
Revert the change so -s behaves as in dash.
|
|\| |
|
| |
| |
| |
| |
| |
| | |
Patch by Martijn Dekker <martijn@inlv.org>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Commit d1a2fa2a4 (ash: catch error in arithmetic expansion in PS1)
catches all exceptions raised by expandarg(). Some exceptions, such as
the EXEXIT raised when command expansion is used, are expected:
export PS1='$(echo "$ ")'
These should be processed normally or the shell hangs at the prompt.
function old new delta
expandstr 344 353 +9
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/0 up/down: 9/0) Total: 9 bytes
Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
function old new delta
options 552 599 +47
expand_one_var 2375 2385 +10
optletters_optnames 60 64 +4
hush_main 1108 1111 +3
ash_main 1150 1152 +2
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 5/0 up/down: 66/0) Total: 66 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
function old new delta
optschanged 91 128 +37
historycmd 13 17 +4
setcmd 80 78 -2
ash_main 1167 1150 -17
options 576 552 -24
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/3 up/down: 41/-43) Total: -2 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
|
|\| |
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Setting PS1 to:
PS1='$((123+))'
causes the shell to enter an infinite error loop:
sh: arithmetic syntax error
Catch any exception raised by expandarg() in expandstr() and allow
processing to continue.
function old new delta
expandstr 262 344 +82
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/0 up/down: 82/0) Total: 82 bytes
Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Setting PS1 to:
PS1='`xxx(`'
causes the shell to terminate with the error:
sh: syntax error: unexpected end of file (expecting ")")
This happens because old-style backquotes require the input to be reread
and thus call setinputstring() a second time. Prevent the problem by
unwinding all recently opened files in expandstr().
function old new delta
unwindfiles - 22 +22
expandstr 247 262 +15
forkchild 631 625 -6
evalcommand 1694 1685 -9
ash_main 1346 1336 -10
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 1/3 up/down: 37/-25) Total: 12 bytes
Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
|
|\| |
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Bash 5.0 added the dynamic variable EPOCHSECONDS and EPOCHREALTIME
which return the number of seconds since the Unix Epoch as an
integer or float. These are useful for logging or tracing.
function old new delta
change_epoch - 78 +78
.rodata 175167 175235 +68
varinit_data 264 312 +48
change_seconds - 24 +24
change_realtime - 24 +24
------------------------------------------------------------------------------
(add/remove: 3/0 grow/shrink: 2/0 up/down: 242/0) Total: 242 bytes
text data bss dec hex filename
938508 4203 1888 944599 e69d7 busybox_old
938702 4203 1888 944793 e6a99 busybox_unstripped
v2: Cast tv_sec and tv_usec to unsigned quantities.
Add brackets to macros.
Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Commit b28d4c346 (ash: [VAR] Move unsetvar functionality into setvareq)
dropped the code that caused dynamic variables to lose their special
properties when unset. Add it back again.
function old new delta
setvareq 346 360 +14
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/0 up/down: 14/0) Total: 14 bytes
Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
|
|\| |
|
| |
| |
| |
| |
| |
| |
| |
| | |
Add a specific define to indicate which bash compatibility code
implements 'wait -n'.
Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Standardise the path names used for the current working directory by:
- resolving with realpath(3);
- making the drive name or host name uppercase.
The first only really works for physical drives; results for mapped
drives are patchy.
The standardisation is applied in two places:
- at the end of updatepwd() in ash;
- when a symbolic link is resolved in mingw_chdir().
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
When a drive is mapped to a network share or a path display the
mapping in the 'Filesystem' column of df's output.
Since this changes the mnt_fsname field of the mntent structure
a slight alteration is needed to print_all_cwd() in ash.
Revert the change in commit a8c63f25b that enabled FEATURE_DF_FANCY
in the default configuration. None of the additional options is
very useful.
See GitHub issue #164.
|
|\| |
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
function old new delta
waitcmd 205 288 +83
dowait 405 444 +39
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 122/0) Total: 122 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Microsoft Windows permits path names of the form 'c:path', without a
path separator after the colon. The system records a current directory
for each drive and the path is interpreted relative to that.
Since Windows API calls understand 'c:path' path names many commands
in busybox-w32 already work with them. This commit adds the following:
- The 'cd' shell built-in interprets 'c:path' path names correctly.
Previously it treated them as relative to the shell's concept of
the current working directory, not the current directory of the
specified drive.
- The 'pwd' shell built-in takes the '-a' option to list the current
directory for all drives.
- 'c:path' path names are subject to tab-completion.
Paths of the form 'c:path' don't work for mapped network drives or
paths that have been associated with a drive using SUBST.
See GitHub issue #147.
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
BusyBox contains hardcoded references to absolute paths which
are unique in the *nix world but on Microsoft Windows are
interpreted as being on the current drive. To make these unique
again consider them to be relative to %SYSTEMDRIVE%.
Support this by adding functions to:
- determine the system drive (not using the environment variable);
- change a process's current directory to the root of the system drive;
- make relative paths absolute before changing directory (if needed).
The following applications have been modified:
- ash references /etc/profile from the system drive;
- dpkg places its data store on and installs files to the system drive;
- rpm installs files to the system drive;
- man looks for configuration files and man pages on the system drive.
See GitHub issue #158.
|
| |
| |
| |
| |
| |
| |
| | |
Move unc_root_len() from ash to mingw32.c and use it in the new
function root_len(), which can be used in make_directory().
This reduces changes to upstream code and saves a few bytes.
|
| | |
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Commit a23624237 (win32: special treatment for PATH) required the
PATH variable to use ';' as the separator between components and
enforced this by intercepting attempts to update it.
Do the same for the CDPATH and MANPATH variables.
Also, fix a case in cdcmd() where the wrong separator was used.
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
When the shell starts behave as though the user had manually changed
to the current working directory of the process, but only if it's an
interactive, non-login shell and the '-d' flag isn't present.
This gives more consistent behaviour when the shell is started in a
drive mapped to a network share or a symlinked directory.
This completes the changes requested in GitHub issue #148.
|
| |
| |
| |
| |
| |
| |
| |
| |
| | |
There are now two places where slashes are converted to backslashes
throughout a string so it makes sense to create a function to do
this.
To avoid confusion rename convert_slashes() to bs_to_slash() and
call the new function slash_to_bs().
|
|\| |
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
The following constructs result in ever-increasing memory usage:
while true; do { true; } </dev/null; done
while true; do ( true; ) </dev/null; done
For comparison, bash displays static memory usage in both cases.
This has been fixed in dash by commit 2bc6caa. The maintainer
writes:
I have simplified evaltree so that it simply sets the stack mark
unconditionally. This allows us to remove the stack marks in the
functions called by evaltree.
Closes BusyBox bug 7748.
function old new delta
evaltree 606 632 +26
evalcommand 1724 1696 -28
evalcase 382 351 -31
evalfor 230 196 -34
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/3 up/down: 26/-93) Total: -67 bytes
Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Rework the code in updatepwd() which processes UNC paths so that
the root of a share is properly identified. This fixes problems
when:
- the current directory is a share and the user changes to '/';
- the current directory is the root of a share and the user tries
to change to '..'.
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Formalise the use of 0 as the uid of a process running with elevated
privileges:
- Rewrite getuid(2) to return DEFAULT_UID by default and 0 if the
process has elevated privileges.
- geteuid(2) and the corresponding functions for groups are aliases
for getuid(2).
- Change root's home directory to be whatever GetSystemDirectory()
returns, probably C:/Windows/System32 in most cases.
- Remove the special handling of geteuid(2) in the line editing code.
With these changes the shell started by 'su' is a lot more like a
*nix root shell.
|
| | |
|
| |
| |
| |
| |
| |
| |
| |
| | |
When busybox-w32 is installed in C:/Windows/System32 su doesn't
run in the same directory as its parent as intended.
Work around this by adding a flag to the shell to set the working
directory.
|
| |
| |
| |
| |
| | |
The 'nocaseglob' shell option enables case-insensitive filename
globbing. By default globbing is case-sensitive.
|
| |
| |
| |
| |
| |
| | |
There were a few places where changes intended for the WIN32 build
also affected the POSIX build. Fix these so the result of 'make
defconfig; make' for busybox-w32 is identical to upstream BusyBox.
|
| |
| |
| |
| |
| |
| |
| |
| | |
Move the code to hide the console to a separate function in
win32/mingw.c. Use lazy loading to avoid problems on platforms
where the require APIs aren't supported (PR #70).
Enable console hiding in the default 64-bit configuration.
|
| | |
|
| | |
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
These are cosmetic changes only.
Make the arguments to spawn_forkshell more like those of forkshell.
Since job control isn't currently supported in busybox-w32 the node
argument isn't actually used.
The node passed in the forkshell structure is used in the child
code. It may be different from the node passed as an argument to
spawn_forkshell which, in the upstream code, is forwarded to
forkparent and forkchild.
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
The shell could fail to evaluate strings containing carriage
returns. For example:
awk 'BEGIN {
"set -ex\r\npwd\r\n" | getline
}' </dev/null
The string is passed as an argument to "sh -c". The "set" built-in
fails because it attempts to treat the carriage return as an option.
Although this is correct behaviour on Unix it may be unhelpful on
Microsoft Windows.
See GitHub issue #138.
|
|\| |
|