[Box Backup-dev] COMMIT r782 - box/chris/general/lib/server
boxbackup-dev@fluffy.co.uk
boxbackup-dev@fluffy.co.uk
Sat, 19 Aug 2006 16:32:17 +0100
Author: chris
Date: 2006-08-19 16:32:16 +0100 (Sat, 19 Aug 2006)
New Revision: 782
Modified:
box/chris/general/lib/server/LocalProcessStream.cpp
Log:
* LocalProcessStream.cpp
- Added support for SyncAllowScript under Win32
Modified: box/chris/general/lib/server/LocalProcessStream.cpp
===================================================================
--- box/chris/general/lib/server/LocalProcessStream.cpp 2006-08-19 15:31:48 UTC (rev 781)
+++ box/chris/general/lib/server/LocalProcessStream.cpp 2006-08-19 15:32:16 UTC (rev 782)
@@ -18,10 +18,15 @@
#endif
#include "LocalProcessStream.h"
-#include "SocketStream.h"
#include "autogen_ServerException.h"
#include "Utils.h"
+#ifdef WIN32
+ #include "FileStream.h"
+#else
+ #include "SocketStream.h"
+#endif
+
#include "MemLeakFindOn.h"
#define MAX_ARGUMENTS 64
@@ -101,9 +106,64 @@
// Return the stream object and PID
rPidOut = pid;
return stream;
+
#else // WIN32
- ::syslog(LOG_ERR, "vfork not implemented - LocalProcessStream.cpp");
- std::auto_ptr<IOStream> stream;
+
+ SECURITY_ATTRIBUTES secAttr;
+ secAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
+ secAttr.bInheritHandle = TRUE;
+ secAttr.lpSecurityDescriptor = NULL;
+
+ HANDLE WriteInChild, ReadFromChild;
+ if (!CreatePipe(&ReadFromChild, &WriteInChild, &secAttr, 0))
+ {
+ ::syslog(LOG_ERR, "Failed to CreatePipe for child process: "
+ "error %d", GetLastError());
+ THROW_EXCEPTION(ServerException, SocketPairFailed)
+ }
+ SetHandleInformation(ReadFromChild, HANDLE_FLAG_INHERIT, 0);
+
+ PROCESS_INFORMATION ProcInfo;
+ STARTUPINFO StartupInfo;
+
+ ZeroMemory(&ProcInfo, sizeof(ProcInfo));
+ ZeroMemory(&StartupInfo, sizeof(StartupInfo));
+ StartupInfo.cb = sizeof(StartupInfo);
+ StartupInfo.hStdError = WriteInChild;
+ StartupInfo.hStdOutput = WriteInChild;
+ StartupInfo.hStdInput = INVALID_HANDLE_VALUE;
+ StartupInfo.dwFlags |= STARTF_USESTDHANDLES;
+
+ CHAR* CommandLineCopy = (CHAR*)malloc(strlen(CommandLine) + 1);
+ strcpy(CommandLineCopy, CommandLine);
+
+ bool result = CreateProcess(NULL,
+ CommandLineCopy, // command line
+ NULL, // process security attributes
+ NULL, // primary thread security attributes
+ TRUE, // handles are inherited
+ 0, // creation flags
+ NULL, // use parent's environment
+ NULL, // use parent's current directory
+ &StartupInfo, // STARTUPINFO pointer
+ &ProcInfo); // receives PROCESS_INFORMATION
+
+ free(CommandLineCopy);
+
+ if (!result)
+ {
+ ::syslog(LOG_ERR, "Failed to CreateProcess: '%s': "
+ "error %d", CommandLine, GetLastError());
+ CloseHandle(WriteInChild);
+ CloseHandle(ReadFromChild);
+ THROW_EXCEPTION(ServerException, ServerForkError)
+ }
+
+ CloseHandle(ProcInfo.hProcess);
+ CloseHandle(ProcInfo.hThread);
+ CloseHandle(WriteInChild);
+
+ std::auto_ptr<IOStream> stream(new FileStream(ReadFromChild));
return stream;
#endif // ! WIN32
}