]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/tools/testfind.c
Use @scriptdir@ not . ./
[bacula/bacula] / bacula / src / tools / testfind.c
index f98cf4297d199ffd08e1bbb97e583a2f5aa2a938..8ace8a7a817824eeec151ea269c73a683861078d 100644 (file)
@@ -2,9 +2,28 @@
  * Test program for find files
  */
 
+/*
+   Copyright (C) 2000-2003 Kern Sibbald and John Walker
+
+   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 the Free Software Foundation; either version 2 of
+   the License, or (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public
+   License along with this program; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+   MA 02111-1307, USA.
+
+ */
+
 #include "bacula.h"
 #include "findlib/find.h"
-#include "jcr.h"
 
 
 /* Global variables */
@@ -13,7 +32,9 @@ static int max_file_len = 0;
 static int max_path_len = 0;
 static int trunc_fname = 0;
 static int trunc_path = 0;
+static int attrs = 0;
 
+static JCR *jcr;
 
 static int print_file(FF_PKT *ff, void *pkt);
 static void count_files(FF_PKT *ff);
@@ -23,16 +44,19 @@ static void usage()
    fprintf(stderr, _(
 "\n"
 "Usage: testfind [-d debug_level] [-] [pattern1 ...]\n"
+"       -a          print extended attributes (Win32 debug)\n"
 "       -dnn        set debug level to nn\n"
+"       -e          specify file of exclude patterns\n"
+"       -i          specify file of include patterns\n"
 "       -           read pattern(s) from stdin\n"
 "       -?          print this message.\n"
 "\n"
-"Patterns are file inclusion -- normally directories.\n"
+"Patterns are used for file inclusion -- normally directories.\n"
 "Debug level >= 1 prints each file found.\n"
 "Debug level >= 10 prints path/file for catalog.\n"
-"Errors always printed.\n"
-"Files/paths truncated is number with len > 255.\n"
-"Truncation is only in catalog.\n"
+"Errors are always printed.\n"
+"Files/paths truncated is the number of files/paths with len > 255.\n"
+"Truncation is only in the catalog.\n"
 "\n"));
 
    exit(1);
@@ -44,10 +68,17 @@ main (int argc, char *const *argv)
 {
    FF_PKT *ff;
    char name[1000];
-   int i, ch;
+   int i, ch, hard_links;
+   char *inc = NULL;
+   char *exc = NULL;
+   FILE *fd;
 
-   while ((ch = getopt(argc, argv, "d:?")) != -1) {
+   while ((ch = getopt(argc, argv, "ad:e:i:?")) != -1) {
       switch (ch) {
+         case 'a':                    /* print extended attributes *debug* */
+           attrs = 1;
+           break;
+
          case 'd':                    /* set debug level */
            debug_level = atoi(optarg);
            if (debug_level <= 0) {
@@ -55,6 +86,14 @@ main (int argc, char *const *argv)
            }
            break;
 
+         case 'e':                    /* exclude patterns */
+           exc = optarg;
+           break;
+
+         case 'i':                    /* include patterns */
+           inc = optarg;
+           break;
+
          case '?':
         default:
            usage();
@@ -64,40 +103,70 @@ main (int argc, char *const *argv)
    argc -= optind;
    argv += optind;
 
-  ff = init_find_files();
-   if (argc == 0) {
-     add_fname_to_include_list(ff, 0, "/"); /* default to / */
-  } else {   
+   jcr = new_jcr(sizeof(JCR), NULL);
+
+   ff = init_find_files();
+   if (argc == 0 && !inc) {
+      add_fname_to_include_list(ff, 0, "/"); /* default to / */
+   } else {   
       for (i=0; i < argc; i++) {
-        if (strcmp(argv[i], "-") == 0) {
-          while (fgets(name, sizeof(name)-1, stdin)) {
-             strip_trailing_junk(name);
-             add_fname_to_include_list(ff, 0, name); 
-          }
-          continue;
-       }
-       add_fname_to_include_list(ff, 0, argv[i]); 
-     }
-  }
-
-  find_files(ff, print_file, NULL);
-  term_find_files(ff);
+         if (strcmp(argv[i], "-") == 0) {
+            while (fgets(name, sizeof(name)-1, stdin)) {
+               strip_trailing_junk(name);
+               add_fname_to_include_list(ff, 0, name); 
+             }
+             continue;
+        }
+        add_fname_to_include_list(ff, 0, argv[i]); 
+      }
+   }
+   if (inc) {
+      fd = fopen(inc, "r");
+      if (!fd) {
+         printf("Could not open include file: %s\n", inc);
+        exit(1);
+      }
+      while (fgets(name, sizeof(name)-1, fd)) {
+        strip_trailing_junk(name);
+        add_fname_to_include_list(ff, 0, name);
+      }
+      fclose(fd);
+   }
+
+   if (exc) {
+      fd = fopen(exc, "r");
+      if (!fd) {
+         printf("Could not open exclude file: %s\n", exc);
+        exit(1);
+      }
+      while (fgets(name, sizeof(name)-1, fd)) {
+        strip_trailing_junk(name);
+        add_fname_to_exclude_list(ff, name);
+      }
+      fclose(fd);
+   }
+   find_files(jcr, ff, print_file, NULL);
+   hard_links = term_find_files(ff);
   
    printf(_("\
 Total files    : %d\n\
 Max file length: %d\n\
 Max path length: %d\n\
 Files truncated: %d\n\
-Paths truncated: %d\n"),
+Paths truncated: %d\n\
+Hard links     : %d\n"),
      num_files, max_file_len, max_path_len,
-     trunc_fname, trunc_path);
+     trunc_fname, trunc_path, hard_links);
   
+  free_jcr(jcr);
+  close_memory_pool();
   sm_dump(False);
   exit(0);
 }
 
 static int print_file(FF_PKT *ff, void *pkt)
 {
+
    switch (ff->type) {
    case FT_LNKSAVED:
       if (debug_level == 1) {
@@ -174,6 +243,14 @@ static int print_file(FF_PKT *ff, void *pkt)
       printf(_("Err: Unknown file ff->type %d: %s\n"), ff->type, ff->fname);
       break;
    }
+   if (attrs) {
+      char attr[200];
+      encode_attribsEx(NULL, attr, ff);
+      if (*attr != 0) {
+         printf("AttrEx=%s\n", attr);
+      }
+//    set_attribsEx(NULL, ff->fname, NULL, NULL, ff->type, attr);
+   }
    return 1;
 }