/*
* Mini find implementation for busybox
*
- * Copyright (C) 1998 by Erik Andersen <andersee@debian.org>
+ *
+ * Copyright (C) 1999 by Lineo, inc.
+ * Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
*
*/
+#include "internal.h"
+#include "regexp.h"
#include <stdio.h>
#include <unistd.h>
#include <dirent.h>
-#include "internal.h"
static char* pattern=NULL;
-static char* directory=NULL;
+static char* directory=".";
static int dereferenceFlag=FALSE;
-static const char find_usage[] = "find [path...] [expression]\n"
-"default path is the current directory; default expression is -print\n"
-"expression may consist of:\n";
+static const char find_usage[] = "find [PATH...] [EXPRESSION]\n\n"
+"Search for files in a directory hierarchy. The default PATH is\n"
+"the current directory; default EXPRESSION is '-print'\n\n"
+"\nEXPRESSION may consist of:\n"
+"\t-follow\n\t\tDereference symbolic links.\n"
+"\t-name PATTERN\n\t\tFile name (with leading directories removed) matches PATTERN.\n"
+"\t-print\n\t\tprint the full file name followed by a newline to stdout.\n\n"
+#if defined BB_REGEXP
+"This version of find matches full regular expresions.\n";
+#else
+"This version of find matches strings (not regular expresions).\n";
+#endif
{
if (pattern==NULL)
fprintf(stdout, "%s\n", fileName);
- else if (match(fileName, pattern) == TRUE)
- fprintf(stdout, "%s\n", fileName);
- return( TRUE);
-}
-
-static int dirAction(const char *fileName, struct stat* statbuf)
-{
- DIR *dir;
- struct dirent *entry;
-
- if (pattern==NULL)
- fprintf(stdout, "%s\n", fileName);
- else if (match(fileName, pattern) == TRUE)
- fprintf(stdout, "%s\n", fileName);
-
- dir = opendir( fileName);
- if (!dir) {
- perror("Can't open directory");
- exit(FALSE);
- }
- while ((entry = readdir(dir)) != NULL) {
- char dirName[NAME_MAX];
- sprintf(dirName, "%s/%s", fileName, entry->d_name);
- recursiveAction( dirName, TRUE, dereferenceFlag, FALSE, fileAction, dirAction);
+ else {
+ char* tmp = strrchr( fileName, '/');
+ if (tmp == NULL)
+ tmp = (char*)fileName;
+ else
+ tmp++;
+ if (check_wildcard_match(tmp, pattern) == TRUE)
+ fprintf(stdout, "%s\n", fileName);
}
return( TRUE);
}
int find_main(int argc, char **argv)
{
- if (argc <= 1) {
- dirAction( ".", NULL);
- }
-
/* peel off the "find" */
argc--;
argv++;
- if (**argv != '-') {
+ if ( argc > 0 && **argv != '-') {
directory=*argv;
argc--;
argv++;
}
/* Parse any options */
- while (**argv == '-') {
+ while (argc > 0 && **argv == '-') {
int stopit=FALSE;
while (*++(*argv) && stopit==FALSE) switch (**argv) {
case 'f':
pattern=*(++argv);
stopit=-TRUE;
} else {
- fprintf(stderr, "Usage: %s\n", find_usage);
- exit( FALSE);
+ usage (find_usage);
}
}
break;
/* Ignore all long options */
break;
default:
- fprintf(stderr, "Usage: %s\n", find_usage);
- exit( FALSE);
+ usage (find_usage);
}
if (argc-- > 1)
argv++;
break;
}
- dirAction( directory, NULL);
+ if (recursiveAction(directory, TRUE, FALSE, FALSE,
+ fileAction, fileAction) == FALSE) {
+ exit( FALSE);
+ }
+
exit(TRUE);
}