summary refs log tree commit diff
path: root/src/cd.c (follow)
Commit message (Collapse)AuthorAge
* exec: Stricter pathopt parsingHerbert Xu2018-05-28
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch changes the parsing of pathopt. First of all only %builtin and %func (with arbitrary suffixes) will be recognised. Any other pathopt will be treated as a normal directory. Furthermore, pathopt can now be specified before the directory, rather than after it. In fact, a future version may remove support for pathopt suffixes. Wherever the pathopt is placed, an optional % may be placed after it to terminate the pathopt. This is so that it is less likely that a genuine directory containing a % sign is parsed as a pathopt. Users of padvance outside of exec.c have also been modified: 1) cd(1) will always treat % characters as part of the path. 2) chkmail will continue to accept arbitrary pathopt. 3) find_dot_file will ignore the %builtin pathopt instead of trying to do a stat in the accompanying directory (which is usually the current directory). The patch also removes the clearcmdentry optimisation where we attempt to only partially flush the table where possible. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
* exec: Do not allocate stack string in padvanceHerbert Xu2018-05-28
| | | | | | | | | | | Many callers of padvance immediately free the allocated string so this patch moves the stalloc call to the caller. Instead of returning the allocated string, padvance now returns the length to allocate (this may be longer than the actual string length, even including the NUL). For the case where we would previously return NULL, we now return -1. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
* [CD] support drive letters on CygwinEric Blake2014-10-27
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The Cygwin platform supports DOS style drive-letter paths such as "C:\\dir", even though the preferred form is a POSIX-style "/cygdrive/c/dir". This can be seen by doing things such as chdir("c:") (which succeeds) followed by getcwd(NULL, 0) (which returns the normalized "/cygdrive/c"). However, dash was trying to perform local manipulations on the argument to 'cd' prior to calling into libc, in order to update the state of $PWD and friends; these manipulations were assuming that the user meant to change to a relative subdirectory of the current location, as in './c:', instead of honoring the drive letter. None of the other dash builtins take a filename and manipulate it to affect shell state (some, like 'test', take a file name, but as stat("c:") works just fine, there is no need to normalize). This patch has no impact outside of cygwin; on cygwin, it takes advantage of a native function call to canonicalize any incoming name into preferred form before updating shell state. Pre-patch: $ dash -c 'cd c: && echo $PWD' dash: 1: cd: can't cd to c: Post-patch: $ dash -c 'cd c: && echo $PWD' /cygdrive/c Signed-off-by: Eric Blake <eblake@redhat.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
* [SHELL] Port to SolarisBrian Koropoff2011-03-15
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - Solaris lacks paths.h and the various _PATH_* #defines. Check for them in configure.ac and fall back on the usual suspects when they are missing. - Older Solaris lacks isblank(), and versions that have it use a macro. Check for the declaration in configure.ac and fall back on a naive version when missing. - Older Solaris does not support %jd (intmax_t) in format strings, but it does support the PRIdMAX macro from inttypes.h. Do a configure check for PRIdMAX and use it in the code. If it doesn't exist, define it to "lld" when sizeof(long long) equals sizeof(intmax_t) as this is more likely to work on older systems. Otherwise, use "jd" and hope for the best. - Older Solaris lacks stdint.h, but inttypes.h provides the same types and works on all platforms I've tried dash on, so just use it instead. - Older Solaris doesn't like it when vsnprintf() is passed a NULL buffer (in violation of the POSIX spec, of course). Pass a 1-byte dummy buffer instead. - Solaris lacks tempfile and mktemp programs. Fall back on a "good-enough" custom function in mkbuiltins. Signed-off-by: Brian Koropoff <bkoropoff@gmail.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
* [CD] Lookup PWD after going through CDPATHHerbert Xu2009-08-31
| | | | | | | | | | | | | | | | | | | | | | | On Tue, Jul 14, 2009 at 09:39:03PM +0000, Eric Blake wrote: > For the cd command, POSIX 2008 requires that after all pathnames in CDPATH > have been tested and failed in step 5, then step 6 interprets the directory > argument relative to PWD. In other words, this demonstrates a bug: > > $ dash -c 'cd /tmp; mkdir -p foo; CDPATH=oops; cd foo; echo $?; pwd' > cd: 1: can't cd to foo > 2 > /tmp > > while bash gets it correct: > > $ bash -c 'cd /tmp; mkdir -p foo; CDPATH=oops; cd foo; echo $?; pwd' > 0 > /tmp/foo This patch fixes the problem. Reported-by: Eric Blake <ebb9@byu.net> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
* [CD] Fixed getcwd build error for the non-glibc caseHerbert Xu2008-08-05
| | | | | | | | | | | | | | | | | | | | On Sat, Aug 02, 2008 at 01:24:16AM +0200, Peter Hartlich wrote: > > dash's debian/diff/0048--CD-Restored-warning-when-getcwd-fails.diff > contains the following lines: > > - return getcwd(buf, sizeof(buf)) ? savestr(buf) : nullstr; > + > + if (getcwd(buf, sizeof(buf)) > + return savestr(buf); > > The if condition is missing a closing parenthesis, which probably went > unnoticed because it occurs in a section only compiled if __GLIBC__ is > not defined. This patch adds the extra parenthesis. Thanks Peter. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
* [CD] Restored warning when getcwd failsHerbert Xu2008-05-03
| | | | | | | Somewhere along the lines the warning when getcwd fails went missing. This patch restores it. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
* [CD] Test __GLIBC__ instead of _GNU_SOURCEHerbert Xu2008-05-03
| | | | | | | AC_GNU_SOURCE always defines _GNU_SOURCE so testing it is pointless. This patch changes it to test __GLIBC__ instead. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
* [CD] Restored non-glibc getcwd supportHerbert Xu2008-05-02
| | | | | | | | | | These days dash is expected to build with libraries other than glibc so we need to support the old way of calling getcwd again. Thanks to Dan McGee for reporting this bug when dash is built with klibc. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
* Copyright/licence updates and remove all traces of sys/cdefs.hHerbert Xu2005-10-29
| | | | | | | | | | | This change updates the BSD licence to the three-clause version since NetBSD has already done so. This makes dash GPL-compatible. It also adds Christos Zoulas (NetBSD ash maintainer) to the COPYING file. I've added "copyright by Herbert Xu" to most files. Finally all CVS IDs and inclusion of sys/cdefs.h have been removed. The latter is needed for support of klibc.
* Renamed error to sh_error.herbert2005-09-26
|
* Fixed cd - when OLDPWD is unset.herbert2005-09-26
|
* Initial import.Herbert Xu2005-09-26