sl@0: /* sl@0: * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: * All rights reserved. sl@0: * This component and the accompanying materials are made available sl@0: * under the terms of "Eclipse Public License v1.0" sl@0: * which accompanies this distribution, and is available sl@0: * at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: * sl@0: * Initial Contributors: sl@0: * Nokia Corporation - initial contribution. sl@0: * sl@0: * Contributors: sl@0: * sl@0: * Description: sl@0: * sl@0: */ sl@0: sl@0: sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include "glibbackend.h" sl@0: sl@0: #define MAX_COMMAND_LINE_LENGTH 256 sl@0: sl@0: extern "C" sl@0: { sl@0: sl@0: EXPORT_C int spawnv(int mode,const char * path,const char **argv) sl@0: { sl@0: TText16 iPath16[KMaxFileName]; sl@0: char replacePath[KMaxFileName]; sl@0: sl@0: /* replace / with // */ sl@0: strcpy(replacePath,path); sl@0: char *temp = strchr(replacePath,'/'); sl@0: while (temp) sl@0: { sl@0: *temp = '\\'; sl@0: temp = strchr(replacePath,'/'); sl@0: } // end while sl@0: sl@0: // convert narrow char to wide char sl@0: if(mbstowcs((wchar_t *)iPath16, replacePath, strlen(replacePath)+1) == (size_t)(-1)) sl@0: { sl@0: return -1; sl@0: } sl@0: sl@0: TBuf16 iCmdName16; sl@0: sl@0: iCmdName16.FillZ(KMaxFileName); sl@0: sl@0: iCmdName16.Copy(iPath16); sl@0: sl@0: TInt i; sl@0: sl@0: TInt iVal = 0; sl@0: sl@0: while(argv[iVal]) sl@0: { sl@0: iVal++; sl@0: } //end while sl@0: sl@0: sl@0: TBuf16 iArgv16; sl@0: sl@0: iArgv16.FillZ(MAX_COMMAND_LINE_LENGTH); sl@0: sl@0: iArgv16.SetLength(0); sl@0: sl@0: for(i = 0; i < iVal ; i++) sl@0: { sl@0: TText16 temp[MAX_COMMAND_LINE_LENGTH]; sl@0: sl@0: if(mbstowcs((wchar_t *)temp, argv[i], strlen(argv[i])+1) == (size_t)(-1)) sl@0: { sl@0: return -1; sl@0: } sl@0: sl@0: TPtrC16 iTemp(temp,strlen(argv[i])); sl@0: sl@0: iArgv16.Append(iTemp); sl@0: sl@0: if(i != iVal-1) sl@0: iArgv16.Append(L' '); sl@0: sl@0: } // end for sl@0: sl@0: RProcess iProcess; sl@0: TRequestStatus iStatus; sl@0: TInt iRetVal = iProcess.Create(iCmdName16,iArgv16); sl@0: sl@0: if(iRetVal != KErrNone) sl@0: { sl@0: switch(iRetVal) sl@0: { sl@0: case KErrNotFound : errno = ENOENT; sl@0: break; sl@0: case KErrNoMemory : errno = ENOMEM ; sl@0: break; sl@0: case KErrNotSupported : errno = ENOEXEC; sl@0: break; sl@0: case KErrBadName : errno = ENAMETOOLONG; sl@0: break; sl@0: default: break; sl@0: } sl@0: sl@0: return -1; sl@0: } sl@0: sl@0: if(mode == P_WAIT) sl@0: { sl@0: iProcess.Logon(iStatus); sl@0: iProcess.Resume(); sl@0: User::WaitForRequest(iStatus); sl@0: iProcess.Close(); sl@0: return iStatus.Int(); sl@0: } sl@0: else sl@0: { sl@0: iProcess.Resume(); sl@0: return iProcess.Id(); sl@0: } sl@0: } sl@0: sl@0: EXPORT_C int spawnvp(int mode,const char * path,const char **argv) sl@0: { sl@0: return spawnv(mode,path,argv); sl@0: } sl@0: sl@0: sl@0: static int ValidateHandle(HANDLE handle) sl@0: { sl@0: RProcess iProcess; sl@0: if( iProcess.Open(handle) < 0) sl@0: return 0; sl@0: sl@0: THandleInfo handleinfo; sl@0: iProcess.HandleInfo(&handleinfo); sl@0: sl@0: if(handleinfo.iNumOpenInProcess ==0 && handleinfo.iNumOpenInThread == 0 && sl@0: handleinfo.iNumProcesses == 0 && handleinfo.iNumThreads == 0) sl@0: return 0; sl@0: else sl@0: return 1; sl@0: } sl@0: sl@0: EXPORT_C BOOL CloseHandle(HANDLE handle) sl@0: { sl@0: RProcess iProcess; sl@0: if( iProcess.Open(handle) < 0) sl@0: return 0; sl@0: sl@0: if(ValidateHandle(handle)) sl@0: iProcess.Close(); sl@0: sl@0: return 1; sl@0: } sl@0: sl@0: EXPORT_C HANDLE GetCurrentProcess() sl@0: { sl@0: return RProcess().Id(); sl@0: } sl@0: sl@0: BOOL DuplicateHandle(HANDLE hSourceProcessHandle,HANDLE hSourceHandle,HANDLE hTargetProcessHandle,LPHANDLE lpTargetHandle,DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwOptions) sl@0: { sl@0: return 0; sl@0: } sl@0: sl@0: EXPORT_C int spawnve(int mode,const char * path,const char **argv,const char **envp) sl@0: { sl@0: return spawnv(mode,path,argv); sl@0: } sl@0: sl@0: EXPORT_C int spawnvpe(int mode,const char * path,const char **argv,const char **envp) sl@0: { sl@0: return spawnv(mode,path,argv); sl@0: } sl@0: sl@0: sl@0: } /* close extern "C"*/