From: Kern S. <ke...@us...> - 2006-04-28 13:19:43
|
Update of /cvsroot/bacula/bacula/src/win32/compat In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30277/src/win32/compat Modified Files: compat.cpp Log Message: - 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 Index: compat.cpp =================================================================== RCS file: /cvsroot/bacula/bacula/src/win32/compat/compat.cpp,v retrieving revision 1.64 retrieving revision 1.65 diff -u -d -r1.64 -r1.65 --- compat.cpp 25 Apr 2006 10:51:29 -0000 1.64 +++ compat.cpp 28 Apr 2006 13:19:34 -0000 1.65 @@ -439,7 +439,17 @@ 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 @@ -1315,6 +1325,7 @@ char WIN_VERSION_LONG[64]; char WIN_VERSION[32]; +char WIN_RAWVERSION[32]; class winver { public: @@ -1338,8 +1349,11 @@ 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; @@ -1348,7 +1362,7 @@ 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)); @@ -1420,12 +1434,18 @@ 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. @@ -1453,18 +1473,14 @@ // 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(strlen(cmdline) + strlen(comspec) + 16); + char *cmdLine = (char *)alloca(cmdLen); - 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, @@ -1726,9 +1742,9 @@ 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); @@ -1739,22 +1755,22 @@ 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); } @@ -1867,8 +1883,7 @@ 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) { |