+/* vi: set sw=4 ts=4: */
/*
* Mini find implementation for busybox
*
- * Copyright (C) 1998 by Erik Andersen <andersee@debian.org>
+ *
+ * Copyright (C) 1999,2000 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 "busybox.h"
#include <stdio.h>
#include <unistd.h>
#include <dirent.h>
-#include "internal.h"
-
-
-static char* pattern=NULL;
-static char* directory=NULL;
-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 char *pattern = NULL;
+static char *directory = ".";
+static int dereferenceFlag = FALSE;
-static int fileAction(const char *fileName)
-{
- 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)
+static int fileAction(const char *fileName, struct stat *statbuf, void* junk)
{
- 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, fileAction, dirAction);
- }
- return( TRUE);
+ if (pattern == NULL)
+ puts(fileName);
+ else {
+ char *tmp = strrchr(fileName, '/');
+
+ if (tmp == NULL)
+ tmp = (char *) fileName;
+ else
+ tmp++;
+ if (check_wildcard_match(tmp, pattern) == TRUE)
+ puts(fileName);
+ }
+ return (TRUE);
}
int find_main(int argc, char **argv)
{
- if (argc <= 1) {
- dirAction( ".");
- }
-
- /* peel off the "find" */
- argc--;
- argv++;
-
- if (**argv != '-') {
- directory=*argv;
+ /* peel off the "find" */
argc--;
argv++;
- }
- /* Parse any options */
- while (**argv == '-') {
- int stopit=FALSE;
- while (*++(*argv) && stopit==FALSE) switch (**argv) {
- case 'f':
- if (strcmp(*argv, "follow")==0) {
- argc--;
- argv++;
- dereferenceFlag=TRUE;
- }
- break;
- case 'n':
- if (strcmp(*argv, "name")==0) {
- if (argc-- > 1) {
- pattern=*(++argv);
- stopit=-TRUE;
- } else {
- fprintf(stderr, "Usage: %s\n", find_usage);
- exit( FALSE);
- }
- }
- break;
- case '-':
- /* Ignore all long options */
- break;
- default:
- fprintf(stderr, "Usage: %s\n", find_usage);
- exit( FALSE);
+ if (argc > 0 && **argv != '-') {
+ directory = *argv;
+ argc--;
+ argv++;
}
- if (argc-- > 1)
- argv++;
- if (**argv != '-')
- break;
- else
- break;
- }
-
- dirAction( directory);
- exit(TRUE);
-}
+ /* Parse any options */
+ while (argc > 0 && **argv == '-') {
+ int stopit = FALSE;
+
+ while (*++(*argv) && stopit == FALSE)
+ switch (**argv) {
+ case 'f':
+ if (strcmp(*argv, "follow") == 0) {
+ argc--;
+ argv++;
+ dereferenceFlag = TRUE;
+ }
+ break;
+ case 'n':
+ if (strcmp(*argv, "name") == 0) {
+ if (argc-- > 1) {
+ pattern = *(++argv);
+ stopit = TRUE;
+ } else {
+ usage(find_usage);
+ }
+ }
+ break;
+ case '-':
+ /* Ignore all long options */
+ break;
+ default:
+ usage(find_usage);
+ }
+ if (argc-- > 1)
+ argv++;
+ if (**argv != '-')
+ break;
+ else
+ break;
+ }
+ if (recursive_action(directory, TRUE, FALSE, FALSE,
+ fileAction, fileAction, NULL) == FALSE) {
+ return EXIT_FAILURE;
+ }
-#ifdef foobar
-
-#include "internal.h"
-#include <errno.h>
-#include <stdio.h>
-
-const char find_usage[] = "find dir [pattern]\n"
-"\n"
-"\tFind files.\n";
-
-extern int
-find_main(struct FileInfo * i, int argc, char * * argv)
-{
- i->recursive=1;
- i->processDirectoriesAfterTheirContents=1;
- return monadic_main(i, argc, argv);
-}
-
-extern int
-find_fn(const struct FileInfo * i)
-{
- printf("%s\n",i->source);
-
- return(0);
+ return EXIT_SUCCESS;
}
-
-
-#endif