aboutsummaryrefslogtreecommitdiff
path: root/miscutils (follow)
Commit message (Collapse)AuthorAgeFilesLines
* Merge branch 'busybox' into mergemergeRon Yorston7 days1-1/+9
|\
| * *: use safe_waitpid() or wait_any_nohang() where approppriateDenys Vlasenko2025-07-301-3/+7
| | | | | | | | | | | | | | | | | | | | | | function old new delta crond_main 1227 1237 +10 init_main 804 794 -10 wait_one 263 252 -11 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 1/2 up/down: 10/-21) Total: -11 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * crond: reap orphaned grandchildren to prevent zombie buildupValentin Lab2025-07-301-0/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If a cron job launches a background task, e.g. `sh -c "sleep 5 &"`, the shell exits immediately and the `sleep` process is re-parented to PID 1. When BusyBox `crond` itself happens to be PID 1 (common in a minimal container), those orphans become direct children of `crond`. Because `crond` only calls waitpid() for the PIDs it explicitly tracks, these processes remain forever in Z state and the container slowly fills with zombies. Add a small `while (waitpid(-1, NULL, WNOHANG) > 0)` sweep at the end of check_completions() so any stray children are reaped. When `crond` is not PID 1 the loop returns -ECHILD immediately, so behaviour and overhead on a normal system are unchanged. Size impact: +12 bytes on x86-64 (gcc 13.3.0 -Os, static) Signed-off-by: Valentin Lab <valentin.lab@kalysto.org> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
* | Merge branch 'busybox' into mergeRon Yorston10 days1-1/+1
|\|
| * libbb: crypt_make_pw_salt(): fix yescrypt's random salt last charDenys Vlasenko2025-07-191-1/+1
| | | | | | | | | | | | | | function old new delta crypt_make_pw_salt 128 146 +18 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
* | Merge branch 'busybox' into mergeRon Yorston12 days1-1/+1
|\|
| * shell: fix race between signal handlers setting bb_got_signal and poll()Denys Vlasenko2025-07-021-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | function old new delta __ppoll_time64 - 211 +211 check_got_signal_and_poll - 164 +164 read_key 607 601 -6 shell_builtin_read 1328 1318 -10 ------------------------------------------------------------------------------ (add/remove: 4/0 grow/shrink: 0/2 up/down: 375/-16) Total: 359 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
* | Merge branch 'busybox' into mergeRon Yorston2025-05-192-2/+2
|\|
| * libbb/archival: make setup_unzip_on_fd() return bytes read if not compressedDenys Vlasenko2025-04-202-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | setup_unzip_on_fd() does not return the transformer structure, so the user does not know how much to seek back (or alternatively what the signature was) when compressor signature is not detected. Currently not needed (the only user is tar which dies anyway). However, rpm2cpio may need this if we extend it to extract the internal .cpio even if cpio's compressions algo is not known. function old new delta setup_unzip_on_fd 53 59 +6 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
* | make: fix detection of target rule with inline commandRon Yorston2025-01-221-2/+16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Commit f9d10b2b6 (make: fix detection of target rules (take 2)) added code to handle the case where a target rule had an inline command with a ';' separator in a macro. This required all macros on the line to be expanded, including those in the inline command. The ';' should first be searched for in the original line (without any macro expansion) and only if that fails should macros be expanded. This matches the behaviour of GNU and Unix V7 make. BSD and Schily make don't handle the case where the ';' is in a macro. (pdpmake GitHub issue 73)
* | make: fix single-suffix inference rule regressionRon Yorston2025-01-211-3/+14
| | | | | | | | | | | | | | | | | | | | | | | | Commit 85bbce87d (make: support GNU/BSD suffixes and inference rules) added code to handle inference rules with arbitrary suffixes. Unfortunately it failed to check for a single-suffix rule in the case where no known suffix was found. Add the necessary code and a test which would have caught the problem. Adds 48 bytes. (pdpmake GitHub issue 72)
* | make: phony targets and double colon rulesRon Yorston2025-01-161-7/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Commit 770bad1fe (make: disallow inference rules for phony targets) added the GNU/BSD make feature that inference rules aren't used for phony targets. Normally a double-colon rule without associated commands causes an inference rule search. If the target of the double-colon rule was phony no search was carried out and the rule failed. As a result of this perl failed to build (on Linux, I didn't try on Windows). When a double-colon rule has no commands and a phony target the prerequisites should be built and the rule should succeed. Adds 32 bytes. (pdpmake GitHub issue #70)
* | make: minor tweaksRon Yorston2025-01-161-32/+37
| | | | | | | | | | | | | | | | | | | | | | Move the code to remove the suffix from a target into a separate function. There's no need to test for non-NULL 'makefile' in newcmd(). Cosmetic changes. Saves 0-16 bytes.
* | make: support GNU/BSD suffixes and inference rulesRon Yorston2025-01-141-70/+193
| | | | | | | | | | | | | | | | | | | | | | | | | | | | The specification of inference rules in POSIX implies that only suffixes starting with a period and containing no other periods are to be considered. In contrast, both GNU and BSD make allow suffixes to contain an arbitrary number of periods, or none at all. Allow this as an extension. Adds 640-816 bytes. (pdpmake GitHub issue 70)
* | make: .WAIT shoudn't have prerequisitesRon Yorston2024-10-231-1/+1
| | | | | | | | | | | | Commit f0dea6674 (make: enforce restrictions on prerequisites/ commands) set the flags for .WAIT incorrectly: in POSIX mode it shouldn't have prerequisites.
* | make: enforce restrictions on prerequisites/commandsRon Yorston2024-10-201-9/+45
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | POSIX mentions some restrictions on whether rules may or may not have prerequisites or commands: - most special targets shouldn't have commnds; - inference/.DEFAULT rules shouldn't have prerequisites. Enforce these restrictions in POSIX mode. Generally, implementations are happy to accept prerequisites or commands even if they're subsequently ignored. Allow this as an extension. Adds 216-256 bytes.
* | make: changes to .DEFAULT/inference rulesRon Yorston2024-10-201-7/+18
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The POSIX standard allows inference rules to be redefined but not the .DEFAULT rule. There is no explicit exception for .DEFAULT to: Only one target rule for any given target can contain commands. Treat redefinition of a .DEFAULT rule as an error in POSIX mode but allow it as an extension. Also, the code didn't allow an inference rule with dependencies to redefine an existing inference rule. This is no longer the case. Adds 64-96 bytes.
* | make: fix test for empty command in inference ruleRon Yorston2024-10-201-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | Commit e90345c10 (make: allow empty commands) changed how empty commands are handled. This broke the POSIX mode test for inference rules of the form: rule: ; Adjust the setting of 'semicolon_cmd' to the new reality. Adds 16-32 bytes.
* | make: relax definition of comment lineRon Yorston2024-10-181-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | According to POSIX: Blank lines, empty lines, and lines with <number-sign> ('#') as the first character on the line are also known as comment lines. Most implementations also include lines where the first non-blank character is '#'. Allow this as an extension. Adds 0-16 bytes.
* | make: improve chaining of implicit rulesRon Yorston2024-10-171-3/+19
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Running 'make thing.z' with the following makefile: .SUFFIXES: .x .y .z .x.y: cp $< $@ .y.x: cp $< $@ .y.z: cp $< $@ resulted in infinite recursion and a segfault. Follow GNU make and don't allow any implicit rule to appear more than once in a chain. Adds 16-32 bytes.
* | make: look for PDPmakefileRon Yorston2024-10-171-10/+9
| | | | | | | | | | | | | | | | As an extension have pdpmake look for the file 'PDPmakefile' before 'makefile' and 'Makefile'. This is similar to how GNU make first checks for 'GNUmakefile'. Adds 32-40 bytes.
* | make: fix error reporting for included filesFRP-5467-g9376eebd8Ron Yorston2024-09-151-5/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | The global variables 'makefile' and 'lineno' weren't properly reset after a recursive call to input(). As a result error messages for included files could refer to the wrong file or line number. Restore 'makefile' and 'lineno' immediately after a rescursive call to input(). This also requires a different fix for commit b21546ddb (make: fix test for include with no pathnames). Adds 16 bytes in the 32-bit build.
* | make: fix test for include with no pathnamesRon Yorston2024-09-141-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In POSIX 2024 the behaviour of an include line with no pathnames is unspecified. The test for this condition was incorrect in certain circumstances. Files containing dependencies may be generated by the compiler and included in the makefile. On an initial build no dependency files will be present and the include line is made to ignore errors. In this case the test for no pathnames returned true, even though many pathnames may have been present. Fix the problem by always setting 'makefile' even if the named file can't be opened.
* | make: handling of leading whitespace in makefilesRon Yorston2024-09-101-14/+16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Try to match how different makes handle leading whitespace in makefiles. (Tested with GNU, BSD, Schily and UNIX Version 7 make.) - Commands in rules must start with a tab. It's the law. - BSD make doesn't allow any whitespace at the start of an include line. Enforce this restriction in POSIX mode: 'the word include ... appears at the beginning of a line'. As an extension allow arbitrary tabs or spaces. - All implementations allow a space as the first character of a macro definition or rule. Permit this in all cases. - Only GNU make allows a tab as the first character of a macro definition, but POSIX 2024 seems to permit it too: 'string1 is defined as all characters from the first non-<blank> character to the last non-<blank> character, inclusive'. Allow this in POSIX 2024 mode and as an extension. - No implementation allows a tab as the first character of a rule. Disallow this in all cases. Adds 32-64 bytes. (pdpmake GitHub issue 63)
* | make: reinstate conditional skipping of command linesRon Yorston2024-09-101-11/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Commit e90345c10 (make: allow empty commands) rearranged readline() in a way that broke the use of conditionals within the definition of a rule. Add a test case to detect this. Adjust readline() so that conditionals are processed before returning command lines or checking for empty lines and comments. Remove the test for a leading tab in skip_lines(). This allows conditionals in the definition of a rule to be indented with a leading tab.
* | make: duplicate makefile name recorded with commandRon Yorston2024-08-221-3/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Commit f3f72ac1d (make: show location of errors during build) stored a pointer to the name of the makefile with each command, for use in diagnostic messages. While this is fine for makefiles defined on the command line, the names of included files will have been freed before they can be used. Always take a copy of the makefile name stored with commands. Adds 32-48 bytes. (GitHub issue #449)
* | win32: use 64-bit time on 32-bit platformsRon Yorston2024-08-141-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | To avoid problems with dates in 2038 and beyond use 64-bit time values on 32-bit platforms. - Mostly this just requires a few preprocessor macros to choose the appropriate functions, structs and typedefs. - We have our own implementations of nanosleep(), clock_gettime() and clock_settime(). Omit the Windows include file that declares them. - Apply the hack for struct timeval in the 'ts' applet on 32-bit. Adds 1624 bytes on 32-bit, none on 64-bit. (GitHub issue #446)
* | make: disallow inference rules for phony targetsRon Yorston2024-08-101-5/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | GNU make doesn't allow inference rules or the .DEFAULT target to be used for phony targets. POSIX is unclear on the matter but there doesn't seem to be an explicit prohibition of inference rules or .DEFAULT. Follow the GNU make behaviour as a non-POSIX extension. Adds 48-80 bytes. (pdpmake GitHub issue 56)
* | make: allow empty commandsRon Yorston2024-08-081-10/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | pdpmake didn't allow rules to have empty commands. There are circumstances where this may be useful. Make the following changes: - Add a flag to readline() to indicate the next line is expected to be a command. If this flag is true and the input line starts with a tab return it immediately, thus skipping the check for an empty line or comment line. - In docmds() skip tabs and spaces after a command prefix. If the resulting command is empty don't print it or try to execute it. - In newcmd() allow empty commands. Adds 48-96 bytes. (pdpmake GitHub issue 56)
* | drop: use correct option when cmd.exe is used as shellRon Yorston2024-08-081-0/+2
| | | | | | | | | | | | | | | | | | | | Use the '/c' option to pass a command to cmd.exe. This is similar to what was previously done for 'su': commit e5244175b (su: use correct option when cmd.exe is used as shell). Adds 48-64 bytes. (GitHub issue #438)
* | drop: allow an alternative shell to be selectedRon Yorston2024-08-051-7/+16
| | | | | | | | | | | | | | | | | | | | Add the '-s' option to allow an alternative shell to be given. No PATH search is performed for the shell, so an absolute or relative path to a suitable executable must be provided. Adds 80-96 bytes. (GitHub issue #438)
* | make: allow pragmas to apply recursivelyRon Yorston2024-07-121-14/+55
| | | | | | | | | | | | | | | | | | | | | | | | | | Pragmas set when pdpmake is run are exported to the environment variable PDPMAKE_PRAGMAS as a space-separated list of pragma names. This environment variable is read when pdpmake starts and any pragmas it contains are applied. Thus pragmas are passed to recursive invocations of pdpmake. PDPMAKE_PRAGMAS can also be set by the user. Adds 240-288 bytes.
* | ash: read profile script relative to binaryRon Yorston2024-07-081-3/+2
| | | | | | | | | | | | | | As well as trying to read '/etc/profile' also look for the script 'etc/profile' relative to the location of the running binary. Adds 64-96 bytes.
* | Merge branch 'busybox' into mergeRon Yorston2024-06-231-1/+1
|\|
| * crond: log5 fix typo, replace log level '4' with '5'Jones Syue2024-03-021-1/+1
| | | | | | | | | | | | | | | | | | | | | | log5() with crondlog(5, msg, va) seems making logging more consistent. function old new delta ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 0/0 up/down: 0/0) Total: 0 bytes Signed-off-by: Jones Syue <jonessyue@qnap.com> Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
* | make: update default rulesRon Yorston2024-06-161-14/+49
| | | | | | | | | | | | | | | | | | | | | | | | | | The default rules were changed in the 2024 standard: - Fortran is no longer supported - The CC macro is set to 'c17' instead of 'c99' In addition to these changes, CC is set to 'cc' as a non-POSIX extension: on my system, at least, there isn't a 'c17' compiler. Adds 208-224 bytes.
* | make: update for POSIX 2024Ron Yorston2024-06-141-13/+17
| | | | | | | | | | | | | | | | | | | | | | | | Now that POSIX.1-2024 has been released we can replace all references to the 202X draft standard with 2024. Make this change throughout the code and testsuite. The pragma 'posix_2024' has been added. 'posix_202x' remains as an alias for the same. The 2024 standard is enforced by default in POSIX mode.
* | make: limit changes to pragmasRon Yorston2024-06-101-5/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The special target .PRAGMA could be used to set or reset pragmas. Doing anything other than setting pragmas very early in execution is likely to be problematic. Limit the abilities of .PRAGMA: - Specifying .PRAGMA with no prerequisites now does nothing: pragmas are not reset. - The posix_2017 and posix_202x pragmas can only be used to change the enforced POSIX level from the default. Any further attempt to change POSIX level results in a warning. Adds 16-32 bytes.
* | make: allow := macro assignment on command lineRon Yorston2024-06-081-14/+22
| | | | | | | | | | | | | | | | | | Only the forms of macro assignment required by POSIX were allowed on the command line. Add support for the non-POSIX := form too. Adds 16-24 bytes.
* | make: more changes for c:/path targetRon Yorston2024-06-051-4/+5
| | | | | | | | | | | | | | | | | | | | The previous commit failed to change an instance of find_char() to find_colon(). It isn't necessary to use find_char() to replace find_colon() in the non-Windows case: strchr(3) is sufficient. Adds 16-48 bytes.
* | make: restore check for c:/path targetRon Yorston2024-06-051-1/+23
| | | | | | | | | | | | | | | | | | | | Commit f9d10b2b6 (make: fix detection of target rules (take 2)) failed to include the function find_colon() which is used to skip targets of the form c:/path when checking for a target rule. Restore the function so Windows paths can be used as targets. Adds 48 bytes.
* | make: explicitly verify order of argumentsRon Yorston2024-06-041-7/+16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | POSIX requires macro assignments to precede targets on the command line. This requirement has been relaxed as a non-POSIX extension. Verify the constraint has been applied in POSIX mode. This ensures that the command: make --posix target A=1 fails before it tries to update the target. It also catches the case where POSIX mode had not been set with the --posix option or PDPMAKE_POSIXLY_CORRECT environment but was then set by the .POSIX special target in the makefile. In this case the command line was scanned for macro assignments without enforcing POSIX mode while targets were processed with POSIX mode enabled. Adds 96 bytes.
* | make: only reset getopt(3) if necessaryRon Yorston2024-06-031-2/+2
| | | | | | | | Only invoke GETOPT_RESET() if getopt(3) has actually been called.
* | make: ensure sufficient space in line bufferRon Yorston2024-06-021-7/+8
| | | | | | | | | | | | | | | | | | | | | | When using fgets(3) to read a line into a buffer it's necessary to ensure at least two characters are available in the buffer. Otherwise the read fails. (At least, it did when pdpmake was built using MSYS2 on Windows.) Adds 16 bytes to the 32-bit build. (GitHub pdpmake issue 44)
* | make: report POSIX 202X issue with includeRon Yorston2024-06-021-6/+12
| | | | | | | | | | | | | | | | | | | | | | Synchronising with upstream pdpmake showed that a test was missing from the BusyBox port. POSIX 202X doesn't specify what should happen if an include statement has no arguments. When the POSIX 202X standard is being enforced this is reported as an error. Adds 32 bytes.
* | make: restore warning about invalid macro nameRon Yorston2024-06-021-7/+9
| | | | | | | | | | | | | | | | | | | | | | | | Commit 90c5352a9 (make: change how macros are read from the environment) was intended to ignore environment variables with invalid names. It had the unintended consequence of also ignoring macros with invalid names defined in makefiles. This was because such macros can have the same level (3) as those imported from the environment. Rather than use the level to detect importing from the environment add a flag to indicate this circumstance.
* | make: fix detection of target rules (take 2)Ron Yorston2024-05-311-184/+154
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Commit d6b764116 (make: fix detection of target rules) checked for target rules before macro assignments. This failed for some Makefiles generated by autotools because partially defined macros were expanded while testing for a target rule. Revert to checking for macro assignments first, but try to detect if the proposed left hand side of the assignment might form part of a target rule with an inline command. Also handle the case where the ';' separator of the inline command has been obfuscated by putting it in a macro. Saves 128-160 bytes. (GitHub pdpmake issues 31, 44)
* | make: allow :::= macro assignment on command lineRon Yorston2024-05-291-16/+28
| | | | | | | | | | | | | | | | | | | | | | | | GNU make and bmake have different implementations for := macro assignment. In POSIX 202X these are supported by the forms ::= and :::= respectively. Only the former was supported on the pdpmake command line. Add the required support in process_macros() and update the usage message. Adds 48-64 bytes.
* | make: fixes to -q optionRon Yorston2024-05-281-36/+36
| | | | | | | | | | | | | | | | | | | | | | | | The -q option returns an exit status to indicate if targets are up-to-date (0) or in need of updating (1) but without updating them. As an exception (imported from GNU make) build commands with a '+' prefix are executed. pdpmake didn't implement the exception. Doing so required moving handling of the -q option down into docmds(). Saves 48 bytes.
* | make: fixes to -t optionRon Yorston2024-05-281-33/+34
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The -t option (in general) causes targets to be touched instead of having build commands run to create them. There were two problems. The flag variable 'ssilent' in docmds was too small (uint8_t) to contain the value of 'dotouch' (uint32_t). Truncation of the value resulted in build commands being echoed when they shouldn't have been. The POSIX specification is unclear as to how build commands with a '+' prefix interact with touch. The rationale indicates that this feature was imported from GNU make, so the behaviour has been made to match what it does: if a '+' build command is run the target is not touched. The code has been rearranged to move the call to touch() up into docmds(). Adds 48 bytes.