summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
...
| * ash: stopped jobs should only prevent exit from interactive shellRon Yorston2021-09-141-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | When the user tries to exit an interactive shell with stopped jobs present the shell issues a warning and only exits if the user insists by trying to exit again. This shouldn't apply to non-interactive shells. Reported-by: Roberto A. Foglietta <roberto.foglietta@gmail.com> Signed-off-by: Ron Yorston <rmy@pobox.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * ash: fix ignoreeof optionRon Yorston2021-09-141-19/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The ignoreeof option should prevent an interactive shell from exiting on EOF. This hasn't worked in BusyBox ash since commit 727752d2d (ash: better fix for ash -c 'echo 5&' and ash -c 'sleep 5&' with testcase). Commit 3b4d04b77e (ash: input: Allow two consecutive calls to pungetc) pulled in improved support for multiple calls to pungetc from dash, thus rendering much of commit 727752d2d obsolete. Removing this old code fixes the problem with ignoreeof. function old new delta __pgetc 605 587 -18 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-18) Total: -18 bytes Signed-off-by: Ron Yorston <rmy@pobox.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * df: "support" -H as an alias of -hDenys Vlasenko2021-09-111-11/+15
| | | | | | | | | | | | | | | | | | | | function old new delta df_main 1065 1068 +3 .rodata 104232 104233 +1 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 2/0 up/down: 4/0) Total: 4 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
* | Update default configurationRon Yorston2021-09-102-2/+6
| |
* | Merge branch 'busybox' into mergeRon Yorston2021-09-1053-437/+683
|\|
| * httpd: fix config depsDenys Vlasenko2021-09-101-0/+1
| | | | | | | | Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * libbb: reuse "bad port" error message stringDenys Vlasenko2021-09-101-1/+1
| | | | | | | | | | | | | | function old new delta .rodata 104251 104232 -19 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * blkdiscard: accept -f (force) as no-opDenys Vlasenko2021-09-101-5/+8
| | | | | | | | | | | | | | function old new delta .rodata 104250 104251 +1 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * basename: implement -a and -s SUFFIXDenys Vlasenko2021-09-091-24/+38
| | | | | | | | | | | | | | | | | | | | | | function old new delta basename_main 145 207 +62 packed_usage 33914 33950 +36 .rodata 104241 104250 +9 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 3/0 up/down: 107/0) Total: 107 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * libbb: make bb_lookup_port() abort on bad port namesDenys Vlasenko2021-09-094-22/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | Also, no need to preserve errno function old new delta .rodata 104247 104241 -6 bb_lookup_port 97 83 -14 nc_main 1039 1018 -21 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 0/3 up/down: 0/-41) Total: -41 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * httpd,telnetd: make default port configurableSergey Ponomarev2021-09-093-4/+21
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | BusyBox on Termux can't use ports less than 1024 it's patched to change default port for httpd to 8080 and telnetd to 8023. https://github.com/termux/termux-packages/blob/master/packages/busybox/0011-networking-telnetd-default-port.patch https://github.com/termux/termux-packages/blob/master/packages/busybox/0010-networking-httpd-default-port.patch To avoid such patches we can make port configurable. function old new delta packed_usage 33920 33914 -6 Signed-off-by: Sergey Ponomarev <stokito@gmail.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * awk: never return NULL from awk_printf()Denys Vlasenko2021-09-091-4/+4
| | | | | | | | | | | | | | function old new delta awk_printf 651 628 -23 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * awk: code shrinkDenys Vlasenko2021-09-091-8/+7
| | | | | | | | | | | | | | function old new delta awk_printf 652 651 -1 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * awk: code shrink: avoid duplicate NUL checks and strlen()Denys Vlasenko2021-09-091-21/+33
| | | | | | | | | | | | | | function old new delta awk_printf 665 652 -13 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * awk: fix read beyond end of bufferRon Yorston2021-09-091-11/+13
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Commit 7d06d6e18 (awk: fix printf %%) can cause awk printf to read beyond the end of a strduped buffer: 2349 while (*f && *f != '%') 2350 f++; 2351 c = *++f; If the loop terminates because a NUL character is detected the character after the NUL is read. This can result in failures depending on the value of that character. function old new delta awk_printf 672 665 -7 Signed-off-by: Ron Yorston <rmy@pobox.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * ash: eval: Prevent recursive PS4 expansionDenys Vlasenko2021-09-091-1/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Date: Wed, 27 May 2020 13:19:10 +1000 eval: Prevent recursive PS4 expansion Yaroslav Halchenko <yoh@onerussian.com> wrote: > I like to (ab)use PS4 and set -x for tracing execution of scripts. > Reporting time and PID is very useful in this context. > > I am not 100% certain if bash's behavior (of actually running the command > embedded within PS4 string, probably eval'ing it) is actually POSIX > compliant, posh seems to not do that; but I think it is definitely not > desired for dash to just stall: > > - the script: > #!/bin/sh > set -x > export PS4='+ $(date +%T.%N) [$$] ' > echo "lets go" > sleep 1 > echo "done $var" > > - bash: > /tmp > bash --posix test.sh > +export 'PS4=+ $(date +%T.%N) [$$] ' > +PS4='+ $(date +%T.%N) [$$] ' > + 09:15:48.982296333 [2764323] echo 'lets go' > lets go > + 09:15:48.987829613 [2764323] sleep 1 > + 09:15:49.994485037 [2764323] echo 'done ' > done > ... > - dash: (stalls it set -x) > /tmp > dash test.sh > +export PS4=+ $(date +%T.%N) [$$] > ^C^C This patch fixes the infinite loop caused by repeated expansions of PS4. Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * ash: parser: Get rid of PEOADenys Vlasenko2021-09-081-131/+108
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Upstream commit: Date: Wed, 27 May 2020 12:19:13 +1000 parser: Get rid of PEOA PEOA is a special character used to mark an alias as being finished so that we don't enter an infinite loop with nested aliases. It complicates the parser because we have to ensure that it is skipped where necessary and not copied to the resulting token text. This patch removes it and instead delays the marking of aliases until the second pgetc. This has the same effect as the current PEOA code while keeping the complexities within the input code. This adds ~32 bytes of global data: function old new delta __pgetc - 512 +512 freestrings - 95 +95 popfile 86 110 +24 pushstring 141 160 +19 basepf 76 84 +8 syntax_index_table 258 257 -1 S_I_T 30 28 -2 .rodata 104255 104247 -8 pgetc_without_PEOA 13 - -13 xxreadtoken 230 215 -15 popstring 158 120 -38 readtoken1 3110 3045 -65 pgetc 547 22 -525 ------------------------------------------------------------------------------ (add/remove: 2/1 grow/shrink: 3/7 up/down: 658/-667) Total: -9 bytes text data bss dec hex filename 1043102 559 5020 1048681 100069 busybox_old 1043085 559 5052 1048696 100078 busybox_unstripped Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * ash: parser: Fix alias expansion after heredoc or newlinesDenys Vlasenko2021-09-085-2/+31
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Upstream commit: Date: Wed, 29 Apr 2020 00:19:59 +1000 parser: Fix alias expansion after heredoc or newlines This script should print OK: alias a="case x in " b=x a b) echo BAD;; esac alias BEGIN={ END=} BEGIN cat <<- EOF > /dev/null $(:) EOF END : <<- EOF && $(:) EOF BEGIN echo OK END However, because the value of checkkwd is either zeroed when it shouldn't, or isn't zeroed when it should, dash currently gets it wrong in every case. This patch fixes it by saving checkkwd and zeroing it where needed. function old new delta readtoken 157 176 +19 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * ash: use pgetc_eatbnl() in more places, take 3Denys Vlasenko2021-09-081-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Adding previously skipped "readtoken1(pgetc_eatbnl(), syntax_type..." change from upstream commit: Date: Thu Mar 8 08:37:11 2018 +0100 parser: use pgetc_eatbnl() in more places dash has a pgetc_eatbnl function in parser.c which skips any backslash-newline combinations. It's not used everywhere it could be. There is also some duplicated backslash-newline handling elsewhere in parser.c. Replace most of the calls to pgetc() with calls to pgetc_eatbnl() and remove the duplicated backslash-newline handling. Testcase: PS1='\ :::' should result in ::: prompt, not <newline>::: prompt Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * ash: parser: Save and restore heredoclist in expandstrDenys Vlasenko2021-09-081-8/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Upstream commit: Date: Sun, 17 May 2020 23:36:25 +1000 parser: Save and restore heredoclist in expandstr On Sun, May 17, 2020 at 01:19:28PM +0100, Harald van Dijk wrote: > This still does not restore the state completely. It does not clean up any > pending heredocs. I see: > > $ PS1='$(<<EOF "' > src/dash: 1: Syntax error: Unterminated quoted string > $(<<EOF ": > > > > That is, after entering the ':' command, the shell is still trying to read > the heredoc from the prompt. This patch saves and restores the heredoclist in expandstr. It also removes a bunch of unnecessary volatiles as those variables are only referenced in case of a longjmp other than one started by a signal like SIGINT. function old new delta expandstr 268 255 -13 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * ash: parser: Fix handling of empty aliasesDenys Vlasenko2021-09-081-21/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Upstream commit: Date: Tue, 28 Apr 2020 01:15:26 +1000 parser: Fix handling of empty aliases Dash was incorrectly handling empty aliases. When attempting to use an empty alias with nothing else, I'm (incorrectly) prompted for more input: ``` $ alias empty='' $ empty > ``` Other shells (e.g., bash, yash) correctly handle the lone, empty alias as an empty command: ``` $ alias empty='' $ empty $ ``` The problem here is that we incorrectly enter the loop eating TNLs in readtoken(). This patch fixes it by setting checkkwd correctly. function old new delta list 351 355 +4 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * shuf: add a TODO, code shrinkDenys Vlasenko2021-09-071-10/+14
| | | | | | | | | | | | | | function old new delta shuf_main 501 500 -1 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * hush: fix var_LINENO3.tests failureDenys Vlasenko2021-09-071-2/+8
| | | | | | | | | | | | | | | | | | | | function old new delta parse_and_run_string 40 62 +22 i_getch 105 102 -3 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 1/1 up/down: 22/-3) Total: 19 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * shell/ash_test/run-all: unset locale/language variablesDenys Vlasenko2021-09-071-1/+10
| | | | | | | | Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * ash: LINENO starts from 0 in -c SCRIPT modeDenys Vlasenko2021-09-0717-41/+49
| | | | | | | | | | | | The var_LINENO3.tests fails for hush: it does start from 0, but does not increment. Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * ash: fix LINENO in functionsDenys Vlasenko2021-09-075-12/+28
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | From larger patch by Roberto A. Foglietta <roberto.foglietta@gmail.com> function old new delta evalfun 348 369 +21 ash_main 1202 1218 +16 setinputstring 65 73 +8 lookupvar 116 106 -10 evaltree 772 753 -19 evalsubshell 192 173 -19 evalfor 175 156 -19 evalcase 273 254 -19 evalcommand 1560 1536 -24 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 3/6 up/down: 45/-110) Total: -65 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * ash: support testsuite for !FEATURE_SUID_CONFIG_QUIET configsDenys Vlasenko2021-09-071-1/+2
| | | | | | | | Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * hush: fix set -n to act immediately, not just after run_list()Denys Vlasenko2021-09-076-3/+21
| | | | | | | | Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * ash: eval: Do not cache value of eflag in evaltreeDenys Vlasenko2021-09-073-8/+16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Upsteam commit: Date: Mon, 17 May 2021 15:19:23 +0800 eval: Do not cache value of eflag in evaltree Patrick BrĂ¼nn <P.Bruenn@beckhoff.com> wrote: > Since we are migrating to Debian bullseye, we discovered a new behavior > with our scripts, which look like this: >>cleanup() { >> set +e >> rmdir "" >>} >>set -eu >>trap 'cleanup' EXIT INT TERM >>echo 'Hello world!' > > With old dash v0.5.10.2 this script would return 0 as we expected it. > But since commit 62cf6955f8abe875752d7163f6f3adbc7e49ebae it returns > the last exit code of our cleanup function. ... Thanks for the report. This is actually a fairly old bug with set -e that's just been exposed by the exit status change. What's really happening is that cleanup itself is triggering a set -e exit incorrectly because evaltree cached the value of eflag prior to the function call. Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * ash: eval: Check nflag in evaltree instead of cmdloopDenys Vlasenko2021-09-073-1/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | Upstream commit: Date: Thu, 4 Jun 2020 21:53:55 +1000 eval: Check nflag in evaltree instead of cmdloop This patch moves the nflag check from cmdloop into evaltree. This is so that nflag will be in force even if we enter the shell via a path other than cmdloop, e.g., through sh -c. Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * ash: add bash-like ERR trap and set -ERoberto A. Foglietta2021-09-071-17/+69
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | While at it, stop incrementing LINENO inside traps function old new delta evaltree 567 762 +195 evalfun 268 348 +80 trapcmd 286 333 +47 dotrap 129 157 +28 exitshell 120 139 +19 readtoken1 3096 3110 +14 nlprompt 25 39 +14 nlnoprompt 19 33 +14 .rodata 104245 104255 +10 forkchild 610 617 +7 optletters_optnames 64 68 +4 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 11/0 up/down: 432/0) Total: 432 bytes Signed-off-by: Roberto A. Foglietta <roberto.foglietta@gmail.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * chat: hopefully fix infinite spinning on input EOFDenys Vlasenko2021-09-061-30/+34
| | | | | | | | | | | | | | function old new delta chat_main 1295 1303 +8 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * awk: fix printf %%Daniel Thau2021-09-053-1/+19
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | A refactor of the awk printf code in e2e3802987266c98df0efdf40ad5da4b07df0113 appears to have broken the printf interpretation of two percent signs, which normally outputs only one percent sign. The patch below brings busybox awk printf behavior back into alignment with the pre-e2e380 behavior, the busybox printf util, and other common (awk and non-awk) printf implementations. function old new delta awk_printf 626 672 +46 Signed-off-by: Daniel Thau <danthau at bedrocklinux.org> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * shuf: make -i 99999999990-100000000000 work even on 32 bitsDenys Vlasenko2021-09-041-26/+19
| | | | | | | | | | | | | | | | | | | | function old new delta shuf_main 443 501 +58 .rodata 104238 104245 +7 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 2/0 up/down: 65/0) Total: 65 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * udhcp: add comments, no code changesDenys Vlasenko2021-09-041-7/+24
| | | | | | | | Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * examples/var_service/fw/run: allow extif's to be more than one ifaceDenys Vlasenko2021-09-021-8/+12
| | | | | | | | Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * ash: regressions in process substitutionRon Yorston2021-09-021-3/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Stacy Harper reports that this script: test() { . /tmp/bb_test; } echo "export TEST=foo" >/tmp/bb_test test 2>/dev/null echo "$TEST" correctly prints 'foo' in BusyBox 1.33 but hangs in 1.34. Bisection suggested the problem was caused by commit a1b0d3856 (ash: add process substitution in bash-compatibility mode). Removing the call to unwindredir() in cmdloop() introduced in that commit makes the script work again. Additionally, these examples of process substitution: while true; do cat <(echo hi); done f() { while true; do cat <(echo hi); done } f result in running out of file descriptors. This is a regression from v5 of the process substitution patch caused by changes to evalcommand() not being transferred to v6. function old new delta static.pushredir - 99 +99 evalcommand 1729 1750 +21 exitreset 69 86 +17 cmdloop 372 365 -7 unwindredir 28 - -28 pushredir 112 - -112 ------------------------------------------------------------------------------ (add/remove: 1/2 grow/shrink: 2/1 up/down: 137/-147) Total: -10 bytes Signed-off-by: Ron Yorston <rmy@pobox.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * dhcprelay: change two more variables to unsignedDenys Vlasenko2021-09-021-1/+1
| | | | | | | | Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * udhcp: clarify aspects of relay operation, add TODOs and FIXMEs, tweak --helpDenys Vlasenko2021-09-022-22/+46
| | | | | | | | | | | | | | | | | | | | function old new delta packed_usage 33891 33920 +29 dhcprelay_main 943 926 -17 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 1/1 up/down: 29/-17) Total: 12 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * udhcpd: check config file for bad IP ranges (start > end)Denys Vlasenko2021-09-021-4/+6
| | | | | | | | | | | | | | | | | | | | function old new delta .rodata 104209 104238 +29 read_config 208 225 +17 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 2/0 up/down: 46/0) Total: 46 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| * udhcpd: update --help to include -a MSECDenys Vlasenko2021-09-021-6/+12
| | | | | | | | | | | | | | function old new delta packed_usage 33886 33891 +5 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
* | ash: code shrink ps_cmdRon Yorston2021-09-081-6/+12
| | | | | | | | | | | | | | The ps_cmd member of struct procstat isn't used in the WIN32 port. Remove references to it. Saves 80 bytes.
* | ash: code shrinkRon Yorston2021-09-051-10/+6
| | | | | | | | | | | | Tweak the code to handle /etc/profile. Looks tidier and saves 8 bytes.
* | ash: restrict valid job idsRon Yorston2021-09-051-0/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | Although job control is disabled in busybox-w32 getjob() is still compiled in because it's used by waitcmd(). Job ids of the form '%string' or '%?string' don't work, though, because the command isn't stored in the job structure. Disable the code to handle them. Job ids '%%', '%+', '%-' and '%num' are still allowed and some of them are (successfully) used in the ash tests. Saves 144 bytes.
* | ash: omit handling of stopped jobsRon Yorston2021-09-051-1/+10
| | | | | | | | | | | | | | Since Windows doesn't really know about stopped jobs don't bother to compile some code that deals with them. Saves 120 bytes.
* | libbb: code shrink u_signal_names.cRon Yorston2021-09-031-1/+10
| | | | | | | | | | | | Reduce amount of wasted space in the signals[][] array. Saves 48 bytes.
* | win32: use inet_pton() from muslRon Yorston2021-09-031-183/+75
| | | | | | | | Saves 88 bytes.
* | win32: fix entropy collection for isaacRon Yorston2021-09-021-20/+10
| | | | | | | | | | | | | | | | | | The condition to detect the end of the environment string was wrong. Don't bother calculating the MD5SUM of the environment, just XOR the bytes into the data. This reduces bloat by 320 bytes but only in the non-default case.
* | config: turn off DEBUG in default buildsRon Yorston2021-08-312-2/+2
| |
* | vi: add fileformats optionRon Yorston2021-08-303-17/+119
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Add a limited version of the 'fileformats' option. Only the 'dos,unix' and 'unix,dos' settings are allowed with the former as default. When a file is read for editing its format is detected. If it only has LF line endings it's treated as being of type 'unix' otherwise its type is 'dos'. When an empty edit buffer is created it's given the first file type listed in 'fileformats'. The file type is stored in the read-only option 'fileformat' and is used to select the appropriate line endings when the file is written. See GitHub issue #220. Adds 168 bytes to the binary.