aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar axel <axel@liljencrantz.se>2006-01-13 00:49:03 +1000
committerGravatar axel <axel@liljencrantz.se>2006-01-13 00:49:03 +1000
commit16cb9dfa052a261b76840702cd979c04bc4b0a4b (patch)
treee7f603ecb098b73805450a9f555ca534f13b6169
parent10fec8abb609cf2d554de89584089917019980ad (diff)
Improve description handling - handle symbolic link loops, handle description functions returning strings without a separator, and handle testing of un-stat:able files
darcs-hash:20060112144903-ac50b-9766abfa212b2eaf61509a65499df0018562b5d9.gz
-rw-r--r--complete.c51
-rw-r--r--init/fish.in2
-rw-r--r--wildcard.c33
3 files changed, 47 insertions, 39 deletions
diff --git a/complete.c b/complete.c
index 3ce4353a..5ea039d3 100644
--- a/complete.c
+++ b/complete.c
@@ -90,6 +90,10 @@
*/
#define COMPLETE_ROTTEN_SYMLINK_DESC _( L"Rotten symbolic link" )
/**
+ Description for symlink loop
+*/
+#define COMPLETE_LOOP_SYMLINK_DESC _( L"Symbolic link loop" )
+/**
Description for socket
*/
#define COMPLETE_SOCKET_DESC _( L"Socket" )
@@ -938,7 +942,16 @@ const wchar_t *complete_get_desc( const wchar_t *filename )
break;
default:
- wperror( L"stat" );
+ if( errno == ELOOP )
+ {
+ sb_printf( get_desc_buff, L"%lc%ls", COMPLETE_SEP, COMPLETE_LOOP_SYMLINK_DESC );
+ }
+
+ /*
+ Some kind of broken symlink. We ignore it
+ here, and it will get a 'file' description,
+ or one based on suffix.
+ */
break;
}
}
@@ -954,21 +967,6 @@ const wchar_t *complete_get_desc( const wchar_t *filename )
}
}
-/* else
- {
-
- switch( errno )
- {
- case EACCES:
- break;
-
- default:
- fprintf( stderr, L"The following error happened on file %ls\n", filename );
- wperror( L"lstat" );
- break;
- }
- }
-*/
if( wcslen((wchar_t *)get_desc_buff->buff) == 0 )
{
@@ -1332,16 +1330,19 @@ static void complete_cmd( const wchar_t *cmd,
{
wchar_t *nxt = (wchar_t *)al_get( &tmp, i );
- wchar_t *desc = wcsrchr( nxt, COMPLETE_SEP )+1;
- int is_valid = (desc && (wcscmp(desc,
- COMPLETE_DIRECTORY_DESC)==0));
- if( is_valid )
+ wchar_t *desc = wcsrchr( nxt, COMPLETE_SEP );
+ if( desc )
{
- al_push( comp, nxt );
- }
- else
- {
- free(nxt);
+ int is_valid = desc && (wcscmp(desc+1,
+ COMPLETE_DIRECTORY_DESC)==0);
+ if( is_valid )
+ {
+ al_push( comp, nxt );
+ }
+ else
+ {
+ free(nxt);
+ }
}
}
}
diff --git a/init/fish.in b/init/fish.in
index a07a884e..7cc3c865 100644
--- a/init/fish.in
+++ b/init/fish.in
@@ -43,7 +43,7 @@ if status --is-login
end
if test -f /etc/sysconfig/i18n
- eval (cat /etc/sysconfig/i18n |sed -ne 's/^\([a-zA-Z]*\)=\(.*\)$/set -gx \1 \2;/')
+ eval (cat /etc/sysconfig/i18n |sed -ne 's/^\([a-zA-Z]*\)=\(.*\)$/set -gx \1 \2;/p')
end
end
diff --git a/wildcard.c b/wildcard.c
index c008d3ab..a6b1d721 100644
--- a/wildcard.c
+++ b/wildcard.c
@@ -150,27 +150,34 @@ static int wildcard_complete_internal( const wchar_t *orig,
sep = wcschr(new, PROG_COMPLETE_SEP );
*sep = COMPLETE_SEP;
}
- else if( desc_func )
- {
- /*
- A descripton generating function is specified, use it
- */
- new = wcsdupcat2( str, COMPLETE_SEP_STR, desc_func( orig ), (void *)0);
- }
else
{
+ wchar_t *this_desc = desc;
+
+ if( desc_func )
+ {
+ /*
+ A descripton generating function is specified, call
+ it. If it returns something, use that as the
+ description.
+ */
+ wchar_t *func_desc = desc_func( orig );
+ if( func_desc )
+ this_desc = func_desc;
+ }
+
/*
- Append generic description to item, if the description exists
+ Append description to item, if a description exists
*/
- if( desc && wcslen(desc) )
+ if( this_desc && wcslen(this_desc) )
{
/*
Check if the description already contains a separator character, if not, prepend it
*/
- if( wcschr( desc, COMPLETE_SEP ) )
- new = wcsdupcat2( str, desc, (void *)0 );
+ if( wcschr( this_desc, COMPLETE_SEP ) )
+ new = wcsdupcat2( str, this_desc, (void *)0 );
else
- new = wcsdupcat2( str, COMPLETE_SEP_STR, desc, (void *)0 );
+ new = wcsdupcat2( str, COMPLETE_SEP_STR, this_desc, (void *)0 );
}
else
new = wcsdup( str );
@@ -328,7 +335,7 @@ static int test_flags( wchar_t *filename,
struct stat buf;
if( wstat( filename, &buf ) == -1 )
{
- return 1;
+ return 0;
}
if( S_IFDIR & buf.st_mode )