/*
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.
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.
#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;
/* Get system path and filename maximum lengths */
path_max = pathconf(".", _PC_PATH_MAX);
- if (path_max < 1024) {
- path_max = 1024;
+ if (path_max < 2048) {
+ path_max = 2048;
}
name_max = pathconf(".", _PC_NAME_MAX);
- if (name_max < 1024) {
- name_max = 1024;
+ if (name_max < 2048) {
+ name_max = 2048;
}
path_max++; /* add for EOS */
name_max++; /* add for EOS */
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
* 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;
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(000, "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; i<fileset->include_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; i<fileset->exclude_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;
* 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:
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:
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 */