Stuf
[oweals/busybox.git] / findutils / find.c
index a42f9e979bfed6c2a844162ab05791e3428463c6..0f1f5f1891304e2789c77ceb262b750288cdffa9 100644 (file)
@@ -1,7 +1,9 @@
 /*
  * 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;
-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* directory=".";
+static int dereferenceFlag=FALSE;
+
+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
 
 
-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)
 {
-    DIR *dir;
-    struct dirent *entry;
-    
     if (pattern==NULL)
        fprintf(stdout, "%s\n", fileName);
-    else if (match(fileName, pattern) == TRUE)
+    else if (find_match((char*)fileName, pattern, TRUE) == 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);
 }
 
 int find_main(int argc, char **argv)
 {
-    if (argc <= 1) {
-       dirAction( "."); 
-    }
-
     /* 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':
@@ -100,8 +85,7 @@ int find_main(int argc, char **argv)
                        pattern=*(++argv);
                        stopit=-TRUE;
                    } else {
-                       fprintf(stderr, "Usage: %s\n", find_usage);
-                       exit( FALSE);
+                       usage (find_usage);
                    }
                }
                break;
@@ -109,8 +93,7 @@ int find_main(int argc, char **argv)
                /* Ignore all long options */
                break;
            default:
-               fprintf(stderr, "Usage: %s\n", find_usage);
-               exit( FALSE);
+               usage (find_usage);
        }
        if (argc-- > 1)
            argv++;
@@ -120,37 +103,10 @@ int find_main(int argc, char **argv)
            break;
     }
 
-    dirAction( directory); 
-    exit(TRUE);
-}
-
-
-
-#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);
+    if (recursiveAction(directory, TRUE, FALSE, FALSE,
+                          fileAction, fileAction) == FALSE) {
+       exit( FALSE);
+    }
 
-       return(0);      
+    exit(TRUE);
 }
-
-
-#endif