+++ /dev/null
-diff -Naur bacula1/src/dird/inc_conf.c bacula2/src/dird/inc_conf.c
---- bacula1/src/dird/inc_conf.c 2007-02-19 20:44:13.000000000 +0100
-+++ bacula2/src/dird/inc_conf.c 2007-02-19 20:44:33.000000000 +0100
-@@ -120,6 +120,7 @@
- {"noatime", store_opts, {0}, 0, 0, 0},
- {"enhancedwild", store_opts, {0}, 0, 0, 0},
- {"drivetype", store_drivetype, {0}, 0, 0, 0},
-+ {"checkchanges", store_opts, {0}, 0, 0, 0},
- {NULL, NULL, {0}, 0, 0, 0}
- };
-
-@@ -145,7 +146,8 @@
- INC_KW_IGNORECASE,
- INC_KW_HFSPLUS,
- INC_KW_NOATIME,
-- INC_KW_ENHANCEDWILD
-+ INC_KW_ENHANCEDWILD,
-+ INC_KW_CHKCHANGES
- };
-
- /*
-@@ -174,6 +176,7 @@
- {"hfsplussupport", INC_KW_HFSPLUS},
- {"noatime", INC_KW_NOATIME},
- {"enhancedwild", INC_KW_ENHANCEDWILD},
-+ {"checkchanges", INC_KW_CHKCHANGES},
- {NULL, 0}
- };
-
-@@ -239,6 +242,8 @@
- {"no", INC_KW_NOATIME, "0"},
- {"yes", INC_KW_ENHANCEDWILD, "K"},
- {"no", INC_KW_ENHANCEDWILD, "0"},
-+ {"yes", INC_KW_CHKCHANGES, "c"},
-+ {"no", INC_KW_CHKCHANGES, "0"},
- {NULL, 0, 0}
- };
-
-diff -Naur bacula1/src/filed/backup.c bacula2/src/filed/backup.c
---- bacula1/src/filed/backup.c 2007-02-19 20:44:13.000000000 +0100
-+++ bacula2/src/filed/backup.c 2007-02-19 20:47:14.000000000 +0100
-@@ -453,7 +453,13 @@
- }
-
- stat = send_data(jcr, data_stream, ff_pkt, digest, signing_digest);
-+
-+ if (ff_pkt->flags & FO_CHKCHANGES) {
-+ has_file_changed(jcr, ff_pkt);
-+ }
-+
- bclose(&ff_pkt->bfd);
-+
- if (!stat) {
- return 0;
- }
-diff -Naur bacula1/src/filed/job.c bacula2/src/filed/job.c
---- bacula1/src/filed/job.c 2007-02-19 20:44:13.000000000 +0100
-+++ bacula2/src/filed/job.c 2007-02-19 20:44:33.000000000 +0100
-@@ -1021,6 +1021,9 @@
- case 'K':
- fo->flags |= FO_NOATIME;
- break;
-+ case 'c':
-+ fo->flags |= FO_CHKCHANGES;
-+ break;
- default:
- Emsg1(M_ERROR, 0, _("Unknown include/exclude option: %c\n"), *p);
- break;
-diff -Naur bacula1/src/findlib/find.h bacula2/src/findlib/find.h
---- bacula1/src/findlib/find.h 2007-02-19 20:44:16.000000000 +0100
-+++ bacula2/src/findlib/find.h 2007-02-19 20:44:33.000000000 +0100
-@@ -107,6 +107,7 @@
- #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 */
-
- struct s_included_file {
- struct s_included_file *next;
-diff -Naur bacula1/src/findlib/find_one.c bacula2/src/findlib/find_one.c
---- bacula1/src/findlib/find_one.c 2007-02-19 20:44:16.000000000 +0100
-+++ bacula2/src/findlib/find_one.c 2007-02-19 20:44:33.000000000 +0100
-@@ -271,6 +271,51 @@
- return false;
- }
-
-+/* check if a file have changed during backup and display an error */
-+bool has_file_changed(JCR *jcr, FF_PKT *ff_pkt)
-+{
-+ struct stat statp;
-+ Dmsg1(500, "has_file_changed fname=%s\n",ff_pkt->fname);
-+
-+ if (ff_pkt->type != FT_REG) { /* not a regular file */
-+ return false;
-+ }
-+
-+ if (lstat(ff_pkt->fname, &statp) != 0) {
-+ berrno be;
-+ Jmsg(jcr, M_WARNING, 0,
-+ _("Cannot stat file %s: ERR=%s\n"),ff_pkt->fname,be.strerror());
-+ return true;
-+ }
-+
-+ if (statp.st_mtime != ff_pkt->statp.st_mtime) {
-+ /* TODO: add time of changes */
-+ Jmsg(jcr, M_ERROR, 0, _("%s mtime changed during backup.\n"), ff_pkt->fname);
-+ return true;
-+ }
-+
-+ if (statp.st_ctime != ff_pkt->statp.st_ctime) {
-+ /* TODO: add time of changes */
-+ Jmsg(jcr, M_ERROR, 0, _("%s ctime changed during backup.\n"), ff_pkt->fname);
-+ return true;
-+ }
-+
-+ if (statp.st_size != ff_pkt->statp.st_size) {
-+ /* TODO: add size change */
-+ Jmsg(jcr, M_ERROR, 0, _("%s size changed during backup.\n"),ff_pkt->fname);
-+ return true;
-+ }
-+
-+ if ((statp.st_blksize*statp.st_blocks) !=
-+ (ff_pkt->statp.st_blksize*ff_pkt->statp.st_blocks)) {
-+ /* TODO: add size change */
-+ Jmsg(jcr, M_ERROR, 0, _("%s size changed during backup.\n"),ff_pkt->fname);
-+ return true;
-+ }
-+
-+ return false;
-+}
-+
- /*
- * Find a single file.
- * handle_file is the callback for handling the file.
-diff -Naur bacula1/src/findlib/protos.h bacula2/src/findlib/protos.h
---- bacula1/src/findlib/protos.h 2007-02-19 20:44:16.000000000 +0100
-+++ bacula2/src/findlib/protos.h 2007-02-19 20:44:33.000000000 +0100
-@@ -65,7 +65,7 @@
- int handle_file(FF_PKT *ff_pkt, void *hpkt, bool top_level),
- void *pkt, char *p, dev_t parent_device, bool top_level);
- int term_find_one(FF_PKT *ff);
--
-+bool has_file_changed(JCR *jcr, FF_PKT *ff_pkt);
-
- /* From get_priv.c */
- int enable_backup_privileges(JCR *jcr, int ignore_errors);
-diff -Naur bacula1/src/win32/dll/bacula.def bacula2/src/win32/dll/bacula.def
---- bacula1/src/win32/dll/bacula.def 2007-02-28 14:35:43.000000000 +0100
-+++ bacula2/src/win32/dll/bacula.def 2007-03-01 11:15:50.000000000 +0100
-@@ -80,6 +80,8 @@
-
- ; find_one.c:
- _Z13find_one_fileP3JCRP6FF_PKTPFiS2_PvbES3_Pcjb
-+_Z17has_file_changedP3JCRP6FF_PKT
-+
-
- ; fstype.c:
- _Z6fstypePKcPci
-
-
+++ /dev/null
-From: Eric Bollengier <eric at homelinux dot org>
-
-Check size, age of each file after their backup to see if
-they have changed during backup.
-
-This patch ask to fd to do an extra check (stat(2)) after
-each file backup. mtime, ctime and size are compared with
-"before backup" informations. If time or size mismatch, an
-error will raise.
-
-You must upgrade FD and DIR at the same time.
-
-TODO:
- - Add documentation
- - Add informations on warning/error messages
-
-Configuration :
-
-FileSet {
- Name = "Full Set"
- Include {
- Options {
- checkchanges = yes # use this to enable it
- }
- File = /tmp/bacula
- }
-}
-
-Output :
-
-17-fév 18:03 zog-fd: Client1.2007-02-17_18.02.21 Error: /tmp/bacula/etc/toto have changed during backup.
-17-fév 18:03 zog-fd: Client1.2007-02-17_18.02.21 Error: /tmp/bacula/var/bacula/working/bacula.db size have changed during backup.
-17-fév 18:03 zog-sd: Job write elapsed time = 00:00:03, Transfer rate = 22.94 M bytes/second
-17-fév 18:03 zog-dir: Bacula 2.1.4 (12Feb07): 17-fév-2007 18:03:01
- JobId: 3
- Job: Client1.2007-02-17_18.02.21
- Backup Level: Incremental, since=2007-02-17 17:58:56
- Client: "zog-fd" 2.1.4 (12Feb07) i686-pc-linux-gnu,debian,testing/unstable
- FileSet: "Full Set" 2007-02-17 17:57:36
- Pool: "Default" (From Job resource)
- Storage: "File" (From Job resource)
- Scheduled time: 17-fév-2007 18:02:19
-...
- Volume Session Time: 1171731706
- Last Volume Bytes: 5,973,631 (5.973 MB)
- Non-fatal FD errors: 2
- SD Errors: 0
- FD termination status: OK
- SD termination status: OK
- Termination: Backup OK -- with warnings
-
-
-
-$Log$
-