summaryrefslogtreecommitdiff
path: root/contrib/transport-sample/ThriftCommon.cpp
blob: 60ebf7a00261b19b7abba375bd36dd96f92c93e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// ThriftCommon.cpp : Common functions for sample Thrift client and server
//

#include "ThriftCommon.h"

namespace thriftcommon
{
	//----------------------------------------------------------------------------
	//Launch child process and pass R/W anonymous pipe handles on cmd line.
	//This is a simple example and does not include elevation or other 
	//advanced features.
	//
	bool LaunchAnonPipeChild(std::string app, boost::shared_ptr<TServerTransport> transport)
	{
#ifdef _WIN32
		PROCESS_INFORMATION pi;
		STARTUPINFOA si;
		GetStartupInfoA(&si);  //set startupinfo for the spawned process
		char handles[MAX_PATH];  //Stores pipe handles converted to text

		sprintf(handles, "%s %d %d", app.c_str(),
			(int)boost::shared_dynamic_cast<TPipeServer>(transport)->getClientRdPipeHandle(),
			(int)boost::shared_dynamic_cast<TPipeServer>(transport)->getClientWrtPipeHandle());

		//spawn the child process
		if (!CreateProcessA(NULL, handles, NULL,NULL,TRUE,0,NULL,NULL,&si,&pi))
		{
			GlobalOutput.perror("TPipeServer CreateProcess failed, GLE=", GetLastError());
			return false;
		}

		CloseHandle(pi.hThread);
		CloseHandle(pi.hProcess);
#endif
		return true;
	}
}