From 607e97065958640f09dbe5de103bae0fd7c350c5 Mon Sep 17 00:00:00 2001 From: liljencrantz Date: Fri, 21 Sep 2007 03:52:43 +1000 Subject: [PATCH] Further improve accuracy of cd builtins error messages. Now correctly reports rotten symlinks. darcs-hash:20070920175243-75c98-e210034c7bfc8308be9e03017a5a0d8ef7648b9c.gz --- builtin.c | 11 ++++++++++- path.c | 8 ++++++++ path.h | 21 ++++++++++++++------- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/builtin.c b/builtin.c index fe58ab832..c1ca26645 100644 --- a/builtin.c +++ b/builtin.c @@ -2331,8 +2331,17 @@ static int builtin_cd( wchar_t **argv ) _( L"%ls: The directory '%ls' does not exist\n" ), argv[0], dir_in ); + } + else if( errno == EROTTEN ) + { + sb_printf( sb_err, + _( L"%ls: '%ls' is a rotten symlink\n" ), + argv[0], + dir_in ); - } else { + } + else + { sb_printf( sb_err, _( L"%ls: Unknown error trying to locate directory '%ls'\n" ), argv[0], diff --git a/path.c b/path.c index f30ceee7a..51e675e0c 100644 --- a/path.c +++ b/path.c @@ -217,6 +217,14 @@ wchar_t *path_get_cdpath( void *context, wchar_t *dir ) err = ENOTDIR; } } + else + { + if( lwstat( whole_path, &buf ) == 0 ) + { + err = EROTTEN; + } + } + free( whole_path ); } free( path_cpy ); diff --git a/path.h b/path.h index 51213b5d3..19b0756f6 100644 --- a/path.h +++ b/path.h @@ -9,6 +9,8 @@ #ifndef FISH_PATH_H #define FISH_PATH_H +#define EROTTEN 1 + /** Returns the user configuration directory for fish. If the directory or one of it's parents doesn't exist, they are first created. @@ -28,19 +30,24 @@ wchar_t *path_get_config( void *context); wchar_t *path_get_path( void *context, const wchar_t *cmd ); /** - Returns the full path of the specified directory. If the \c in is a - full path to an existing directory, a copy of the string is - returned. If \c in is a directory relative to one of the - directories i the CDPATH, the full path is returned. If no - directory can be found, 0 is returned. - + Returns the full path of the specified directory, using the CDPATH + variable as a list of base directories for relative paths. The + returned string is allocated using halloc and the specified + context. + + If no valid path is found, null is returned and errno is set to + ENOTDIR if at least one such path was found, but it did not point + to a directory, EROTTEN if a arotten symbolic link was found, or + ENOENT if no file of the specified name was found. If both a rotten + symlink and a file are found, it is undefined which error status + will be returned. + \param in The name of the directory. \param context the halloc context to use for memory allocations \return 0 if the command can not be found, the path of the command otherwise. */ wchar_t *path_get_cdpath( void *context, wchar_t *in ); - wchar_t *path_make_canonical( void *context, const wchar_t *path );