Significantly improve accuracy of error reporting in the cd builtin

darcs-hash:20070920172928-75c98-826cd86e1c33e1f6c746227655e340a6bb459f30.gz
This commit is contained in:
liljencrantz 2007-09-21 03:29:28 +10:00
parent 64933d31a6
commit 3b39b1fa03
2 changed files with 57 additions and 6 deletions

View file

@ -2318,25 +2318,61 @@ static int builtin_cd( wchar_t **argv )
if( !dir ) if( !dir )
{ {
sb_printf( sb_err, if( errno == ENOTDIR )
_( L"%ls: '%ls' is not a directory or you do not have permission to enter it\n" ), {
sb_printf( sb_err,
_( L"%ls: '%ls' is not a directory\n" ),
argv[0], argv[0],
dir_in ); dir_in );
}
else if( errno == ENOENT )
{
sb_printf( sb_err,
_( L"%ls: The directory '%ls' does not exist\n" ),
argv[0],
dir_in );
} else {
sb_printf( sb_err,
_( L"%ls: Unknown error trying to locate directory '%ls'\n" ),
argv[0],
dir_in );
}
if( !is_interactive ) if( !is_interactive )
{ {
sb_append2( sb_err, sb_append2( sb_err,
parser_current_line(), parser_current_line(),
(void *)0 ); (void *)0 );
} }
res = 1; res = 1;
} }
else if( wchdir( dir ) != 0 ) else if( wchdir( dir ) != 0 )
{ {
sb_printf( sb_err, struct stat buffer;
int status;
status = wstat( dir, &buffer );
if( !status && S_ISDIR(buffer.st_mode))
{
sb_printf( sb_err,
_( L"%ls: Permission denied: '%ls'\n" ),
argv[0],
dir );
}
else
{
sb_printf( sb_err,
_( L"%ls: '%ls' is not a directory\n" ), _( L"%ls: '%ls' is not a directory\n" ),
argv[0], argv[0],
dir ); dir );
}
if( !is_interactive ) if( !is_interactive )
{ {
sb_append2( sb_err, sb_append2( sb_err,

17
path.c
View file

@ -137,7 +137,7 @@ wchar_t *path_get_path( void *context, const wchar_t *cmd )
wchar_t *path_get_cdpath( void *context, wchar_t *dir ) wchar_t *path_get_cdpath( void *context, wchar_t *dir )
{ {
wchar_t *res = 0; wchar_t *res = 0;
int err = ENOENT;
if( !dir ) if( !dir )
return 0; return 0;
@ -151,6 +151,11 @@ wchar_t *path_get_cdpath( void *context, wchar_t *dir )
{ {
res = halloc_wcsdup( context, dir ); res = halloc_wcsdup( context, dir );
} }
else
{
err = ENOTDIR;
}
} }
} }
else else
@ -207,11 +212,21 @@ wchar_t *path_get_cdpath( void *context, wchar_t *dir )
halloc_register( context, whole_path ); halloc_register( context, whole_path );
break; break;
} }
else
{
err = ENOTDIR;
}
} }
free( whole_path ); free( whole_path );
} }
free( path_cpy ); free( path_cpy );
} }
if( !res )
{
errno = err;
}
return res; return res;
} }