Commit Graph

4113 Commits

Author SHA1 Message Date
uwe 21531a4577 ksh(1): fix pasto in the description of the -l option. 2022-08-21 20:12:37 +00:00
kre 16e67595a2 Improve the description of the read builtin command. 2022-08-19 13:37:03 +00:00
kre a1f6605654 Don't output the error for bad usage (no var name given)
after already writing the prompt (set with the -p option).

That results in nonsense like:

	$ read -p foo
	fooread: arg count

While here, improve the error message so it means something.

Now we will get:

$ read -p foo
read: variable name required
Usage: read [-r] [-p prompt] var...

[Detected by code reading while doing the work for the previous fix]
2022-08-19 12:52:31 +00:00
kre 143e8d551e PR bin/56972 Fix escape ('\') handling in sh read builtin.
In 1.35 (March 2005) (the big read fixup), most escape handling and IFS
processing in the read builtin was corrected.  However 2 cases were missed,
one is a word (something to be assigned to any variable but the last) in
which every character is escaped (the code was relying on a non-escaped char
to set the "in a word" status), and second trailing IFS whitespace at
the end of the line was being deleted, even if the chars had been escaped
(the escape chars are no longer present).

See the PR for more details (including the case that detected the problem).

After fixing this, I looked at the FreeBSD code (normally might do it
before, but these fixes were trivial) to check their implementation.
Their code does similar things to ours now does, but in a completely
different way, their read builtin is more complex than ours needs to
be (they handle more options).   For anyone tempted to simply incorporate
their code, note that it relies upon infrastructure changes elsewhere
in the shell, so would not be a simple cut and drop in exercise.

This needs pullups to -3 -4 -5 -6 -7 -8 and -9 (fortunately this is
happening before -10 is branched, so will never be broken this way there).
2022-08-19 12:17:18 +00:00
nia 16c8f5ddd4 sh(1): Allow an explicit set -o vi or set -o emacs to override ~/.editrc 2022-08-18 14:10:05 +00:00
nia 635122b300 sh(1): Assign the tab completion key binding last so a user having
"bind -v" or "bind -e" in ~/.editrc doesn't cause tab completion
to no longer function.
2022-08-17 22:27:17 +00:00
wiz 1bfd10bdd7 Sync usage with man page. 2022-08-09 08:14:03 +00:00
wiz 3ce29a4c09 Sort options, fix macro, add RCS Id. 2022-08-09 08:13:56 +00:00
kre 2c3bf36b92 Add 4 new flags:
-b (from FreeBSD) - set blocksize to blocks (512 bytes)
		(overrides a contrary setting in BLOCKSIZE)
	-H (from FreeBSD and Linux): -h using SI units (powers of 10).  Ugh.
	-N suppress the header line (except with -P which requires it).
	-f show only free space (or inodes) in a minimal format (implies -N)
		(that is, with one file[system] specified, print 1 number only)
		With -c, show only the total.
		Intended to be useful for scripting (aka, I needed it.)

While here, improve the usage message (group options where they apply,
there is no reason, for example, that -g should be shown differently
to -k -m ..., and those options aren't at all useful with -G)

Update the man page to match.
2022-08-08 16:50:35 +00:00
andvar 5a58ccfbec fix various typos in comments, documentation and messages.
mainly s/paramater/parameter/ and s/reduntant/redundant/.
2022-08-07 11:06:18 +00:00
andvar ec52c87343 kill(1): s/proceses/processes/ 2022-08-07 09:36:55 +00:00
rin 2316fa6ff0 Fix bug revealed by SIGINFO support; Do not treat short read(2)/write(2)
as error (*). This occurs typically when signal is received.

(*) For older version, we already deal with short read(2) from remote
host in sink(). But for other cases, i.e., write(2) to local file in
sink(), read(2)/write(2) in source(), error was raised.

This version of rcp(1) can successfully send/receive files with older
version, even if short read(2)/write(2) occurs by SIGINFO.

Also, when real error occurs, give up immediately instead of continue to
send/receive wrong data.

Clean up the mess a little bit as well...
2022-07-18 13:01:59 +00:00
uwe e7d7b85e33 csh(1): fix punctuation at the end of an .Xr line 2022-07-09 21:19:44 +00:00
kre 8f36a40a4c Fix core dump caused by
ksh -c '(i=10; echo $((++-+++i)))'
reported by Steffen Nurpmeso (not on a NetBSD list or PR).

Seems pointless to fix just one of the bugs in this thing, but this one was
easy enough (and stupid enough).   (The "i=10" part is unimportant, as is the sub-shell).
2022-07-03 06:30:31 +00:00
rin 1ca2da5b85 Add SIGINFO support. Mostly stolen from scan_ffs(8). 2022-06-26 09:29:59 +00:00
andvar ff23aff6ad fix various typos in comments, documentation and messages. 2022-05-31 08:43:13 +00:00
andvar 86c307248f fix various typos, mainly in comments. 2022-05-28 10:36:21 +00:00
andvar b97019535c fix some misspellings and remove trailing whitespaces. 2022-05-20 07:47:16 +00:00
kre 32cc3b0248 Alter error messages so they no longer claim that bad input is illegal. 2022-05-16 10:53:14 +00:00
dholland 4a2334fa92 Clarify that "stty 0" will normally hang up the tty. Bump date. 2022-05-14 21:04:34 +00:00
uwe 0a751ce1a9 date(1): Use .Dl for one-liners. Same output is generated. 2022-05-10 09:07:57 +00:00
uwe 7638fb4e20 date(1): Fix the offset in previous. 2022-05-10 09:00:39 +00:00
wiz 8147634961 date(1): add example for how to get seconds since the Epoch output 2022-05-10 05:37:33 +00:00
kre 21f0086877 Introduce a new macro JNUM to replace the idiom jp-jobtab+1
(the job number, given jp a pointer to a jobs table entry)
used open coded previously in many places (mostly in DEBUG mode
trace messages, so not included in most shells, but there are
a few others).

Make the type of JNUM() be int rather than the ptrdiff_t the
open coded version became ... which when used in some printf()
type function arg list was cast to some other arbitrary (but not
consistent) int type for which there is a standard %Xd type
format conversion.   Now we can (and do) just use %d for this.

If the number of jobs ever exceeds the range of an int, we would
have far more serious problems than the broken output this would
cause.

While here improve a comment or two, and use JOBRUNNING instead
of 0 where the intent is the former (JOBRUNNING is #defined as 0).

NFCI.
2022-04-18 06:02:27 +00:00
andvar e2710f6fc4 fix various typos in comments. 2022-04-17 21:24:52 +00:00
kre f378cfe59e Redo the way the builtin cmd 'ulimit' getopt() (nextopt() really, but it
is essentially the same) arg string is generated, to lessen the chances
that the table of limits, and the arg string that allows limits to be
reported or set will get out of sync.   They weren't (as long as we didn't
grow an RLIMIT_SWAP) this is just tidier.

While here, reorder the limits table fields, and shrink a couple that
were needlessly wasteful, to save some space -- for most architectures
this should save 8 bytes per table entry (there are currently 13).
(Some minor code bloat offsets this slightly because of int type
promotions now required).

NFCI.
2022-04-16 14:26:26 +00:00
kre d17e063cb6 While doing the previous change, I noticed that when used in a
particularly perverse way, the error message for a bad octal
constant as the new umask value could incorrectly claim that the
-S option (which would need to be present to cause this issue)
was the detected bad value.   Fix that to report the actual
incorrect arg.

And while fiddling, also check for args to umask that are too big
to be sane mask values (the biggest permitted is 07777) and use
mode_t as the mask variable type, rather than int.
2022-04-16 14:23:36 +00:00
kre 94d6cf1cd6 Avoid generating error messages implying that user errors are illegal. 2022-04-16 14:20:45 +00:00
andvar 75d2abaeb1 fix various typos in comments and output/log messages. 2022-04-10 09:50:44 +00:00
andvar 2fa7e14158 fix various typos, mainly in comments, but also log messages, docs, game text. 2022-04-08 10:17:52 +00:00
rillig d995afa8a4 sh: fix typo in comment 2022-02-08 20:39:59 +00:00
kre f1bd294bee After (a few days short of) 21 years, revert 1.25, which did nothing except
make the -e option to "fc" fail to work (the commit message was about some
other changes entirely, so I an only assume this was committed by mistake).

It says a lot about the use of the fc command that no-one noticed that
this did not work properly for all this time.

Internally in sh, it is possible for built in commands to use either
getopt(3) (from libc) or the much simpler internal shell nextopt() routine
for option (flag) parsing.    However it makes no sense to use getopt()
and then access a global variable set only by nextopt() instead of the
one getopt() sets (which is what the code had used previously, forever).

Use the correct variable again.

XXX pullup -9 -8  (-7 -6 -5 ...)
2022-02-02 01:21:34 +00:00
kre 772973c9a5 When we initialize libedit (editline) always call ourselves "sh" no
matter what $0 is (or is not) set to.   This means that editrc(5)
lines that start "sh:" are used (in addition to those with no prefix,
which will usually be most of them), regardless of the name or manner in
which we were invoked.

OK christos@
2022-01-31 18:15:45 +00:00
kre 05e80ac3ee Add some comments explaining accesses to the environment via
getenv()/setenv()/unsetenv() which manipulate the envornoment
the shell was passed at entry.

These are a little odd in sh as that environment is copied into
the shell's internal variable data struct at shell startup, and
normally never accessed after that - in builtin commands (test.
printf, ...) getenv() is #defined to become an internal sh lookup
function instead, so even those never use the startup environment).

NFCI
2022-01-31 16:54:28 +00:00
andvar 7c674e8e6e remove double t from targeted, add missing r to arbitrary
And fix few more typos along the way in comments and man pages.
2022-01-26 11:48:53 +00:00
andvar 492c086f0a s/begining/beginning/ in comments and messages. 2022-01-24 09:14:36 +00:00
kre 3106d82cfe After 3 and a bit years, it is time... 2022-01-22 22:53:58 +00:00
christos f49d542542 update header too. 2022-01-14 23:56:35 +00:00
christos 62a484e15a The "ibm" and "oldibm" tables are identical, because POSIX just
standardised the table from V7. Nobody, including the original authors,
seems to have noticed this.  Merge them and update the documentation.
Also fix the odd, inconsistent, spelling of "pre-4.3BSD-Reno").
(From nabijaczleweli)
2022-01-14 23:55:16 +00:00
lukem e99dcc23fb sh(1): improve getopts docs for optstring leading :
getopts has different behaviour if the leading character
of optstring is `:', so describe in more detail:
- no errors are printed (already there)
- unknown options set var to `?' and OPTARG to the unknown option
- missing arguments set var to `:' and OPTARG to the option name

Slight rewording of other paragraphs for more clarity.
2022-01-07 05:30:30 +00:00
lukem c878ae3c69 sh(1): fix formatting warnings 2022-01-07 05:10:30 +00:00
kre 29a26373af Use a volative local shadow of a field in an (on-stack) non-volatile struct
that is to be referenced after a return from setjmp() via longjmp().

This doesn't ever seem to have caused a problem, but I think using
volative vars is required here.

For reasons I never bothered to discover, even though this change
certainly requires a store into stack memory which wasn't required
before, earlier measurements showed the shell getting (slightly) smaller
with this change in place.

NFCI
2022-01-05 15:25:44 +00:00
andvar 92e3dd6443 s/forground/foreground/ in comments. 2021-12-19 21:15:27 +00:00
andvar 715cc6e2dc s/backgound/background/ 2021-12-19 21:02:49 +00:00
andvar b5a5957fe8 s/Miscelaneous/Miscellaneous/ and s/slahes/slashes/ in comments. 2021-12-12 11:18:46 +00:00
andvar b444e42254 s/desireable/desirable/ in comments. 2021-12-08 20:21:09 +00:00
msaitoh 1e4f69d0ff s/existance/existence/ in comment. 2021-12-05 04:42:54 +00:00
msaitoh 22b6bc1f53 s/commmand/command/ in comment. 2021-12-05 04:35:38 +00:00
msaitoh 344f0d1e04 s/exisit/exist/ in comment. 2021-12-05 02:52:17 +00:00
simonb c115fd08c1 Set totals.f_frsize to DEV_BSIZE instead of totals.f_bsize so that
addstat() uses an initialised value for total size calculations.
Fixes core dump for "df -c".
2021-11-29 05:59:58 +00:00
kre 16d8557100 PR bin/53550
Here we go again...   One more time to redo how here docs are
processed (it has been a few years since the last time!)

This is actually a relatively minor change, mostly to timimg
(to just when things happen).   Now here docs are expanded at the
same time the "filename" word in a redirect is expanded, rather than
later when the heredoc was being sent to its process.  This actually
makes things more consistent - but does break one of the ATF tests
which was testing that we were (effectively) internally inconsistent
in this area.

Not all shells agree on the context in which redirection expansions
should happen, some make any side effects visible to the parent shell
(the majority do) others do the redirection expansions in a subshell
so any side effcts are lost.   We used to have a foot in each camp,
with the majority for everything but here docs, and the minority for
here docs.   Now we're all the way with LBJ ... (or something like that).
2021-11-22 05:17:43 +00:00
kre 9b13765f1a Improve the however-many-negatives wording even more. 2021-11-21 16:23:20 +00:00
rillig 87e5866877 sh.1: replace triple negation with single negation, fix typo 2021-11-20 17:18:31 +00:00
kre c426788907 Improve the wording of the "Argument List Processing" section (where
all the sh options, also used with "set", are listed) in response to
a discussion on icb conveyed to me by Darrin B. Jewell.
A few improvements to the description of the "set" built-in as well.

Bump Dd to cover all of this month's changes (so far).
2021-11-20 01:52:51 +00:00
rillig 4c9c11dcf9 sh.1: fix typos 2021-11-16 23:39:34 +00:00
rillig 982b8df7ec echo: fix lint error due to strict bool mode
No functional change.
2021-11-16 21:38:29 +00:00
kre b6dd340d3c Make pwd (both /bin/pwd and the /bin/sh built-in version) check for
write errors on stdout, and indicate an error if that happens.
2021-11-16 16:57:15 +00:00
kre 8ea2ac47d5 PR bin/56491
Make "hash" exit(!=0) (ie: exit(1)) if it writes an error message to
stderr as required by POSIX (it was writing "not found" errors, yet
still doing exit(0)).

Whether, when doing "hash foobar", and "foobar" is not found as a command
(not a built-in, not a function, and not found via a PATH search), that
should be considered an error differs between shells.  All of the ksh
descendant shells say "no", write no error message in this case, and
exit(0) if no other errors occur.   Other shells (essentially all) do
consider it an error, write a message to stderr, and exit(1) when this happens.

POSIX isn't clear, the bug report:
     https://austingroupbugs.net/view.php?id=1460
which is not yet resolved, suggests that the outcome will be that
this is to be unspecified.   Given the diversity, there might be no
other choice.

Have a foot in both camps - default to the "other shell" behaviour,
but add a -e option (no errors ... applies only to these "not found"
errors) to generate the ksh behaviour.   Without other errors (like an
unknown option, etc) "hash -e anyname" will always exit(0).

See the PR for details on how it all works now, or read the updated man page.

While here, when hash is in its other mode (reporting what is in the
table) check for I/O errors on stdout, and exit(1) (with an error
message!) if any occurred.   This does not apply to output generated
by the -v option when command names are given (that output is incidental).

In sh.1 document all of this.   Also add documentation for a bunch of
other options the hash command has had for years, but which were never
documented.   And while there, clean up some other sections I noticed
needed improving (either formatting or content or both).
2021-11-16 11:28:29 +00:00
kre b65a5b9068 Detect write errors to stdout, and exit(1) from some built-in
commands which (primarily) are used just to generate output
(or with a particular option combination do so).
2021-11-16 11:27:50 +00:00
kre a41dbcb01d Fix value of ${LINENO} in "for" commands.
This affects (as best I can tell) only uses of ${LINENO} in PS4
when -x is enabled (and perhaps only when the list contains no
expansions).   "for" like "case" (which was already handled) is
special in that it generates trace output before actually executing
any kind of simple command.
2021-11-16 11:25:44 +00:00
kre a18d86b7be Ensure that all of the POSIX standard utilities are correctly
identified with the -u flag (that is, I hope I identified all
the ones that were missing it).

This change is a no-op (NFC) as the -u flag does nothing.

Still, just in case we find a use for it one day, and just as a
matter of general principle, we should get this correct.
2021-11-10 18:25:52 +00:00
kre 40f303e024 With -Wall compiling this was giving:
echo.c: In function 'main':
	echo.c:74:1: warning: control reaches end of non-void function

This raises 2 issues.

First, why with WARNS set to 6, which should include just about
everything, was this not causing problems with everyday builds?
Surely falling off the end of a non-void function without returning
a specific value is one of the more basic errors that should be fixed.
(Whatever the name of the function).   Is there a missing -Wxxx option?

And second, does C99 really promise:
	Remove unnecessary call to exit(0); returning from main is equivalent
	since C99.
in the sense that simply falling out of main() is exit(0)?  Or is it
simply saying that the return value of main() is the exit status (which
has been true for much longer than since c99)?
2021-11-10 17:35:45 +00:00
kre a3710ae449 Add a couple of macro definitions for dealing with shell I/O errors.
(Macros akin to stdio's ferror() and clearerr()).

NFC: the macros are defined, but not yet used anywhere.   Uses coming soonish.
2021-11-10 15:58:38 +00:00
kre b8bee70d9c DEBUG mode changes only. NFC (NC) for any normally compiled shell.
Mostly adding DEBUG mode tracing (when appropriate verbose tracing
is enabled generally) whenever a shell (including sushell) process
exits, so shells that the tracing should indicate why ehslls that
vanish did that.

Note for future investigators: if the relevant tracing is enabled,
and a (sub-)shell still simply seems to have vanished without trace,
the likely cause is that it was killed by a signal - and of those,
the most common that occurs is SIGPIPE.
2021-11-10 15:26:34 +00:00
msaitoh f81569c702 s/writting/writing/ 2021-11-06 06:40:33 +00:00
msaitoh 763440c947 s/maxiumum/maximum/ 2021-11-06 06:38:03 +00:00
gutteridge 45137c4698 pax.1: minor grammar fixes 2021-11-06 01:19:19 +00:00
nia 56978e9154 ed(1): use reallocarr instead of realloc(x * y) 2021-11-02 08:04:20 +00:00
kre 609916a1bc PR bin/45390
Be explicit about what happens to PWD after a successful cd command.
Also be very clear  that "cd" and "cd -P" are the same thing, and
the only cd variant implemented.

Also, when it is appropriate to print the new directory after a cd
command, note that it happens if interactive (as it always has here)
and also if the posix option is set (for POSIX compat, where "interactive"
is irrelevant).  Mention that "cd -" is a case where the new directory
is printed (along with paths relative to a non-empty CDPATH entry,
and where the "cd old new" (string replacement in curdir) is used.

While here document the new -e option to cd.

XXX pullup -9
2021-10-31 02:12:08 +00:00
kre 82386044cc PR bin/45390 - fix for folly four
In the pwd builtin, verify that curdir names '.' before
simply printing it.   Never alter PWD or OLDPWD in the
pwd command.

Also while here, implement the (new: coming in POSIX, but has existed
for a while in several other shells) -e option to cd (with -e, cd -P
will exit(1) if the chdir() succeeds, but PWD cannot be discovered).

cd now prints the directory name used (if different from that given,
or cdprint is on) if interactive or (the new bit)in posix mode.

Some additional/changed comments added, and a DEBUG mode trace call
that was accidentally put inside an #if 0 block moved to where it
can do some good.

XXX pullup -9
2021-10-31 02:12:01 +00:00
andvar 56d66eb030 "no affect" -> "no effect" in man pages and comments. 2021-10-30 21:08:58 +00:00
kre 4a9058f97b Use a type-correct end marker for strstrcat() rather than NULL, as
for a function with unknown number & types of args, the compiler isn't
able to automatically convert to the correct type.   Issue pointed out
in off list e-mail by Rolland Illig ... Thanks.

The first arg (pointer to where to put length of result) is of a known
type, so doesn't have the same issue - we can keep using NULL for that
one when the length isn't needed.

Also, make sure to return a correctly null terminated null string in
the (absurd) case that there are no non-null args to strstrcat() (though
there are much better ways to generate "" on the stack).  Since there is
currently just one call in the code, and it has real string args, this
isn't an issue for now, but who knows, some day.

NFCI - if there is any real change, then it is a change that is required.

XXX pullup -9 (together with the previous changes)
2021-10-26 10:07:20 +00:00
kre 4ca0efa9b1 PR bin/56464
After almost 30 years, finally do the right thing and read $HOME/.profile
rather than .profile in the initial directory (it was that way in version
1.1 ...)   All other ash descendants seem to have fixed this long ago.

While here, copy a feature from FreeBSD which allows "set +p" (if a
shell run by a setuid process with the -p flag is privileged) to reset
the privileges.  Once done (the set +p) it cannot be undone (a later
set -p sets the 'p' flag, but that's all it does) - that just becomes a
one bit storage location.

We do this, as (also copying from FreeBSD, and because it is the right
thing to do) we don't run .profile in a privileged shell - FreeBSD run
/etc/suid_profile in that case (not a good name, it also applies to setgid
shells) but I see no real need for that, we run /etc/profile in any case,
anything that would go in /etc/suid_profile can just go in /etc/profile
instead (with suitable guards so the commands only run in priv'd shells).

One or two minor DEBUG mode changes (notably having priv'd shells identify
themselves in the DEBUG trace) and sh.1 changes with doc of the "set +p"
change, the effect that has on $PSc and a few other wording tweaks.

XXX pullup -9   (not -8, this isn't worth it for the short lifetime
that has left - if it took 28+ years for anyone to notice this, it
cannot be having all that much effect).
2021-10-26 00:05:38 +00:00
rillig 27943b9954 echo: clean up, increase WARNS to 6
Lint can handle __COPYRIGHT and __RCSID, so there is no need to hide
them anymore.

Use proper type 'bool' for nflag, ensure correct types via lint's strict
bool mode.

Remove unnecessary call to exit(0); returning from main is equivalent
since C99.

No functional change.
2021-10-10 19:07:19 +00:00
rillig 4453f5596f sh: remove useless do-while-0 loop
28 years was more than enough for the useless 'continue' statement in
this do-while-0 "loop". Without the 'continue' statement, there is no
need for the "loop" anymore. The comment at its top was confusing since
the word 'while' suggested a loop, but there was none, so remove that as
well.

Pointed out by Tom Ivar Helbekkmo on source-changes-d.

No change to the resulting binary.
2021-10-10 18:46:25 +00:00
rillig 074335e1f1 sh: remove no-op 'continue' from do-while-0 loop
With Clang, the only change to the binary are the line number changes
from __LINE__, GCC generates a bit different code.

No functional change.
2021-10-10 08:35:34 +00:00
rillig 16296115f5 sh: make find_command simpler
Lint complained about the do-while-0 loop that contained a continue. It
didn't state the reason for it, but indeed the code looked complicated.
Rewrite the code to be less verbose and to use common coding patterns.

No functional change.
2021-10-10 08:19:02 +00:00
rillig ac96e5dd30 dd: fix lint warnings about effectively discarding 'const'
args.c(153): warning: call to 'bsearch' effectively discards 'const'
    from argument [346]
args.c(383): dito
args.c(475): dito

No functional change.
2021-10-09 21:31:36 +00:00
rillig 3e5654ee02 bin: in builds with MKLINT=yes, run lint on all programs 2021-10-09 21:06:31 +00:00
rillig c59e0a480e sh: ignore lint error about 'continue' in 'do while' loop
exec.c(575): error: continue in 'do ... while (0)' loop [323]
jobs.c(203): error: continue in 'do ... while (0)' loop [323]

It is certainly a rarely used feature, I saw it the first time today and
had to look up its meaning in the C standard. But after that, I don't
see why a 'continue' statement in a 'do while' loop should be an error.
Maybe a warning since up to now I thought that 'continue' would jump
back to the top of the loop, while it really jumps to the bottom of the
loop body, for all 3 kinds of loops.
2021-10-09 21:02:53 +00:00
rillig 4cea8ecbb7 dd: clean up function summary
No functional change. Ideally the binary would have stayed the same, but
GCC 10.3.0 inserts a nop and reorders the code.
2021-10-09 20:44:55 +00:00
rillig 2dcff222a4 dd: fix lint error about 'return expr' from void function
No change to the resulting binary. The 'return' statements are necessary
for GCC to generate the exact same object code, even though they can be
removed without affecting the functionality, as seen before the 'else'.
2021-10-09 20:29:23 +00:00
christos 45fcea9556 PR/56443: RVP: dd conv=swab doesn't always work 2021-10-08 14:44:48 +00:00
christos 1b2514eee4 It is either teaching gcc about aaah or adding FALLTHROUGH. 2021-09-16 19:44:01 +00:00
christos b8d28f3621 support -Z 2021-09-16 19:43:33 +00:00
christos e79ccca6dc provide a way to reset setproctitle. 2021-09-16 19:34:21 +00:00
kre 51a7b24283 Fix an ordering error in the previous (and even earlier, going back
a way, but made more serious with the recent changes).

The n>&n operation (more or less a no-op, except it clears CLOEXEC)
should precede almost everything else - and simply be made to fail if
an attempt is made to apply it to a sh internal fd.

We were renumbering the internal fd (the n> part considered first)
which was dumb, but OK, before, but now rejecting the operation
(the >&n) part when n should not be visible to the script.  That
made something of a mess (and could lead to the shell believing its
job control tty was at a fd it never got moved to).

Do things in the correct order, and simply fail that case for internal
fds (for every other n>xxx for any xxx sh simply renumbers its internal fd
n to some other fd before attempting the operation, even n>&- ... those are
all fine).

[In all the above the '>' is used in place of any redirect operator].
2021-09-15 20:21:47 +00:00
kre c15b76c2fd Have the ulimit command watch for ulimit -n (alter number of available fds)
and keep the rest of the shell aware of any changes.

While here, modify 'ulimit -aSH' to print both the soft and hard limits
for the resources, rather than just (in this case, as H comes last) the
hard limit.   In any other case when both S and H are present, and we're
examining a limit, use the soft limit (just as if neither were given).

No change for setting limits (both are set, unless exactly one of -H
or -S is given).   However, we now check for overflow when converting
the value to be assigned, rather than just truncating the value however
it happens to work out...
2021-09-15 18:30:57 +00:00
kre 52967993c0 Improve the solution for the 2nd access to a fd which shouldn't
be available ("13") issue reported by Jan Schaumann on netbsd-users.

This fixes a bug in the earlier fix (a day or so ago) which could allow the
shell's idea of which fd range was in use by the script to get wildly
incorrect, but now also actually looks to see which fd's are in use as
renamed other user fd's during the lifetime of a redirection which needs
to be able to be undone (most redirections occur after a fork and are
permanent in the child process).   Attempting to access such a fd (as with
attempts to access a fd in use by the shell for its own purposes) is treated
as an attempt to access a closed fd (EBADF).  Attempting to reuse the fd
for some other purpose (which should be rare, even for scripts attempting
to cause problems, since the shell generally knows which fds the script
wants to use, and avoids them) will cause the renamed (renumbered) fd
to be renamed again (moved aside to some other available fd), just as
happens with the shell's private fds.

Also, when a generic fd is required, don't give up because of EMFILE
or similar unless there are no available fds at all (we might prefer >10
or bigger, but if there are none there, use anything).  This avoids
redirection errors when ulimit -n has been set small, and all the fds >10
that are available have been used, but we need somewhere to park the old
user of a fd while we reuse that fd for the redirection.
2021-09-15 18:29:45 +00:00
christos a83514c691 Don't assign v to newvar, so we can still access the original length. 2021-09-15 13:16:57 +00:00
christos bd3ed7c8b3 reflect reality on flags. 2021-09-14 22:14:11 +00:00
christos 9dc307c463 use emalloc and friends, add ktrace flag printing. 2021-09-14 22:01:17 +00:00
christos c879b655cb Provide symbolic printing of some keywords by capitalizing them. 2021-09-14 17:09:18 +00:00
christos 8298e812fc Quote the filenames like before 2021-09-14 15:04:09 +00:00
kre c88e74eff8 Deal with some issues where fds intended only for internal use
by the shell were available for manipulation by scripts (or the user).
These issues were reported by Jan Schaumann on netbsd-users.

The first allows the user to reference sh internal fds, and is
a simple fix - any sh internal fd is simply treated as if it were closed
when referenced by the script.  These fds can be discovered by
examining /proc/N/fd so it is not difficult for a script to discover
which fd it should attempt to access.

The second allows the user to reference a user level fd which is
one that is normally available to it, but at a point where it should
no longer be visible (when that fd has been redirected, for a built
in command, so the original fd needs to be saved so it can be restored,
the saving fd should not be accessible).   It is not as easy for the
script to determine which fd to attempt here, as the relevant one
exists only during the lifetime of a built-in command (and similar),
but there are ways in some cases (aside from looking at /proc from
another process).

Fix this one by watching which fds the user script is attempting
to use, and avoid using those as temporary fds.   This is possible in
this case as we know what command is being run, before we need to
save the fds it uses.   That's different from the earlier case where
when the shell allocates its fds we have no idea what it might
reference later.

Also clean up a couple of other minor code issues (NFC intended) that
I noticed while here...
2021-09-14 14:49:39 +00:00
kre 683de06b06 PR bin/56398
The final component of both a/b/c and a/b/c/ is "c", so that's the one
to which the -m arg applies.
2021-09-13 22:46:02 +00:00
wiz b90ee919d5 Mark up NULL with Dv. 2021-09-12 06:53:08 +00:00
kre bc2fe2a15e Improve the formatting of the list of Built-in commands for those
commands with multiple synopsis lines (eg: trap).

But there really must be a better way to achieve this effect than
the way it is accomplished here, and I'm hoping some wizard who
understands mdoc much better than I do will revert this change and
do it using some inspired magic incantation instead.
2021-09-12 02:20:36 +00:00
kre 777df0a3cd Don't dereference NULL on "jobs -Z" (with no title given), instead
do setproctitle(NULL) (which is not the same thing at all).  Do the
same with jobs -Z '' as setting the title to "sh: " isn't useful.

Improve the way this is documented, and note that it is only done
this way because zsh did it first (ie: pass on the balme, doing this
in the jobs command is simply absurd.)
2021-09-12 01:30:41 +00:00
christos a902e362a3 like zsh, have jobs -Z do setproctitle 2021-09-11 20:55:03 +00:00