// Copyright © 2010 sss // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "commonheaders.h" //thx gpg module from Harald Treder, Zakhar V. Bardymov HANDLE gpg_mutex = NULL; pxResult pxExecute(wstring *acommandline, char *ainput, string *aoutput, LPDWORD aexitcode, pxResult *result) { WaitForSingleObject(gpg_mutex, INFINITE); extern logtofile debuglog; BOOL success; STARTUPINFO sinfo = {0}; SECURITY_ATTRIBUTES sattrs = {0}; SECURITY_DESCRIPTOR sdesc = {0}; PROCESS_INFORMATION pri = {0}; HANDLE newstdin, newstdout, readstdout, writestdin; char *inputpos; unsigned long transfered; int size; TCHAR *bin_path = UniGetContactSettingUtf(NULL, szGPGModuleName, "szGpgBinPath", _T("")); { if(_waccess(bin_path, 0) == -1) if(errno == ENOENT) { mir_free(bin_path); *result = pxNotFound; return pxNotFound; } } wstring commandline; sattrs.nLength=sizeof(SECURITY_ATTRIBUTES); sattrs.bInheritHandle=TRUE; InitializeSecurityDescriptor(&sdesc,SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(&sdesc,TRUE,NULL,FALSE); sattrs.lpSecurityDescriptor=&sdesc; success=CreatePipe(&newstdin,&writestdin,&sattrs,0); if (!success) { *result = pxCreatePipeFailed; return pxCreatePipeFailed; } success=CreatePipe(&readstdout,&newstdout,&sattrs,0); if (!success) { CloseHandle(newstdin); CloseHandle(writestdin); *result = pxCreatePipeFailed; return pxCreatePipeFailed; } GetStartupInfo(&sinfo); sinfo.dwFlags=STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW; sinfo.wShowWindow=SW_HIDE; sinfo.hStdOutput=newstdout; sinfo.hStdError=newstdout; sinfo.hStdInput=newstdin; { //form initial command commandline += _T("\""); commandline += bin_path; commandline += _T("\" --homedir \""); TCHAR *home_dir = UniGetContactSettingUtf(NULL, szGPGModuleName, "szHomePath", _T("")); commandline += home_dir; commandline += _T("\" "); commandline += _T("--display-charset utf-8 "); commandline += *acommandline; mir_free(bin_path); mir_free(home_dir); } debuglog<<"in: "<c_str()<<"\n"; WaitForSingleObject(pri.hProcess,INFINITE); CloseHandle(pri.hThread); CloseHandle(pri.hProcess); CloseHandle(newstdin); CloseHandle(newstdout); CloseHandle(readstdout); CloseHandle(writestdin); *result = pxSuccess; return pxSuccess; } void pxEexcute_thread(void *param) { gpg_execution_params *params = (gpg_execution_params*)param; pxResult result = pxExecute(params->cmd, params->useless, params->out, params->code, params->result); if(result == pxNotFound) { MessageBox(0, _T("Set path to gpg.exe first!"), _T("Warning"), MB_OK); } }