=====================================
The entire GPL is reproduced in the manuals distributed with the
-Bacula documentation and can also be found online on the GNU web site as well
-as at www.bacula.org.
+Bacula documentation and can also be found online on the GNU web site
+as well as at www.bacula.org.
Certain parts of the Bacula software are licensed by their
copyright holder(s) undert the GPL with no modifications. These
[ possibly a Python event -- kes ]
===
+- Integrate Christopher's St. Bernard code.
- run_cmd() returns int should return JobId_t
- get_next_jobid_from_list() returns int should return JobId_t
- Document export LDFLAGS=-L/usr/lib64
then be migrated.
- Detect resource deadlock in Migrate when same job wants to read
and write the same device.
-- Make hardlink code at line 240 of find_one.c use binary search.
- Queue warning/error messages during restore so that they
are reported at the end of the report rather than being
hidden in the file listing ...
- Look at fixing restore status stats in SD.
- Make selection of Database used in restore correspond to
client.
+- Look at using ioctl(FIMAP) and FIGETBSZ for sparse files.
+ http://www.informatik.uni-frankfurt.de/~loizides/reiserfs/fibmap.html
- Implement a mode that says when a hard read error is
encountered, read many times (as it currently does), and if the
block cannot be read, skip to the next block, and try again. If
("D","Diff"),
("I","Inc");
- Add ACL to restore only to original location.
+- Show files/second in client status output.
- Add a recursive mark command (rmark) to restore.
- "Minimum Job Interval = nnn" sets minimum interval between Jobs
of the same level and does not permit multiple simultaneous
- Fix Maximum Changer Wait, Maximum Open Wait, Maximum Rewind Wait to
accept time qualifiers.
- Does ClientRunAfterJob fail the job on a bad return code?
+- Make hardlink code at line 240 of find_one.c use binary search.
Kern Sibbald
General:
+26Apr06
+- Implement an NT_() macro to indicate that text should NOT
+ be translated.
+- Fix a number of incorrect strings marked for translation, when
+ they should not be (e.g. commands).
+- Fix StartTime bug reported for ClientRunBeforeJob and RunBeforeJob
+ Patches supplied by user in bugs #608 and #599.
+- Use most recent of st_ctime and st_mtime in restore tree DIR
+ listing. This fixes some problems with Win32 printing incorrect
+ values.
+- Correct the clock shift comm time calculation between the DIR
+ and the FD. It was added rather than subtracted.
+- Strip all backslashes in filenames to be restored on Win32
+ machines -- the names should all be in Unix format, and if
+ there are any backslashes it is most likely due to an improper
+ FileSet definition, and the files will not otherwise be
+ restorable.
+- Remove lib/regex.c (replaced by bregex.c).
+- Delete src/win32/License.txt
+- Modify installer to install LICENSE
+25Apr06
+- Add back ua_label barcode fix from Rufolf Cejka.
+23Apr06
+- Add 'Dir Status' button to the gnome console.
+- Display heap stats in Storage daemon without debug level.
+22Apr06
+- Integrate most of the MinGW changes -- more to do.
+21Apr06
+- Implement using pg_config for finding PostgreSQL files.
+ Fixes bug #600. Patch supplied by user.
+- Remove -t option from mktemp in mtx_changer.in and use
+ working directory. Fixes bug #578.
+- Update job start time after the any run before job so that
+ files created by the script are only backed up once. Fixes
+ bug #599.
+- Strip trailing newline only from filenames entered in
+ the restore command when reading a file. This permits
+ the user to enter filenames with trailing spaces. Fixes
+ bug #549. The user supplied a patch that I modified slightly.
+- Use the most recent time (st_mtime, st_ctime) in the dir
+ command in restore. This gives the user a better idea of what
+ the newest file really is. This fixes bug #574. The fix
+ was suggested by the user.
+18Apr06
+- Remove the -f option from the chown in Makefile.in for more
+ portability.
+- Change setting the group in Makefile.in to use chgrp for
+ more portability.
+- Implement a Bacula read/write lock for Python rather
+ than using the Python lock to avoid recursive problems.
+- Correct the uninstall directory names in filed/Makefile.in
+ as reported by a user.
+
Release 1.38.8 (14Apr06) released 14Apr06
15Apr06
- Correct Makefile bug found by Dan Langille.
Kern Sibbald
General:
+28Apr06
+- Start implementing Christopher's St.Bernard code.
+- Add Christopher's mods for opening files.
+- Strip \r \n from Win32 error messages (Christopher)
+- Add more info about Win32 system if unknown (Christopher)
+- Use bstrn(cpy, cat) routines to avoid overrun in compat.cpp
+- Fix a number of incorrect strings marked for translation, when
+ they should not be (e.g. commands).
+- Fix StartTime bug reported for ClientRunBeforeJob and RunBeforeJob
+ Patches supplied by user in bugs #608 and #599.
+- Use most recent of st_ctime and st_mtime in restore tree DIR
+ listing. This fixes some problems with Win32 printing incorrect
+ values.
+- Correct the clock shift comm time calculation between the DIR
+ and the FD. It was added rather than subtracted.
+- Strip all backslashes in filenames to be restored on Win32
+ machines -- the names should all be in Unix format, and if
+ there are any backslashes it is most likely due to an improper
+ FileSet definition, and the files will not otherwise be
+ restorable.
+- Remove lib/regex.c (replaced by bregex.c).
+- Delete src/win32/License.txt
+- Modify installer to install LICENSE
26Apr06
- Fix bug in build-win32-cross-tools script reported by Howard
- Implement cross compiled bconsole
goto bail_out;
}
+ /*
+ * We re-update the job start record so that the start
+ * time is set after the run before job. This avoids
+ * that any files created by the run before job will
+ * be saved twice. They will be backed up in the current
+ * job, but not in the next one unless they are changed.
+ * Without this, they will be backed up in this job and
+ * in the next job run because in that case, their date
+ * is after the start of this run.
+ */
+ jcr->start_time = time(NULL);
+ jcr->jr.StartTime = jcr->start_time;
+ if (!db_update_job_start_record(jcr, jcr->db, &jcr->jr)) {
+ Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db));
+ }
+
/* Send backup command */
bnet_fsend(fd, backupcmd);
if (!response(jcr, fd, OKbackup, "backup", DISPLAY_ERROR)) {
char ed1[50];
stime = str_to_utime(jcr->stime);
- bnet_fsend(fd, levelcmd, _("since_utime "), edit_uint64(stime, ed1), 0);
+ bnet_fsend(fd, levelcmd, NT_("since_utime "), edit_uint64(stime, ed1), 0);
while (bget_dirmsg(fd) >= 0) { /* allow him to poll us to sync clocks */
Jmsg(jcr, M_INFO, 0, "%s\n", fd->msg);
}
* in the next job run because in that case, their date
* is after the start of this run.
*/
+ jcr->start_time = time(NULL);
+ jcr->jr.StartTime = jcr->start_time;
if (!db_update_job_start_record(jcr, jcr->db, &jcr->jr)) {
Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db));
}
goto bail_out;
}
since_time = str_to_uint64(buf); /* this is the since time */
+ Dmsg1(100, "since_time=%d\n", (int)since_time);
char ed1[50], ed2[50];
/*
* Sync clocks by polling him for the time. We take
}
his_time = str_to_uint64(buf);
rt = get_current_btime() - bt_start; /* compute round trip time */
- bt_adj -= his_time - bt_start - rt/2;
- Dmsg2(200, "rt=%s adj=%s\n", edit_uint64(rt, ed1), edit_uint64(bt_adj, ed2));
+ Dmsg2(100, "Dirtime=%s FDtime=%s\n", edit_uint64(his_time, ed1),
+ edit_uint64(bt_start, ed2));
+ bt_adj += bt_start - his_time - rt/2;
+ Dmsg2(100, "rt=%s adj=%s\n", edit_uint64(rt, ed1), edit_uint64(bt_adj, ed2));
}
bt_adj = bt_adj / 8; /* compute average time */
}
jcr->buf_size = sd->msglen;
+#ifdef stbernard_implemented
+/ #if defined(HAVE_WIN32)
+ bool bResumeOfmOnExit = FALSE;
+ if (isOpenFileManagerRunning()) {
+ if ( pauseOpenFileManager() ) {
+ Jmsg(jcr, M_INFO, 0, _("Open File Manager paused\n") );
+ bResumeOfmOnExit = TRUE;
+ }
+ else {
+ Jmsg(jcr, M_ERROR, 0, _("FAILED to pause Open File Manager\n") );
+ }
+ }
+ {
+ char username[UNLEN+1];
+ DWORD usize = sizeof(username);
+ int privs = enable_backup_privileges(NULL, 1);
+ if (GetUserName(username, &usize)) {
+ Jmsg2(jcr, M_INFO, 0, _("Running as '%s'. Privmask=%#08x\n"), username,
+ } else {
+ Jmsg(jcr, M_WARNING, 0, _("Failed to retrieve current UserName\n"));
+ }
+ }
+#endif
+
#ifdef HAVE_LIBZ
uint32_t compress_buf_size = jcr->buf_size + 12 + ((jcr->buf_size+999) / 1000) + 100;
jcr->compress_buf = (char *)bmalloc(compress_buf_size);
sizeof(off_t), sizeof(size_t), debug_level, get_trace());
sendit(msg, len, arg);
- list_terminated_jobs(sendit, arg);
-
/*
* List running jobs
*/
}
endeach_jcr(njcr);
- Dmsg0(1000, "Begin status jcr loop.\n");
if (!found) {
len = Mmsg(msg, _("No Jobs running.\n"));
sendit(msg, len, arg);
}
len = Mmsg(msg, _("====\n"));
sendit(msg, len, arg);
+
+ list_terminated_jobs(sendit, arg);
+
free_pool_memory(msg);
}
dwflags = 0;
}
- // unicode or ansii open for create write
- if (p_CreateFileW && p_MultiByteToWideChar) {
- bfd->fh = p_CreateFileW((LPCWSTR)win32_fname_wchar,
- dwaccess, /* Requested access */
- 0, /* Shared mode */
- NULL, /* SecurityAttributes */
- CREATE_ALWAYS, /* CreationDisposition */
- dwflags, /* Flags and attributes */
- NULL); /* TemplateFile */
- }
- else {
- bfd->fh = p_CreateFileA(win32_fname,
- dwaccess, /* Requested access */
- 0, /* Shared mode */
- NULL, /* SecurityAttributes */
- CREATE_ALWAYS, /* CreationDisposition */
- dwflags, /* Flags and attributes */
- NULL); /* TemplateFile */
- }
-
+ // unicode or ansii open for create write
+ if (p_CreateFileW && p_MultiByteToWideChar) {
+ bfd->fh = p_CreateFileW((LPCWSTR)win32_fname_wchar,
+ dwaccess, /* Requested access */
+ 0, /* Shared mode */
+ NULL, /* SecurityAttributes */
+ CREATE_ALWAYS, /* CreationDisposition */
+ dwflags, /* Flags and attributes */
+ NULL); /* TemplateFile */
+ } else {
+ bfd->fh = p_CreateFileA(win32_fname,
+ dwaccess, /* Requested access */
+ 0, /* Shared mode */
+ NULL, /* SecurityAttributes */
+ CREATE_ALWAYS, /* CreationDisposition */
+ dwflags, /* Flags and attributes */
+ NULL); /* TemplateFile */
+ }
bfd->mode = BF_WRITE;
dwflags = 0;
}
- // unicode or ansii open for open existing write
- if (p_CreateFileW && p_MultiByteToWideChar) {
- bfd->fh = p_CreateFileW((LPCWSTR)win32_fname_wchar,
- dwaccess, /* Requested access */
- 0, /* Shared mode */
- NULL, /* SecurityAttributes */
- OPEN_EXISTING, /* CreationDisposition */
- dwflags, /* Flags and attributes */
- NULL); /* TemplateFile */
- }
- else {
- bfd->fh = p_CreateFileA(win32_fname,
- dwaccess, /* Requested access */
- 0, /* Shared mode */
- NULL, /* SecurityAttributes */
- OPEN_EXISTING, /* CreationDisposition */
- dwflags, /* Flags and attributes */
- NULL); /* TemplateFile */
+ // unicode or ansii open for open existing write
+ if (p_CreateFileW && p_MultiByteToWideChar) {
+ bfd->fh = p_CreateFileW((LPCWSTR)win32_fname_wchar,
+ dwaccess, /* Requested access */
+ 0, /* Shared mode */
+ NULL, /* SecurityAttributes */
+ OPEN_EXISTING, /* CreationDisposition */
+ dwflags, /* Flags and attributes */
+ NULL); /* TemplateFile */
+ } else {
+ bfd->fh = p_CreateFileA(win32_fname,
+ dwaccess, /* Requested access */
+ 0, /* Shared mode */
+ NULL, /* SecurityAttributes */
+ OPEN_EXISTING, /* CreationDisposition */
+ dwflags, /* Flags and attributes */
+ NULL); /* TemplateFile */
- }
+ }
bfd->mode = BF_WRITE;
}
// unicode or ansii open for open existing read
- if (p_CreateFileW && p_MultiByteToWideChar) {
- bfd->fh = p_CreateFileW((LPCWSTR)win32_fname_wchar,
- dwaccess, /* Requested access */
- dwshare, /* Share modes */
- NULL, /* SecurityAttributes */
- OPEN_EXISTING, /* CreationDisposition */
- dwflags, /* Flags and attributes */
- NULL); /* TemplateFile */
- }
- else {
- bfd->fh = p_CreateFileA(win32_fname,
- dwaccess, /* Requested access */
- dwshare, /* Share modes */
- NULL, /* SecurityAttributes */
- OPEN_EXISTING, /* CreationDisposition */
- dwflags, /* Flags and attributes */
- NULL); /* TemplateFile */
- }
+ if (p_CreateFileW && p_MultiByteToWideChar) {
+ bfd->fh = p_CreateFileW((LPCWSTR)win32_fname_wchar,
+ dwaccess, /* Requested access */
+ dwshare, /* Share modes */
+ NULL, /* SecurityAttributes */
+ OPEN_EXISTING, /* CreationDisposition */
+ dwflags, /* Flags and attributes */
+ NULL); /* TemplateFile */
+ } else {
+ bfd->fh = p_CreateFileA(win32_fname,
+ dwaccess, /* Requested access */
+ dwshare, /* Share modes */
+ NULL, /* SecurityAttributes */
+ OPEN_EXISTING, /* CreationDisposition */
+ dwflags, /* Flags and attributes */
+ NULL); /* TemplateFile */
+ }
bfd->mode = BF_READ;
}
#undef VERSION
#define VERSION "1.39.10"
-#define BDATE "26 April 2006"
-#define LSMDATE "26Apr06"
+#define BDATE "28 April 2006"
+#define LSMDATE "28Apr06"
/* Debug flags */
#undef DEBUG
+++ /dev/null
-Copyright ©2002-2004, Kern Sibbald
-
-This software is provided 'as-is', without any express or implied
-warranty. In no event will the authors be held liable for any damages
-arising from the use of this software.
-
-Permission is granted to anyone to use this software for any purpose,
-including commercial applications, and to alter it and redistribute it
-freely, subject to the following restrictions:
-
-1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
-
-2. Altered versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
-
-3. This notice may not be removed or altered from any distribution.
0,
NULL);
- return (const char *) lpMsgBuf;
+ /* Strip any \r or \n */
+ char *rval = (char *) lpMsgBuf;
+ char *cp = strchr(rval, '\r');
+ if (cp != NULL) {
+ *cp = 0;
+ } else {
+ cp = strchr(rval, '\n');
+ if (cp != NULL)
+ *cp = 0;
+ }
+ return rval;
}
#ifndef HAVE_MINGW
char WIN_VERSION_LONG[64];
char WIN_VERSION[32];
+char WIN_RAWVERSION[32];
class winver {
public:
version = "Unknown";
platform = "Unknown";
}
- else
- switch (_mkversion(osvinfo.dwPlatformId, osvinfo.dwMajorVersion, osvinfo.dwMinorVersion))
+ const int ver = _mkversion(osvinfo.dwPlatformId,
+ osvinfo.dwMajorVersion,
+ osvinfo.dwMinorVersion);
+ snprintf(WIN_RAWVERSION, sizeof(WIN_RAWVERSION), "Windows %#08x", ver);
+ switch (ver)
{
case MS_WINDOWS_95: (version = "Windows 95"); break;
case MS_WINDOWS_98: (version = "Windows 98"); break;
case MS_WINDOWS_2K: (version = "Windows 2000");platform = "NT"; break;
case MS_WINDOWS_XP: (version = "Windows XP");platform = "NT"; break;
case MS_WINDOWS_S2003: (version = "Windows Server 2003");platform = "NT"; break;
- default: version = "Windows ??"; break;
+ default: version = WIN_RAWVERSION; break;
}
bstrncpy(WIN_VERSION_LONG, version, sizeof(WIN_VERSION_LONG));
HANDLE
CreateChildProcess(const char *cmdline, HANDLE in, HANDLE out, HANDLE err)
{
+ static const char *comspec = NULL;
PROCESS_INFORMATION piProcInfo;
STARTUPINFOA siStartInfo;
BOOL bFuncRetn = FALSE;
- // Set up members of the PROCESS_INFORMATION structure.
+ if (comspec == NULL) {
+ comspec = getenv("COMSPEC");
+ }
+ if (comspec == NULL) // should never happen
+ return INVALID_HANDLE_VALUE;
+ // Set up members of the PROCESS_INFORMATION structure.
ZeroMemory( &piProcInfo, sizeof(PROCESS_INFORMATION) );
// Set up members of the STARTUPINFO structure.
// Create the child process.
char exeFile[256];
+ int cmdLen = strlen(cmdline) + strlen(comspec) + 16;
- const char *comspec = getenv("COMSPEC");
-
- if (comspec == NULL) // should never happen
- return INVALID_HANDLE_VALUE;
+ char *cmdLine = (char *)alloca(cmdLen);
- char *cmdLine = (char *)alloca(strlen(cmdline) + strlen(comspec) + 16);
-
- strcpy(exeFile, comspec);
- strcpy(cmdLine, comspec);
- strcat(cmdLine, " /c ");
- strcat(cmdLine, cmdline);
+ bstrncpy(exeFile, comspec, sizeof(exeFile));
+ bstrncpy(cmdLine, comspec, cmdLen);
+ bstrncat(cmdLine, " /c ", cmdLen);
+ bstrncat(cmdLine, cmdline, cmdLen);
// try to execute program
bFuncRetn = CreateProcessA(exeFile,
utime(const char *fname, struct utimbuf *times)
{
FILETIME acc, mod;
- char tmpbuf[1024];
+ char tmpbuf[5000];
- conv_unix_to_win32_path(fname, tmpbuf, 1024);
+ conv_unix_to_win32_path(fname, tmpbuf, 5000);
cvt_utime_to_ftime(times->actime, acc);
cvt_utime_to_ftime(times->modtime, mod);
POOLMEM* pwszBuf = get_pool_memory(PM_FNAME);
make_win32_path_UTF8_2_wchar(&pwszBuf, tmpbuf);
- h = p_CreateFileW((LPCWSTR) pwszBuf,
+ h = p_CreateFileW((LPCWSTR)pwszBuf,
FILE_WRITE_ATTRIBUTES,
- FILE_SHARE_WRITE,
+ FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
- 0,
+ FILE_FLAG_BACKUP_SEMANTICS, // required for directories
NULL);
free_pool_memory(pwszBuf);
} else if (p_CreateFileA) {
h = p_CreateFileA(tmpbuf,
FILE_WRITE_ATTRIBUTES,
- FILE_SHARE_WRITE,
+ FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
- 0,
+ FILE_FLAG_BACKUP_SEMANTICS, // required for directories
NULL);
}
foo = p_CreateFileW((LPCWSTR) pwszBuf, access, shareMode, NULL, create, msflags, NULL);
free_pool_memory(pwszBuf);
- }
- else if (p_CreateFileA)
+ } else if (p_CreateFileA)
foo = CreateFile(file, access, shareMode, NULL, create, msflags, NULL);
if (INVALID_HANDLE_VALUE == foo) {
-#ifdef HAVE_WXCONSOLE
-int const win32_client = 1;
-#endif
-#include "../../lib/attr.c"
\ No newline at end of file
+#include "../../lib/attr.c"
cp -f ../wx-console/Release/wx-console.exe bacula/files/
cp -f ../../../../depkgs-win32/pthreads/pthreadVCE.dll bacula/files/
cp -f c:/windows/system32/msvcr71.dll bacula/files
- cp -f ../License.txt bacula/files/
+ cp -f ../../../LICENSE bacula/files/
zip: pebuilder
zip -r ../winbacula-bartpe-@VERSION@.zip bacula README
; Pull in pages
;
!insertmacro MUI_PAGE_WELCOME
-; !insertmacro MUI_PAGE_LICENSE "License.txt"
+; !insertmacro MUI_PAGE_LICENSE "..\..\LICENSE"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
File baculafd\Release\bacula-fd.exe
File c:\windows\system32\msvcr71.dll
File ..\..\..\depkgs-win32\pthreads\pthreadVCE.dll
- File License.txt
+ File ..\..\LICENSE
+ Delete /REBOOTOK "$INSTDIR\bin\License.txt"
IfFileExists "$INSTDIR\bin\bacula-fd.conf" newconf
File baculafd\bacula-fd.conf
goto do_service