X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Ffindlib%2Ffind.c;h=0a4599e43a7859163c423dbacd0304df0a86fb69;hb=f316834a92996bce1d360a6d7464d49bb9b9f127;hp=3f0ad75377075efa199937d525c41f8b4a7135ca;hpb=035f756cdacc3580377fb7bce83a547ec76449d7;p=bacula%2Fbacula diff --git a/bacula/src/findlib/find.c b/bacula/src/findlib/find.c index 3f0ad75377..0a4599e43a 100644 --- a/bacula/src/findlib/find.c +++ b/bacula/src/findlib/find.c @@ -1,7 +1,7 @@ /* Bacula® - The Network Backup Solution - Copyright (C) 2000-2008 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. @@ -20,7 +20,7 @@ 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. @@ -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 @@ -153,16 +160,13 @@ get_win32_driveletters(FF_PKT *ff, char* szDrives) * 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; @@ -171,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,29 +191,70 @@ find_files(JCR *jcr, FF_PKT *ff, int callback(FF_PKT *ff_pkt, void *hpkt, bool t ff->fstypes = fo->fstype; ff->drivetypes = fo->drivetype; bstrncat(ff->VerifyOpts, fo->VerifyOpts, sizeof(ff->VerifyOpts)); + bstrncat(ff->AccurateOpts, fo->AccurateOpts, sizeof(ff->AccurateOpts)); } 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, his_pkt, ff->top_fname, (dev_t)-1, true) == 0) { + if (find_one_file(jcr, ff, our_callback, ff->top_fname, (dev_t)-1, true) == 0) { return 0; /* error return */ } } - 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; - generate_plugin_event(jcr, bEventPluginCommand, (void *)fname); - ff->cmd_plugin = false; + 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; @@ -234,6 +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->ignoredir = fo->ignoredir; ff->fstypes = fo->fstype; ff->drivetypes = fo->drivetype; @@ -362,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: @@ -379,7 +426,7 @@ static int our_callback(FF_PKT *ff, void *hpkt, bool top_level) case FT_INVALIDDT: case FT_NOOPEN: case FT_REPARSE: -// return ff->callback(ff, hpkt, top_level); +// return ff->file_save(jcr, ff, top_level); /* These items can be filtered */ case FT_LNKSAVED: @@ -393,7 +440,7 @@ static int our_callback(FF_PKT *ff, void *hpkt, bool top_level) case FT_SPEC: case FT_DIRNOCHG: if (accept_file(ff)) { - 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 */