/*
- * File types as returned by find_files()
- *
- * Kern Sibbald MIM
- */
-/*
- Copyright (C) 2000-2003 Kern Sibbald and John Walker
+ Bacula® - The Network Backup Solution
+
+ Copyright (C) 2001-2010 Free Software Foundation Europe e.V.
- 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.
+ 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 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
+ 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.
+ 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., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA.
+ 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.
+*/
+/*
+ * File types as returned by find_files()
+ *
+ * Kern Sibbald MMI
*/
#ifndef __FILES_H
#define __FILES_H
#include "jcr.h"
+#include "bfile.h"
+#include "../filed/fd_plugins.h"
#ifdef HAVE_DIRENT_H
#include <dirent.h>
#endif
#include <sys/file.h>
+#if !defined(HAVE_WIN32) || defined(HAVE_MINGW)
+#include <sys/param.h>
+#endif
#if HAVE_UTIME_H
#include <utime.h>
#else
#define MODE_RALL (S_IRUSR|S_IRGRP|S_IROTH)
-#ifdef HAVE_FNMATCH
-#include <fnmatch.h>
-#else
#include "lib/fnmatch.h"
-#endif
+// #include "lib/enh_fnmatch.h"
-#include "save-cwd.h"
+#ifndef HAVE_REGEX_H
+#include "lib/bregex.h"
+#else
+#include <regex.h>
+#endif
#ifndef HAVE_READDIR_R
int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
#endif
-
-/*
- * Status codes returned by create_file()
+/*
+ * Options saved int "options" of the include/exclude lists.
+ * They are directly jammed ito "flag" of ff packet
*/
-#define CF_SKIP 1 /* skip file (not newer or something) */
-#define CF_ERROR 2 /* error creating file */
-#define CF_EXTRACT 3 /* file created, data to extract */
-#define CF_CREATED 4 /* file created, no data to extract */
-
-/*
- * NOTE!!! These go on the tape, so don't change them. If
- * need be, add to them.
- */
-#define FT_LNKSAVED 1 /* hard link to file already saved */
-#define FT_REGE 2 /* Regular file but empty */
-#define FT_REG 3 /* Regular file */
-#define FT_LNK 4 /* Soft Link */
-#define FT_DIR 5 /* Directory */
-#define FT_SPEC 6 /* Special file -- chr, blk, fifo, sock */
-#define FT_NOACCESS 7 /* Not able to access */
-#define FT_NOFOLLOW 8 /* Could not follow link */
-#define FT_NOSTAT 9 /* Could not stat file */
-#define FT_NOCHG 10 /* Incremental option, file not changed */
-#define FT_DIRNOCHG 11 /* Incremental option, directory not changed */
-#define FT_ISARCH 12 /* Trying to save archive file */
-#define FT_NORECURSE 13 /* No recursion into directory */
-#define FT_NOFSCHG 14 /* Different file system, prohibited */
-#define FT_NOOPEN 15 /* Could not open directory */
-#define FT_RAW 16 /* Raw block device */
-#define FT_FIFO 17 /* Raw fifo device */
-
-/* Options saved in "flag" of ff packet */
-#define FO_MD5 0x001 /* Do MD5 checksum */
-#define FO_GZIP 0x002 /* Do Zlib compression */
-#define FO_NO_RECURSION 0x004 /* no recursion in directories */
-#define FO_MULTIFS 0x008 /* multiple file systems */
-#define FO_SPARSE 0x010 /* do sparse file checking */
-#define FO_IF_NEWER 0x020 /* replace if newer */
-#define FO_NOREPLACE 0x040 /* never replace */
-#define FO_READFIFO 0x080 /* read data from fifo */
-#define FO_SHA1 0x100 /* Do SHA1 checksum */
-
-/*
- * Options saved in "options" of include list
- * These are now directly jammed into ff->flags, so the above
- * FO_xxx options may be used
- *
- * ***FIXME*** replace all OPT_xxx with FO_xxx or vise-versa
- */
-#define OPT_compute_MD5 0x01 /* compute MD5 of file's data */
-#define OPT_GZIP_compression 0x02 /* use GZIP compression */
-#define OPT_no_recursion 0x04 /* no recursion in directories */
-#define OPT_multifs 0x08 /* multiple file systems */
-#define OPT_sparse 0x10 /* do sparse file checking */
-#define OPT_replace_if_newer 0x20 /* replace file if newer */
-#define OPT_never_replace 0x40 /* never replace */
-#define OPT_read_fifo 0x80 /* read data from fifo (named pipe) */
-#define OPT_compute_SHA1 0x100 /* compute SHA1 of file's data */
-
+#define FO_MD5 (1<<1) /* Do MD5 checksum */
+#define FO_GZIP (1<<2) /* Do Zlib compression */
+#define FO_NO_RECURSION (1<<3) /* no recursion in directories */
+#define FO_MULTIFS (1<<4) /* multiple file systems */
+#define FO_SPARSE (1<<5) /* do sparse file checking */
+#define FO_IF_NEWER (1<<6) /* replace if newer */
+#define FO_NOREPLACE (1<<7) /* never replace */
+#define FO_READFIFO (1<<8) /* read data from fifo */
+#define FO_SHA1 (1<<9) /* Do SHA1 checksum */
+#define FO_PORTABLE (1<<10) /* Use portable data format -- no BackupWrite */
+#define FO_MTIMEONLY (1<<11) /* Use mtime rather than mtime & ctime */
+#define FO_KEEPATIME (1<<12) /* Reset access time */
+#define FO_EXCLUDE (1<<13) /* Exclude file */
+#define FO_ACL (1<<14) /* Backup ACLs */
+#define FO_NO_HARDLINK (1<<15) /* don't handle hard links */
+#define FO_IGNORECASE (1<<16) /* Ignore file name case */
+#define FO_HFSPLUS (1<<17) /* Resource forks and Finder Info */
+#define FO_WIN32DECOMP (1<<18) /* Use BackupRead decomposition */
+#define FO_SHA256 (1<<19) /* Do SHA256 checksum */
+#define FO_SHA512 (1<<20) /* Do SHA512 checksum */
+#define FO_ENCRYPT (1<<21) /* Encrypt data stream */
+#define FO_NOATIME (1<<22) /* Use O_NOATIME to prevent atime change */
+#define FO_ENHANCEDWILD (1<<23) /* Enhanced wild card processing */
+#define FO_CHKCHANGES (1<<24) /* Check if file have been modified during backup */
+#define FO_STRIPPATH (1<<25) /* Check for stripping path */
+#define FO_HONOR_NODUMP (1<<26) /* honor NODUMP flag */
+#define FO_XATTR (1<<27) /* Backup Extended Attributes */
struct s_included_file {
struct s_included_file *next;
- int options; /* backup options */
- int level; /* compression level */
- int len; /* length of fname */
- int pattern; /* set if pattern */
- char VerifyOpts[20]; /* Options for verify */
+ uint32_t options; /* backup options */
+ int level; /* compression level */
+ int len; /* length of fname */
+ int pattern; /* set if wild card pattern */
+ char VerifyOpts[20]; /* Options for verify */
char fname[1];
};
char fname[1];
};
-#ifdef HAVE_CYGWIN
-
-#include <windows.h>
-
-#define BF_CLOSED 0
-#define BF_READ 1 /* BackupRead */
-#define BF_WRITE 2 /* BackupWrite */
+/* FileSet definitions very similar to the resource
+ * contained in the Director because the components
+ * of the structure are passed by the Director to the
+ * File daemon and recompiled back into this structure
+ */
+#undef MAX_FOPTS
+#define MAX_FOPTS 30
+
+enum {
+ state_none,
+ state_options,
+ state_include,
+ state_error
+};
-/* Basic low level I/O file packet */
-typedef struct s_bfile {
- int use_win_api; /* set if using WinAPI */
- int mode; /* set if file is open */
- HANDLE fh; /* Win32 file handle */
- int fid; /* fd if doing Unix style */
- LPVOID lpContext; /* BackupRead/Write context */
- POOLMEM *errmsg; /* error message buffer */
- DWORD rw_bytes; /* Bytes read or written */
- DWORD lerror; /* Last error code */
-} BFILE;
+/* File options structure */
+struct findFOPTS {
+ uint32_t flags; /* options in bits */
+ int GZIP_level; /* GZIP level */
+ int strip_path; /* strip path count */
+ char VerifyOpts[MAX_FOPTS]; /* verify options */
+ char AccurateOpts[MAX_FOPTS]; /* accurate mode options */
+ char BaseJobOpts[MAX_FOPTS]; /* basejob mode options */
+ alist regex; /* regex string(s) */
+ alist regexdir; /* regex string(s) for directories */
+ alist regexfile; /* regex string(s) for files */
+ alist wild; /* wild card strings */
+ alist wilddir; /* wild card strings for directories */
+ alist wildfile; /* wild card strings for files */
+ alist wildbase; /* wild card strings for basenames */
+ alist base; /* list of base names */
+ alist fstype; /* file system type limitation */
+ alist drivetype; /* drive type limitation */
+};
-#else
-/* Basic low level I/O file packet */
-typedef struct s_bfile {
- int fid; /* file id on Unix */
-} BFILE;
+/* This is either an include item or an exclude item */
+struct findINCEXE {
+ findFOPTS *current_opts; /* points to current options structure */
+ alist opts_list; /* options list */
+ dlist name_list; /* filename list -- holds dlistString */
+ dlist plugin_list; /* plugin list -- holds dlistString */
+ char *ignoredir; /* ignore directories with this file */
+};
-#endif
+/*
+ * FileSet Resource
+ *
+ */
+struct findFILESET {
+ int state;
+ findINCEXE *incexe; /* current item */
+ alist include_list;
+ alist exclude_list;
+};
+struct HFSPLUS_INFO {
+ unsigned long length; /* Mandatory field */
+ char fndrinfo[32]; /* Finder Info */
+ off_t rsrclength; /* Size of resource fork */
+};
/*
* Definition of the find_files packet passed as the
* first argument to the find_files callback subroutine.
*/
-typedef struct s_ff {
- char *fname; /* filename */
- char *link; /* link if file linked */
- POOLMEM *sys_fname; /* system filename */
- struct stat statp; /* stat packet */
- uint32_t FileIndex; /* FileIndex of this file */
- uint32_t LinkFI; /* FileIndex of main hard linked file */
- struct f_link *linked; /* Set if we are hard linked */
- int type; /* FT_ type from above */
- int flags; /* control flags */
- int ff_errno; /* errno */
- int incremental; /* do incremental save */
- BFILE bfd; /* Bacula file descriptor */
- time_t save_time; /* start of incremental time */
- int mtime_only; /* incremental on mtime_only */
- int dereference; /* follow links */
- int GZIP_level; /* compression level */
- int atime_preserve; /* preserve access times */
- int null_output_device; /* using null output device */
+struct FF_PKT {
+ char *top_fname; /* full filename before descending */
+ char *fname; /* full filename */
+ char *link; /* link if file linked */
+ char *object_name; /* Object name */
+ char *object; /* restore object */
+ POOLMEM *sys_fname; /* system filename */
+ POOLMEM *fname_save; /* save when stripping path */
+ POOLMEM *link_save; /* save when stripping path */
+ struct stat statp; /* stat packet */
+ int32_t FileIndex; /* FileIndex of this file */
+ int32_t LinkFI; /* FileIndex of main hard linked file */
+ int32_t object_index; /* Object index */
+ int32_t object_len; /* Object length */
+ int32_t object_compression; /* Type of compression for object */
+ struct f_link *linked; /* Set if this file is hard linked */
+ int type; /* FT_ type from above */
+ int ff_errno; /* errno */
+ BFILE bfd; /* Bacula file descriptor */
+ time_t save_time; /* start of incremental time */
+ bool dereference; /* follow links (not implemented) */
+ bool null_output_device; /* using null output device */
+ bool incremental; /* incremental save */
char VerifyOpts[20];
+ char AccurateOpts[20];
+ char BaseJobOpts[20];
struct s_included_file *included_files_list;
struct s_excluded_file *excluded_files_list;
struct s_excluded_file *excluded_paths_list;
-
- struct f_link *linklist; /* hard linked files */
-} FF_PKT;
+ findFILESET *fileset;
+ int (*file_save)(JCR *, FF_PKT *, bool); /* User's callback */
+ int (*plugin_save)(JCR *, FF_PKT *, bool); /* User's callback */
+ bool (*check_fct)(JCR *, FF_PKT *); /* optionnal user fct to check file changes */
+
+ /* Values set by accept_file while processing Options */
+ uint32_t flags; /* backup options */
+ int GZIP_level; /* compression level */
+ int strip_path; /* strip path count */
+ bool cmd_plugin; /* set if we have a command plugin */
+ alist fstypes; /* allowed file system types */
+ alist drivetypes; /* allowed drive types */
+
+ /* List of all hard linked files found */
+ struct f_link **linkhash; /* hard linked files */
+
+ /* Darwin specific things.
+ * To avoid clutter, we always include rsrc_bfd and volhas_attrlist */
+ BFILE rsrc_bfd; /* fd for resource forks */
+ bool volhas_attrlist; /* Volume supports getattrlist() */
+ struct HFSPLUS_INFO hfsinfo; /* Finder Info and resource fork size */
+};
#include "protos.h"