| Commit message (Collapse) | Author | Age | Files | Lines |
... | |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Change how busybox.exe expands wildcards on the command line.
When globbing is enabled at compile time provide an implementation
of _setargv(), which is run early during startup of C programs. This:
- enables globbing by setting _dowildcard to -1
- checks for the presence of the environment BB_GLOBBING
- if it exists and is set to 0 disables globbing
- if it doesn't exist sets BB_GLOBBING=0 but continues to apply
Windows' globbing in the current process
The consequences of this are:
- When busybox.exe is initially run from a Command Prompt Windows'
globbing is applied;
- Windows' globbing is turned off for future child processes, thus
allowing the shell re-execute busybox.exe without it interfering
with wildcards;
- this behaviour can be overridden by setting BB_GLOBBING explicitly.
Globbing can still be disabled at compile time if required. In that
case BB_GLOBBING has no effect.
With these changes globbing can be enabled by default and BusyBox
will do the right thing in most circumstances.
(See GitHub issues #172 and #189.)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The function mingw_spawn_forkshell() was introduced to handle
spawning a forkshell process. Since we know that:
- the binary being executed doesn't meet any of the special cases
handled by spawnveq()
- the arguments don't require quoting
we can call spawnve() directly instead of spawnveq().
Also, use xzalloc() to allocate new_argv so we don't need to set
the final NULL pointer explicitly.
|
|
|
|
| |
Modern versions of MinGW-w64 define more console modes.
|
|
|
|
|
|
|
| |
In the 64-bit build the time applet reported garbage when it was
unable to run the program to be timed.
The error return from mingw_spawn_pid() was incorrect.
|
|
|
|
|
|
|
|
|
| |
The subprocess that handles incoming connections for httpd didn't
work. It has an accepted connection on stdin and calls getpeername()
to obtain its details, but getpeername() didn't initialise networking.
ssl_client only seems to deal with file descriptors. Expose
init_winsock() again and call it from ssl_client.
|
|
|
|
|
|
|
|
|
| |
Only a handful of functions are used from shell32.dll, userenv.dll
and psapi.dll. Mostly these functions are in out of the way places.
By loading the functions only when required we can avoid the startup
cost of linking the three DLLs in the common case that they aren't
needed.
|
|
|
|
|
|
| |
A call to initialise networking is made during start up even if
the applet doesn't need it. Instead, only initialise networking
when a call is made to a function that definitely requires it.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
spawn_forkshell() uses mingw_spawn_proc() to start the child shell.
mingw_spawn_proc() then calls mingw_spawn_1() which determines
that "sh" is an applet, thus calling mingw_spawn_applet() which
finally calls spawnveq().
Not only is this convoluted it also won't work if PREFER_APPLETS
and SH_STANDALONE aren't enabled.
Simplify matters by adding a new function, mingw_spawn_forkshell(),
which is tailored for just this case.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Since the earliest days of busybox-w32 '#!' has searched PATH for
the interpreter. This doesn't seem to be supported by precedent.
In testing I also found that additional code was needed for the case
where PATH has been altered in the current shell or is modified on
the command line: PATH has to be extracted from envp rather than
getenv("PATH"). Drop this non-standard feature.
*NIX implementations disagree on whether the interpreter can itself
be a script. Follow Linux and allow this with a limit of four levels
of nesting.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Commit e6680912a (dd: create a sparse file when seek=N is used)
broke the use of 'conv=notrunc seek=N' to modify existing files.
Rename seek_sparse() to make_sparse() and:
- add an argument to specify the start of the sparse region;
- call make_sparse() before ftruncate();
- call make_sparse() only if:
* we can determine the size of the file;
* the file is not open in append mode;
* the file is being extended.
This should fix GitHub issue #186.
|
|
|
|
|
|
|
|
|
|
|
|
| |
Use ReadDirectoryChangesW to implement inotifyd for WIN32.
There are limitations:
- It's only possible to watch directories, not files.
- The notification doesn't distinguish between different changes to
file state. All changes other than creation, deletion and renaming
are reported as 'c'.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Change the meaning of the BB_SKIP_ANSI_EMULATION variable:
- if it isn't set or if it has any value other than 1 or 2, use
ANSI emulation;
- if it's set to 1, always emit ANSI escape codes;
- if it's set to 2, attempt to enable virtual terminal processing in
the current console. If that works emit ANSI escape codes, if not
revert to ANSI emulation.
On all platforms I've tested (Windows 10, Windows 8.1, ReactOS 0.4.13,
plus ConEmu) BB_SKIP_ANSI_EMULATION=2 does the right thing.
|
|
|
|
|
| |
Update the skip status on the first call to skip_ansi_emulation()
and whenever the BB_SKIP_ANSI_EMULATION variable changes.
|
|
|
|
|
|
|
|
| |
Port the time applet to WIN32. This requires the implemntation of
a replacement for wait3(2).
Only elapsed, user and system times are supported, not the memory
and i/o statistics reported by GNU time.
|
|
|
|
|
|
|
| |
Implement getpeername(2).
Add mingw_spawn_detach() to allow the spawned process to detach from
the console.
|
|
|
|
|
|
|
|
| |
Tab-completion of 'c:file' paths was leaking memory and incorrectly
included BusyBox applets and shell built-ins.
Fix handling of 'c:file' paths used as arguments to spawn functions.
Otherwise things like 'timeout 5 c:busybox sleep 99' don't work.
|
|
|
|
|
|
|
| |
When the seek=N argument is used mark the file as sparse and set
the range that is sparse.
See https://stackoverflow.com/questions/4011508/how-to-create-a-sparse-file-on-ntfs
|
|
|
|
|
|
| |
Use GetCompressedFileSize to obtain the actual number of blocks
for compressed or sparse files. Use this to return a more accurate
value for st_blocks.
|
|
|
|
|
|
|
|
| |
Our implementation of strptime() doesn't support alternative number
formats. Rather than duplicate the code for the affected conversion
specifications just return to the start of the switch statement.
Saves 256 bytes.
|
|
|
|
|
|
|
| |
Replace several explicit string comparisons with a single call
to index_in_strings().
Saves 304 bytes.
|
|
|
|
|
|
|
| |
Define NOT_DEVICE as -1 so the return value of index_in_strings()
when no device name is matched is NOT_DEVICE.
Make the logic in mingw_open() clearer.
|
|
|
|
|
|
|
| |
Use memset() to fill the structure with zeroes, avoiding the need
to set some members explicitly.
Saves 16 bytes.
|
|
|
|
|
|
|
|
| |
Place filesystem names in a single null-separated string and search
it using index_in_strings(). Use the result (offset by 1 to allow
for failure) to index an array of filesytem types.
Saves 112 bytes.
|
|
|
|
|
|
| |
Improve get_dev_type() and use it to dectect /dev/null in mingw_xopen().
Saves 64 bytes.
|
|
|
|
|
| |
Have bs_to_slash() return a pointer to its argument. This allows
some calls to be chained, saving 32 bytes.
|
|
|
|
|
|
|
| |
Since we don't have a working clock_settime(2) there's no point
in claiming to support the '-s' option.
Saves 96 bytes
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Closing 'vi' in Windows 7 resulted in the console window failing to
echo any output correctly until the 'reset' builtin was run. This
didn't happen in Windows XP, 8 or 10.
The problem is fixed by only duplicating the console handle when switching
*to* the alternate screen buffer.
Add sanity checks so that switching to the alternate buffer requires
the cached handled to be invalid, while it must be valid when switching
from the alternate buffer.
|
|
|
|
|
|
|
|
|
|
|
|
| |
When a format specification is replaced the loop variable 't'
should point to the last character of the replacement string in
the new format buffer.
In an extreme case if the original format string is "%z" and
tm->tm_isdst is negative to indicate that no DST information is
available the replacement string will be empty and 't' will point
to the location before the start of the new format buffer. This
is OK.
|
|
|
|
|
| |
The security descriptor was being freed before its contents were
accessed.
|
|
|
|
|
|
| |
- Update configuration files
- Omit unnecessary libraries
- Replace fake stime(2) with fake clock_settime(2)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Rework the ANSI emulation code to reduce its size.
- Fetch console attributes when required rather than caching them.
The init() function is no longer required; the only remaining
initialisation is now performed in is_console().
- Turning off inverse video (ESC[27m) didn't work properly. This has
been improved though it still doesn't work in some unlikely cases
(ESC[7;27m).
These changes save 180 bytes.
|
| |
|
|
|
|
|
|
|
|
|
| |
As reported in GitHub issue #178 the last colour set by the ls command
is retained in the console.
This is due to the previous commit reinitialising the stored attributes
more frequently than it should. Attriubutes should only be initialised
once.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
As reported in GitHub issue #177, ANSI escape sequences don't work
reliably after shell redirection.
The problem appears to be due to a change in the behaviour of dup2()
in Windows 10 release 1809. The escape handling code kept a copy of
the console handle for internal use. Prior to Windows 10 release 1809
this worked; since then unwinding shell redirections results in the actual
console handle changing from time to time for reasons that are unknowable
without access to the source code.
Fix this by always fetching the console handle instead of caching it.
|
|
|
|
|
|
| |
Modern Linux kernels use struct timespec to represent file times,
thus allowing nanosecond precision. Update the WIN32 emulation of
struct stat and stat(2) to do the same.
|
|
|
|
|
|
|
|
|
|
|
|
| |
Commit 97e2c4a05 (win32: changes to treatment of scripts) attempted
to use strtok(3) to simplify the parsing of shebang lines.
Unfortunately it resulted in leading and trailing whitespace being
left in the option string. Fix this by trimming the options before
they're returned.
Reported-by: Niklas DAHLQUIST <niklas.dahlquist@st.com>
Signed-off-by: Ron Yorston <rmy@pobox.com>
|
|
|
|
|
|
|
| |
Implement the "ESC[?1049h" and "ESC[?1049l" ANSI escape sequences
to switch between the alternate and normal screen buffers.
This allows vi to restore the original screen contents on exit.
|
|
|
|
| |
Add a common function to clear a section of the screen buffer.
|
|
|
|
|
|
|
|
|
| |
Use INVALID_HANDLE_VALUE (not NULL) to indicate that the console and
console_in handles haven't been initialised.
Replace many explicit comparisons against INVALID_HANDLE_VALUE with
tests on the return value of GetConsoleScreenBufferInfo() which
fails for an invalid handle.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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().
|
|
|
|
|
|
|
|
|
|
|
| |
Drives mapped to a network share or path didn't have their current
directory tracked when using path names of the form 'c:path'.
This was because commit 585d17d26 used realpath(3) to canonicalise
paths in chdir(2). Use readlink(2) instead so that mapped drives
aren't canonicalised but symlinks are resolved.
See GitHub issue #147.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
|
| |
- The arguments to setmntent(3) are unused: add a macro to drop
them at call sites.
- Allow remote drives.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
|
|
|
|
| |
Miscellaneous improvements:
- Enable '-a' option to display all filesystems in df(1).
- Detect the UDF CDROM filesystem and display it in 'stat -f'.
- Let getmntent(3) handle CDROM and floppy devices, ignoring those
that have no media.
- Set number of inodes and filesystem flags to 0 in statfs(2).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Commit 325fee1f9 (win32: change handling of trailing slashes in
stat(2)) caused stat(2) to return EINVAL in some cases when ENOENT
might have been more appropriate.
This caused the command:
rm -f dir/*
to report an error when the directory was empty, contrary to its
expected behaviour of saying nothing.
Fixes GitHub issue #155.
|
|
|
|
|
|
|
|
| |
Commit 399b1dd64 (winansi: support escape sequence to set window
title) failed to handle some invalid escape sequences correctly.
Make the code more robust.
Fixes GitHub issue #153.
|
|
|
|
|
|
|
|
|
| |
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().
|