From 510b3517ec8174519a18ce78923aecb703c47a64 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Sun, 9 Sep 2007 16:12:28 +0000 Subject: [PATCH] Recognizes the first command entered --- src/find.c | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/src/find.c b/src/find.c index 77ebc2f..71185d5 100644 --- a/src/find.c +++ b/src/find.c @@ -32,16 +32,19 @@ typedef int Prefs; /* find */ static int _find_error(char const * message, int ret); -static int _find_do(Prefs * prefs, char const * pathname); +static int _find_do(Prefs * prefs, int filec, char * filev[], int cmdc, + char * cmdv[]); static int _find(Prefs * prefs, int argc, char * argv[]) { - int ret = 0; int i; + int filec; for(i = 0; i < argc; i++) - ret |= _find_do(prefs, argv[i]); - return ret; + if(argv[i][0] == '-' || argv[i][0] == '!' || argv[i][0] == '(') + break; + filec = i; + return _find_do(prefs, filec, argv, argc - filec, &argv[filec]); } static int _find_error(char const * message, int ret) @@ -54,16 +57,23 @@ static int _find_error(char const * message, int ret) /* find_do */ static int _do_dir(Prefs * prefs, char const * pathname); -static int _find_do(Prefs * prefs, char const * pathname) +static int _find_do(Prefs * prefs, int filec, char * filev[], int cmdc, + char * cmdv[]) { + int ret = 0; + int i; struct stat st; - if(lstat(pathname, &st) != 0) /* XXX TOCTOU */ - return _find_error(pathname, 1); - if(S_ISDIR(st.st_mode)) - return _do_dir(prefs, pathname); - printf("%s\n", pathname); - return 0; + for(i = 0; i < filec; i++) + { + if(lstat(filev[i], &st) != 0) /* XXX TOCTOU */ + ret |= _find_error(filev[i], 1); + if(S_ISDIR(st.st_mode)) + ret |= _do_dir(prefs, filev[i]); + else + printf("%s\n", filev[i]); + } + return ret; } static int _do_dir(Prefs * prefs, char const * pathname) @@ -93,7 +103,7 @@ static int _do_dir(Prefs * prefs, char const * pathname) break; path = p; strcpy(&path[len - 1], de->d_name); - ret |= _find_do(prefs, path); + ret |= _find_do(prefs, 1, &path, 0, NULL); } free(path); if(de != NULL)