Recognizes the first command entered

This commit is contained in:
Pierre Pronchery 2007-09-09 16:12:28 +00:00
parent dceb83a246
commit 510b3517ec

View File

@ -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)