////////////////////////////////////////////////////////////////////////////
// CCmdEnv クラスのインプリメンテーション
//
////////////////////////////////////////////////////////////////////////////

#include <errno.h>
#include "CmdEnv.h"

using namespace std;

////////////////////////////////////////////////////////////////////////////
// 構築/破棄
////////////////////////////////////////////////////////////////////////////

CCmdEnv::CCmdEnv()
{
	mapEnvValue.clear();
}

CCmdEnv::~CCmdEnv()
{

}

////////////////////////////////////////////////////////////////////////////
// メソッド
////////////////////////////////////////////////////////////////////////////

// 環境変数を追加
void CCmdEnv::AddEnvironment( const std::string &rEnv, const std::string &rVal )
{
	map< string, string >::iterator itr = mapEnvValue.find( rEnv );
	if ( itr != mapEnvValue.end() )
		mapEnvValue.erase( itr );
	mapEnvValue.insert( pair< string, string >( rEnv, rVal ) );
}

// コマンドを実行
int CCmdEnv::Run( const std::string &rCmd )
{
	char *pBuf;
	int StringLen;
	map< string, string >::iterator itr;
	int r;

	// 環境変数を設定
	itr = mapEnvValue.begin();
	for (; itr != mapEnvValue.end(); ++itr ) {
		StringLen = itr->first.size() + itr->second.size() + 2;
		pBuf = (char*)malloc( sizeof( char ) * StringLen );
		if ( NULL == pBuf ){
			// メモリ不足
			errno = ENOMEM;
			return -1;
		}
		strcpy( pBuf, itr->first.c_str() );
		strcpy( pBuf + itr->first.size(), "=" );
		strcpy( pBuf + itr->first.size() + 1, itr->second.c_str() );
		putenv( pBuf );
		pBuf = NULL;
	}

	// コマンドを実行する
	r = system( rCmd.c_str() );
	if ( r >= 0 ) r = WEXITSTATUS( r );	

	return r;
}

