[Box Backup-commit] COMMIT r1299 - box/chris/general/lib/win32

boxbackup-dev@fluffy.co.uk boxbackup-dev@fluffy.co.uk
Sun, 25 Feb 2007 14:52:53 +0000


Author: chris
Date: 2007-02-25 14:52:53 +0000 (Sun, 25 Feb 2007)
New Revision: 1299

Modified:
   box/chris/general/lib/win32/emu.cpp
   box/chris/general/lib/win32/emu.h
Log:
Added detection of reparse points, and treat them like mount points
(don't recurse down into them).

Fix compilation of timer code.

Add new syslog level emulations.


Modified: box/chris/general/lib/win32/emu.cpp
===================================================================
--- box/chris/general/lib/win32/emu.cpp	2007-02-21 00:17:14 UTC (rev 1298)
+++ box/chris/general/lib/win32/emu.cpp	2007-02-25 14:52:53 UTC (rev 1299)
@@ -26,6 +26,7 @@
 // our implementation for a timer, based on a 
 // simple thread which sleeps for a period of time
 
+static bool gTimerInitialised = false;
 static bool gFinishTimer;
 static CRITICAL_SECTION gLock;
 
@@ -41,24 +42,31 @@
 
 int setitimer(int type, struct itimerval *timeout, void *arg)
 {
-	if (ITIMER_VIRTUAL == type)
+	assert(gTimerInitialised);
+	
+	if (ITIMER_REAL != type)
 	{
-		EnterCriticalSection(&gLock);
-		// we only need seconds for the mo!
-		if (timeout->it_value.tv_sec  == 0 && 
-		    timeout->it_value.tv_usec == 0)
-		{
-			gTimerList.clear();
-		}
-		else
-		{
-			Timer_t ourTimer;
-			ourTimer.countDown = timeout->it_value.tv_sec;
-			ourTimer.interval  = timeout->it_interval.tv_sec;
-			gTimerList.push_back(ourTimer);
-		}
-		LeaveCriticalSection(&gLock);
+		errno = ENOSYS;
+		return -1;
 	}
+
+	EnterCriticalSection(&gLock);
+
+	// we only need seconds for the mo!
+	if (timeout->it_value.tv_sec  == 0 && 
+	    timeout->it_value.tv_usec == 0)
+	{
+		gTimerList.clear();
+	}
+	else
+	{
+		Timer_t ourTimer;
+		ourTimer.countDown = timeout->it_value.tv_sec;
+		ourTimer.interval  = timeout->it_interval.tv_sec;
+		gTimerList.push_back(ourTimer);
+	}
+
+	LeaveCriticalSection(&gLock);
 	
 	// indicate success
 	return 0;
@@ -129,20 +137,25 @@
 
 void InitTimer(void)
 {
+	assert(!gTimerInitialised);
 	InitializeCriticalSection(&gLock);
-
+	
 	// create our thread
 	HANDLE ourThread = (HANDLE)_beginthreadex(NULL, 0, RunTimer, 0, 
 		CREATE_SUSPENDED, NULL);
 	SetThreadPriority(ourThread, THREAD_PRIORITY_LOWEST);
 	ResumeThread(ourThread);
+
+	gTimerInitialised = true;
 }
 
 void FiniTimer(void)
 {
+	assert(gTimerInitialised);
 	gFinishTimer = true;
 	EnterCriticalSection(&gLock);
 	DeleteCriticalSection(&gLock);
+	gTimerInitialised = false;
 }
 
 //Our constants we need to keep track of
@@ -685,6 +698,22 @@
 		st->st_mode |= S_IWRITE;
 	}
 
+	// st_dev is normally zero, regardless of the drive letter,
+	// since backup locations can't normally span drives. However,
+	// a reparse point does allow all kinds of weird stuff to happen.
+	// We set st_dev to 1 for a reparse point, so that Box will detect
+	// a change of device number (from 0) and refuse to recurse down
+	// the reparse point (which could lead to havoc).
+
+	if (fi.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)
+	{
+		st->st_dev = 1;
+	}
+	else
+	{
+		st->st_dev = 0;
+	}
+
 	return 0;
 }
 

Modified: box/chris/general/lib/win32/emu.h
===================================================================
--- box/chris/general/lib/win32/emu.h	2007-02-21 00:17:14 UTC (rev 1298)
+++ box/chris/general/lib/win32/emu.h	2007-02-25 14:52:53 UTC (rev 1299)
@@ -65,7 +65,7 @@
 	( *(_result) = *gmtime( (_clock) ), \
 	(_result) )
 
-#define ITIMER_VIRTUAL 0
+#define ITIMER_REAL 0
 
 #ifdef _MSC_VER
 // Microsoft decided to deprecate the standard POSIX functions. Great!
@@ -214,9 +214,12 @@
 
 HANDLE openfile(const char *filename, int flags, int mode);
 
+#define LOG_DEBUG LOG_INFO
 #define LOG_INFO 6
+#define LOG_NOTICE LOG_INFO
 #define LOG_WARNING 4
 #define LOG_ERR 3
+#define LOG_CRIT LOG_ERR
 #define LOG_PID 0
 #define LOG_LOCAL5 0
 #define LOG_LOCAL6 0