X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Ffindlib%2Ffind.c;h=0a4599e43a7859163c423dbacd0304df0a86fb69;hb=f316834a92996bce1d360a6d7464d49bb9b9f127;hp=c4bd014adf3eb179544425e16aa988ad3f72cecf;hpb=9e4e551c40ca986f86408d0f60ad8bac9bb9729f;p=bacula%2Fbacula diff --git a/bacula/src/findlib/find.c b/bacula/src/findlib/find.c index c4bd014adf..0a4599e43a 100644 --- a/bacula/src/findlib/find.c +++ b/bacula/src/findlib/find.c @@ -1,25 +1,14 @@ -/* - * Main routine for finding files on a file system. - * The heart of the work to find the files on the - * system is done in find_one.c. Here we have the - * higher level control as well as the matching - * routines for the new syntax Options resource. - * - * Kern E. Sibbald, MM - * - * Version $Id$ - */ /* Bacula® - The Network Backup Solution - Copyright (C) 2000-2006 Free Software Foundation Europe e.V. + Copyright (C) 2000-2009 Free Software Foundation Europe e.V. The main author of Bacula is Kern Sibbald, with contributions from many others, a complete list can be found in the file AUTHORS. This program is Free Software; you can redistribute it and/or modify it under the terms of version two of the GNU General Public - License as published by the Free Software Foundation plus additions - that are listed in the file LICENSE. + License as published by the Free Software Foundation and included + in the file LICENSE. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -31,11 +20,22 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - Bacula® is a registered trademark of John Walker. + Bacula® is a registered trademark of Kern Sibbald. The licensor of Bacula is the Free Software Foundation Europe (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, Switzerland, email:ftf@fsfeurope.org. */ +/* + * Main routine for finding files on a file system. + * The heart of the work to find the files on the + * system is done in find_one.c. Here we have the + * higher level control as well as the matching + * routines for the new syntax Options resource. + * + * Kern E. Sibbald, MM + * + * Version $Id$ + */ #include "bacula.h" @@ -48,7 +48,7 @@ int32_t path_max; /* path name max length */ #undef bmalloc #define bmalloc(x) sm_malloc(__FILE__, __LINE__, x) #endif -static int our_callback(FF_PKT *ff, void *hpkt, bool top_level); +static int our_callback(JCR *jcr, FF_PKT *ff, bool top_level); static bool accept_file(FF_PKT *ff); static const int fnmode = 0; @@ -96,6 +96,13 @@ set_find_options(FF_PKT *ff, int incremental, time_t save_time) Dmsg0(100, "Leave set_find_options()\n"); } +void +set_find_changed_function(FF_PKT *ff, bool check_fct(JCR *jcr, FF_PKT *ff)) +{ + Dmsg0(100, "Enter set_find_changed_function()\n"); + ff->check_fct = check_fct; +} + /* * For VSS we need to know which windows drives * are used, because we create a snapshot of all used @@ -119,14 +126,15 @@ get_win32_driveletters(FF_PKT *ff, char* szDrives) findFILESET *fileset = ff->fileset; if (fileset) { - int i, j; + int i; + dlistString *node; for (i=0; iinclude_list.size(); i++) { findINCEXE *incexe = (findINCEXE *)fileset->include_list.get(i); /* look through all files and check */ - for (j=0; jname_list.size(); j++) { - char *fname = (char *)incexe->name_list.get(j); + foreach_dlist(node, &incexe->name_list) { + char *fname = node->c_str(); /* fname should match x:/ */ if (strlen(fname) >= 2 && B_ISALPHA(fname[0]) && fname[1] == ':') { @@ -147,26 +155,18 @@ get_win32_driveletters(FF_PKT *ff, char* szDrives) } /* - * Find all specified files (determined by calls to name_add() - * This routine calls the (handle_file) subroutine with all - * sorts of good information for the final disposition of - * the file. - * * Call this subroutine with a callback subroutine as the first * argument and a packet as the second argument, this packet * will be passed back to the callback subroutine as the last * argument. * - * The callback subroutine gets called with: - * arg1 -- the FF_PKT containing filename, link, stat, ftype, flags, etc - * arg2 -- the user supplied packet - * */ int -find_files(JCR *jcr, FF_PKT *ff, int callback(FF_PKT *ff_pkt, void *hpkt, bool top_level), - void *his_pkt) +find_files(JCR *jcr, FF_PKT *ff, int file_save(JCR *jcr, FF_PKT *ff_pkt, bool top_level), + int plugin_save(JCR *jcr, FF_PKT *ff_pkt, bool top_level)) { - ff->callback = callback; + ff->file_save = file_save; + ff->plugin_save = plugin_save; /* This is the new way */ findFILESET *fileset = ff->fileset; @@ -175,6 +175,7 @@ find_files(JCR *jcr, FF_PKT *ff, int callback(FF_PKT *ff_pkt, void *hpkt, bool t ff->flags = 0; ff->VerifyOpts[0] = 'V'; ff->VerifyOpts[1] = 0; + strcpy(ff->AccurateOpts, "C:mcs"); /* mtime+ctime+size by default */ for (i=0; iinclude_list.size(); i++) { findINCEXE *incexe = (findINCEXE *)fileset->include_list.get(i); fileset->incexe = incexe; @@ -186,22 +187,74 @@ find_files(JCR *jcr, FF_PKT *ff, int callback(FF_PKT *ff_pkt, void *hpkt, bool t findFOPTS *fo = (findFOPTS *)incexe->opts_list.get(j); ff->flags |= fo->flags; ff->GZIP_level = fo->GZIP_level; + ff->strip_path = fo->strip_path; ff->fstypes = fo->fstype; ff->drivetypes = fo->drivetype; bstrncat(ff->VerifyOpts, fo->VerifyOpts, sizeof(ff->VerifyOpts)); + bstrncat(ff->AccurateOpts, fo->AccurateOpts, sizeof(ff->AccurateOpts)); } - for (j=0; jname_list.size(); j++) { - Dmsg1(100, "F %s\n", (char *)incexe->name_list.get(j)); - ff->top_fname = (char *)incexe->name_list.get(j); - if (find_one_file(jcr, ff, our_callback, his_pkt, ff->top_fname, (dev_t)-1, true) == 0) { + dlistString *node; + foreach_dlist(node, &incexe->name_list) { + char *fname = node->c_str(); + Dmsg1(100, "F %s\n", fname); + ff->top_fname = fname; + if (find_one_file(jcr, ff, our_callback, ff->top_fname, (dev_t)-1, true) == 0) { return 0; /* error return */ } } + if (plugin_save) { + foreach_dlist(node, &incexe->plugin_list) { + char *fname = node->c_str(); + Dmsg1(100, "PluginCommand: %s\n", fname); + ff->top_fname = fname; + ff->cmd_plugin = true; + plugin_save(jcr, ff, true); + ff->cmd_plugin = false; + } + } } } return 1; } +/* + * Test if the currently selected directory (in ff->fname) is + * explicitly in the Include list or explicitly in the Exclude + * list. + */ +bool is_in_fileset(FF_PKT *ff) +{ + dlistString *node; + char *fname; + int i; + findINCEXE *incexe; + findFILESET *fileset = ff->fileset; + if (fileset) { + for (i=0; iinclude_list.size(); i++) { + incexe = (findINCEXE *)fileset->include_list.get(i); + foreach_dlist(node, &incexe->name_list) { + fname = node->c_str(); + Dmsg2(100, "Inc fname=%s ff->fname=%s\n", fname, ff->fname); + if (strcmp(fname, ff->fname) == 0) { + return true; + } + } + } + for (i=0; iexclude_list.size(); i++) { + incexe = (findINCEXE *)fileset->exclude_list.get(i); + foreach_dlist(node, &incexe->name_list) { + fname = node->c_str(); + Dmsg2(100, "Exc fname=%s ff->fname=%s\n", fname, ff->fname); + if (strcmp(fname, ff->fname) == 0) { + return true; + } + } + } + } + return false; +} + + static bool accept_file(FF_PKT *ff) { int i, j, k; @@ -212,7 +265,8 @@ static bool accept_file(FF_PKT *ff) int (*match_func)(const char *pattern, const char *string, int flags); if (ff->flags & FO_ENHANCEDWILD) { - match_func = enh_fnmatch; +// match_func = enh_fnmatch; + match_func = fnmatch; if ((basename = last_path_separator(ff->fname)) != NULL) basename++; else @@ -226,8 +280,7 @@ static bool accept_file(FF_PKT *ff) findFOPTS *fo = (findFOPTS *)incexe->opts_list.get(j); ff->flags = fo->flags; ff->GZIP_level = fo->GZIP_level; - ff->reader = fo->reader; - ff->writer = fo->writer; + ff->ignoredir = fo->ignoredir; ff->fstypes = fo->fstype; ff->drivetypes = fo->drivetype; @@ -339,8 +392,10 @@ static bool accept_file(FF_PKT *ff) } fnm_flags = (incexe->current_opts != NULL && incexe->current_opts->flags & FO_IGNORECASE) ? FNM_CASEFOLD : 0; - for (j=0; jname_list.size(); j++) { - if (fnmatch((char *)incexe->name_list.get(j), ff->fname, fnmode|fnm_flags) == 0) { + dlistString *node; + foreach_dlist(node, &incexe->name_list) { + char *fname = node->c_str(); + if (fnmatch(fname, ff->fname, fnmode|fnm_flags) == 0) { Dmsg1(100, "Reject wild2: %s\n", ff->fname); return false; /* reject file */ } @@ -354,10 +409,10 @@ static bool accept_file(FF_PKT *ff) * We filter the files, then call the user's callback if * the file is included. */ -static int our_callback(FF_PKT *ff, void *hpkt, bool top_level) +static int our_callback(JCR *jcr, FF_PKT *ff, bool top_level) { if (top_level) { - return ff->callback(ff, hpkt, top_level); /* accept file */ + return ff->file_save(jcr, ff, top_level); /* accept file */ } switch (ff->type) { case FT_NOACCESS: @@ -370,7 +425,8 @@ static int our_callback(FF_PKT *ff, void *hpkt, bool top_level) case FT_INVALIDFS: case FT_INVALIDDT: case FT_NOOPEN: -// return ff->callback(ff, hpkt, top_level); + case FT_REPARSE: +// return ff->file_save(jcr, ff, top_level); /* These items can be filtered */ case FT_LNKSAVED: @@ -384,8 +440,7 @@ static int our_callback(FF_PKT *ff, void *hpkt, bool top_level) case FT_SPEC: case FT_DIRNOCHG: if (accept_file(ff)) { -// Dmsg2(000, "Accept file %s; reader=%s\n", ff->fname, NPRT(ff->reader)); - return ff->callback(ff, hpkt, top_level); + return ff->file_save(jcr, ff, top_level); } else { Dmsg1(100, "Skip file %s\n", ff->fname); return -1; /* ignore this file */ @@ -405,10 +460,16 @@ static int our_callback(FF_PKT *ff, void *hpkt, bool top_level) int term_find_files(FF_PKT *ff) { - int hard_links; + int hard_links; - free_pool_memory(ff->sys_fname); - hard_links = term_find_one(ff); - free(ff); - return hard_links; + free_pool_memory(ff->sys_fname); + if (ff->fname_save) { + free_pool_memory(ff->fname_save); + } + if (ff->link_save) { + free_pool_memory(ff->link_save); + } + hard_links = term_find_one(ff); + free(ff); + return hard_links; }