From 05d92c6807bdfb1bbeef40205982ff3874584f20 Mon Sep 17 00:00:00 2001 From: Robert Nelson Date: Fri, 14 Jul 2006 18:33:46 +0000 Subject: [PATCH] Rewrite msvcrt localtime kludge so it doesn't used undocumented functions and compiles on MinGW. Fix an "ifndef" to "if defined" typo in message.c. Add FsType support to WIN32 - example types are: ntfs, fat, fat32, cdfs. git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@3139 91ce42f0-d328-0410-95d8-f526ca767f89 --- bacula/configure | 2 +- bacula/src/dird/Makefile.in | 2 +- bacula/src/findlib/fstype.c | 36 +++++++++++++++++-- bacula/src/lib/message.c | 4 +-- bacula/src/lib/util.c | 50 ++++++++++---------------- bacula/src/win32/filed/vss_generic.cpp | 2 +- bacula/src/win32/libwin32/winbacula.h | 2 -- bacula/src/wx-console/authenticate.c | 2 +- 8 files changed, 58 insertions(+), 42 deletions(-) diff --git a/bacula/configure b/bacula/configure index 8f84621d7a..b7c8f95bd5 100755 --- a/bacula/configure +++ b/bacula/configure @@ -16921,7 +16921,7 @@ echo "$as_me: error: Invalid MySQL directory $withval - unable to find mysql.h u fi fi SQL_INCLUDE=-I$MYSQL_INCDIR - if test -f "$MYSQL_LIBDIR/libmysqlclient_r.a"; then + if test -f $MYSQL_LIBDIR/libmysqlclient_r.a; then SQL_LFLAGS="-L$MYSQL_LIBDIR -lmysqlclient_r -lz" cat >>confdefs.h <<\_ACEOF #define HAVE_THREAD_SAFE_MYSQL 1 diff --git a/bacula/src/dird/Makefile.in b/bacula/src/dird/Makefile.in index 35d75abe01..f1218a1414 100644 --- a/bacula/src/dird/Makefile.in +++ b/bacula/src/dird/Makefile.in @@ -82,7 +82,7 @@ bacula-dir: $(SVROBJS) ../lib/libbac.a ../cats/libsql.a ../findlib/libfind.a $(CXX) $(WLDFLAGS) $(LDFLAGS) -L../lib -L../cats -L../findlib -o $@ $(SVROBJS) \ -lsql -lfind -lbac -lm $(PYTHON_LIBS) $(DLIB) $(DB_LIBS) $(LIBS) \ $(WRAPLIBS) $(GETTEXT_LIBS) $(OPENSSL_LIBS) - + static-bacula-dir: $(SVROBJS) ../lib/libbac.a ../cats/libsql.a ../findlib/libfind.a $(CXX) $(WLDFLAGS) $(LDFLAGS) -static -L../lib -L../cats -L../findlib -o $@ $(SVROBJS) \ diff --git a/bacula/src/findlib/fstype.c b/bacula/src/findlib/fstype.c index 6182c6bc96..059ae048b4 100644 --- a/bacula/src/findlib/fstype.c +++ b/bacula/src/findlib/fstype.c @@ -44,8 +44,8 @@ "HAVE_LINUX_OS\n" \ "HAVE_NETBSD_OS\n" \ "HAVE_OPENBSD_OS\n" \ - "HAVE_SUN_OS\n" -#define bool int + "HAVE_SUN_OS\n" \ + "HAVE_WIN32\n" #define false 0 #define true 1 #define bstrncpy strncpy @@ -252,6 +252,38 @@ bool fstype(const char *fname, char *fs, int fslen) } /* Tru64 */ +#elif defined (HAVE_WIN32) +/* Windows */ + +bool fstype(const char *fname, char *fs, int fslen) +{ + DWORD componentlength; + DWORD fsflags; + CHAR rootpath[4]; + UINT oldmode; + BOOL result; + + /* Copy Drive Letter, colon, and backslash to rootpath */ + bstrncpy(rootpath, fname, sizeof(rootpath)); + + /* We don't want any popups if there isn't any media in the drive */ + oldmode = SetErrorMode(SEM_FAILCRITICALERRORS); + + result = GetVolumeInformation(rootpath, NULL, 0, NULL, &componentlength, &fsflags, fs, fslen); + + SetErrorMode(oldmode); + + if (result) { + /* Windows returns NTFS, FAT, etc. Make it lowercase to be consistent with other OSes */ + lcase(fs); + } else { + Dmsg2(10, "GetVolumeInformation() failed for \"%s\", Error = %d.\n", rootpath, GetLastError()); + } + + return result != 0; +} +/* Windows */ + #else /* No recognised OS */ bool fstype(const char *fname, char *fs, int fslen) diff --git a/bacula/src/lib/message.c b/bacula/src/lib/message.c index 93417d3a3f..18ae8aab8b 100755 --- a/bacula/src/lib/message.c +++ b/bacula/src/lib/message.c @@ -159,7 +159,7 @@ init_msg(JCR *jcr, MSGS *msg) init_last_jobs_list(); } -#if defined(HAVE_WIN32) +#if !defined(HAVE_WIN32) /* * Make sure we have fd's 0, 1, 2 open * If we don't do this one of our sockets may open @@ -185,7 +185,7 @@ init_msg(JCR *jcr, MSGS *msg) if (msg == NULL) { daemon_msgs = (MSGS *)malloc(sizeof(MSGS)); memset(daemon_msgs, 0, sizeof(MSGS)); -#if defined(HAVE_WIN32) +#if !defined(HAVE_WIN32) for (i=1; i<=M_MAX; i++) { add_msg_dest(daemon_msgs, MD_STDOUT, i, NULL, NULL); } diff --git a/bacula/src/lib/util.c b/bacula/src/lib/util.c index 6fd842072c..505851583f 100644 --- a/bacula/src/lib/util.c +++ b/bacula/src/lib/util.c @@ -120,42 +120,28 @@ unbash_spaces(POOL_MEM &pm) } } -/* kludge below disabled for MinGW, due to link problems ... */ -#if HAVE_WIN32 && !HAVE_CONSOLE && !HAVE_WXCONSOLE && !HAVE_MINGW -extern long _timezone; -extern int _daylight; -extern long _dstbias; -extern "C" void __tzset(void); -extern "C" int _isindst(struct tm *); -#endif - char *encode_time(time_t time, char *buf) { struct tm tm; int n = 0; -#if HAVE_WIN32 && !HAVE_CONSOLE && !HAVE_WXCONSOLE && !HAVE_MINGW - /* - * Gross kludge to avoid a seg fault in Microsoft's CRT localtime_r(), - * which incorrectly references a NULL returned from gmtime() if - * the time (adjusted for the current timezone) is invalid. - * This could happen if you have a bad date/time, or perhaps if you - * moved a file from one timezone to another? - */ - struct tm *gtm; - time_t gtime; - __tzset(); - gtime = time - _timezone; - if (!(gtm = gmtime(>ime))) { - return buf; - } - if (_daylight && _isindst(gtm)) { - gtime -= _dstbias; - if (!gmtime(>ime)) { - return buf; - } - } +#if defined(HAVE_WIN32) + /* + * Avoid a seg fault in Microsoft's CRT localtime_r(), + * which incorrectly references a NULL returned from gmtime() if + * time is negative before or after the timezone adjustment. + */ + struct tm *gtm; + + if ((gtm = gmtime(&time)) == NULL) { + return buf; + } + + if (gtm->tm_year == 1970 && gtm->tm_mon == 1 && gtm->tm_mday < 3) { + return buf; + } #endif + if (localtime_r(&time, &tm)) { n = sprintf(buf, "%04d-%02d-%02d %02d:%02d:%02d", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, @@ -464,10 +450,10 @@ void make_session_key(char *key, char *seed, int mode) (void)getcwd(s + strlen(s), 256); sprintf(s + strlen(s), "%lu", (unsigned long)clock()); sprintf(s + strlen(s), "%lu", (unsigned long)time(NULL)); -#ifdef Solaris +#if defined(Solaris) sysinfo(SI_HW_SERIAL,s + strlen(s), 12); #endif -#ifdef HAVE_GETHOSTID +#if defined(HAVE_GETHOSTID) sprintf(s + strlen(s), "%lu", (unsigned long) gethostid()); #endif gethostname(s + strlen(s), 256); diff --git a/bacula/src/win32/filed/vss_generic.cpp b/bacula/src/win32/filed/vss_generic.cpp index a61830ab03..4d60b8bec8 100644 --- a/bacula/src/win32/filed/vss_generic.cpp +++ b/bacula/src/win32/filed/vss_generic.cpp @@ -23,7 +23,7 @@ #ifdef WIN32_VSS -#include +#include "bacula.h" #undef setlocale diff --git a/bacula/src/win32/libwin32/winbacula.h b/bacula/src/win32/libwin32/winbacula.h index 0bf12438a9..088205be33 100644 --- a/bacula/src/win32/libwin32/winbacula.h +++ b/bacula/src/win32/libwin32/winbacula.h @@ -29,8 +29,6 @@ // -// WinUPS header file - // Application specific messages // Message used for system tray notifications diff --git a/bacula/src/wx-console/authenticate.c b/bacula/src/wx-console/authenticate.c index 6c26871d8d..5c85ef7261 100644 --- a/bacula/src/wx-console/authenticate.c +++ b/bacula/src/wx-console/authenticate.c @@ -100,7 +100,7 @@ int authenticate_director(JCR *jcr, DIRRES *director, CONRES *cons) if (!cram_md5_respond(dir, password, &tls_remote_need, &compatible) || !cram_md5_challenge(dir, password, tls_local_need, compatible)) { goto bail_out; - } + } /* Verify that the remote host is willing to meet our TLS requirements */ if (tls_remote_need < tls_local_need && tls_local_need != BNET_TLS_OK && tls_remote_need != BNET_TLS_OK) { -- 2.39.5