[Box Backup-dev] COMMIT r262 - box/chris/win32/vc2005-compile-fixes/lib/win32

boxbackup-dev@fluffy.co.uk boxbackup-dev@fluffy.co.uk
Thu, 22 Dec 2005 00:35:06 +0000 (GMT)


Author: chris
Date: 2005-12-22 00:35:02 +0000 (Thu, 22 Dec 2005)
New Revision: 262

Modified:
   box/chris/win32/vc2005-compile-fixes/lib/win32/emu.cpp
Log:
* lib/win32/emu.cpp
- Better logging when we fail to open a file
- Fixed ReportEvent crashes due to pointer types and va_start/end 
  stack corruption


Modified: box/chris/win32/vc2005-compile-fixes/lib/win32/emu.cpp
===================================================================
--- box/chris/win32/vc2005-compile-fixes/lib/win32/emu.cpp	2005-12-21 03:11:48 UTC (rev 261)
+++ box/chris/win32/vc2005-compile-fixes/lib/win32/emu.cpp	2005-12-22 00:35:02 UTC (rev 262)
@@ -206,8 +206,8 @@
 // --------------------------------------------------------------------------
 HANDLE openfile(const char *filename, int flags, int mode)
 {
-	try{
-
+	try
+	{
 		wchar_t *buffer;
 		std::string fileN(filename);
 
@@ -241,6 +241,9 @@
 		buffer = new wchar_t[strlen+1];
 		if ( buffer == NULL )
 		{
+			::syslog(LOG_WARNING, "Failed to allocate buffer "
+				"for converting file name: %s",
+				tmpStr.c_str());
 			return NULL;
 		}
 
@@ -255,6 +258,9 @@
 
 		if ( strlen == 0 )
 		{
+			::syslog(LOG_WARNING, "Failed to convert filename "
+				"to unicode: %s (error %i)",
+				tmpStr.c_str(), GetLastError());
 			delete [] buffer;
 			return NULL;
 		}
@@ -266,21 +272,30 @@
 		DWORD shareMode = FILE_SHARE_READ;
 		DWORD accessRights = FILE_READ_ATTRIBUTES | FILE_LIST_DIRECTORY | FILE_READ_EA;
 
-		if ( flags & O_WRONLY )
+		if (flags & O_WRONLY)
 		{
-			createDisposition = OPEN_EXISTING;
-			shareMode |= FILE_SHARE_READ ;//| FILE_SHARE_WRITE;
+			shareMode = FILE_SHARE_WRITE;
 		}
-		if ( flags & O_CREAT )
+		if (flags & O_RDWR)
 		{
-			createDisposition = OPEN_ALWAYS;
-			shareMode |= FILE_SHARE_READ ;//| FILE_SHARE_WRITE;
-			accessRights |= FILE_WRITE_ATTRIBUTES | FILE_WRITE_DATA | FILE_WRITE_EA | FILE_ALL_ACCESS;
+			shareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
 		}
-		if ( flags & O_TRUNC )
+		if (flags & O_CREAT)
 		{
 			createDisposition = OPEN_ALWAYS;
+			shareMode |= FILE_SHARE_WRITE;
+			accessRights |= FILE_WRITE_ATTRIBUTES 
+				| FILE_WRITE_DATA | FILE_WRITE_EA 
+				| FILE_ALL_ACCESS;
 		}
+		if (flags & O_TRUNC)
+		{
+			createDisposition = CREATE_ALWAYS;
+		}
+		if (flags & O_EXCL)
+		{
+			shareMode = 0;
+		}
 
 		HANDLE hdir = CreateFileW(buffer, 
 			accessRights, 
@@ -292,8 +307,9 @@
 
 		if ( hdir == INVALID_HANDLE_VALUE )
 		{
-			// DWORD err = GetLastError();
-			// syslog(EVENTLOG_WARNING_TYPE, "Couldn't open file %s, err %i\n", filename, err);
+			DWORD err = GetLastError();
+			::syslog(LOG_WARNING, "Failed to open file %s: "
+				"error %i", filename, err);
 			delete [] buffer;
 			return NULL;
 		}
@@ -304,7 +320,7 @@
 	}
 	catch(...)
 	{
-		printf("Caught openfile:%s\r\n", filename);
+		::syslog(LOG_ERR, "Caught openfile: %s", filename);
 	}
 	return NULL;
 
@@ -886,7 +902,7 @@
 void syslog(int loglevel, const char *frmt, ...)
 {
 	WORD errinfo;
-	char* buffer;
+	char buffer[1024];
 	std::string sixfour(frmt);
 
 	switch (loglevel)
@@ -907,79 +923,46 @@
 
 
 	//taken from MSDN
-	try
+	int sixfourpos;
+	while ( (sixfourpos = (int)sixfour.find("%ll")) != -1 )
 	{
+		//maintain portability - change the 64 bit formater...
+		std::string temp = sixfour.substr(0,sixfourpos);
+		temp += "%I64";
+		temp += sixfour.substr(sixfourpos+3, sixfour.length());
+		sixfour = temp;
+	}
 
+	//printf("parsed string is:%s\r\n", sixfour.c_str());
 
-		int sixfourpos;
-		while ( (sixfourpos = (int)sixfour.find("%ll")) != -1 )
-		{
-			//maintain portability - change the 64 bit formater...
-			std::string temp = sixfour.substr(0,sixfourpos);
-			temp += "%I64";
-			temp += sixfour.substr(sixfourpos+3, sixfour.length());
-			sixfour = temp;
-		}
+	va_list args;
+	va_start(args, frmt);
 
-		//printf("parsed string is:%s\r\n", sixfour.c_str());
+	int len = vsnprintf(buffer, sizeof(buffer)-1, sixfour.c_str(), args);
+	buffer[sizeof(buffer)-1] = 0;
 
-		va_list args;
-		va_start(args, frmt);
+	va_end(args);
 
-#ifdef __MINGW32__
-		// no _vscprintf, use a fixed size buffer
-		buffer = new char[1024];
-		int len = 1023;
-#else
-		int len = _vscprintf( sixfour.c_str(), args );
-		ASSERT(len > 0)
+	LPCSTR strings[] = { buffer, NULL };
 
-		len = len + 1;
-		char* buffer = new char[len];
-#endif
+	if (!ReportEvent(gSyslogH,    // event log handle 
+		errinfo,              // event type 
+		0,                    // category zero 
+		MSG_ERR_EXIST,	      // event identifier - 
+		                      // we will call them all the same
+		NULL,                 // no user security identifier 
+		1,                    // one substitution string 
+		0,                    // no data 
+		strings,     // pointer to string array 
+		NULL))                // pointer to data 
 
-		ASSERT(buffer)
-		memset(buffer, 0, len);
-
-		int len2 = vsnprintf(buffer, len, sixfour.c_str(), args);
-		ASSERT(len2 <= len);
-
-		va_end(args);
-	}
-	catch (...)
 	{
-		printf("Caught syslog: %s", sixfour.c_str());
-		return;
+		DWORD err = GetLastError();
+		printf("Unable to send message to Event Log "
+			"(error %i):\r\n", err);
 	}
 
-	try
-	{
-
-		if (!ReportEvent(gSyslogH,    // event log handle 
-			errinfo,              // event type 
-			0,                    // category zero 
-			MSG_ERR_EXIST,	      // event identifier - 
-			                      // we will call them all the same
-			NULL,                 // no user security identifier 
-			1,                    // one substitution string 
-			0,                    // no data 
-			(LPCSTR*)&buffer,     // pointer to string array 
-			NULL))                // pointer to data 
-
-		{
-			DWORD err = GetLastError();
-			printf("Unable to send message to Event Log "
-				"(error %i):\r\n", err);
-		}
-
-		printf("%s\r\n", buffer);
-
-		if (buffer) delete [] buffer;
-	}
-	catch (...)
-	{
-		printf("Caught syslog ReportEvent");
-	}
+	printf("%s\r\n", buffer);
 }
 
 #endif // WIN32