annotate host/tools/Utils/common/Subprocess.cpp @ 2094:a22e535e2a4c

* common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY scheme in addition to the BSD scheme. Recent Linux kernels may be built without legacy PTY support.
author jld
date Wed, 02 Nov 2005 08:39:18 +0000
parents 4c750ce71ae3
children 74dbf4c3f2e1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
1 //####COPYRIGHTBEGIN####
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
2 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
3 // ----------------------------------------------------------------------------
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
4 // Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
2094
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
5 // Copyright (C) 2004 eCosCentric Limited
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
6 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
7 // This program is part of the eCos host tools.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
8 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
9 // This program is free software; you can redistribute it and/or modify it
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
10 // under the terms of the GNU General Public License as published by the Free
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
11 // Software Foundation; either version 2 of the License, or (at your option)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
12 // any later version.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
13 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
14 // This program is distributed in the hope that it will be useful, but WITHOUT
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
15 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
16 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
17 // more details.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
18 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
19 // You should have received a copy of the GNU General Public License along with
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
20 // this program; if not, write to the Free Software Foundation, Inc.,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
21 // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
22 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
23 // ----------------------------------------------------------------------------
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
24 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
25 //####COPYRIGHTEND####
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
26 //===========================================================================
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
27 //===========================================================================
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
28 //#####DESCRIPTIONBEGIN####
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
29 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
30 // Author(s): sdf
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
31 // Contact(s): sdf
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
32 // Date: 1998/08/11
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
33 // Version: 0.01
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
34 // Purpose:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
35 // Description: This is the implementation of the class which allows for spawning subprocesses
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
36 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
37 // Requires:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
38 // Provides:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
39 // See also:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
40 // Known bugs:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
41 // Usage:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
42 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
43 //####DESCRIPTIONEND####
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
44 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
45 //===========================================================================
2094
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
46
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
47 // define _GNU_SOURCE to ensure that stdlib.h provides Unix98 PTY declarations
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
48 #define _GNU_SOURCE
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
49
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
50 #include "eCosTrace.h"
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
51 #include "Subprocess.h"
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
52 #ifdef _WIN32
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
53 #include <tlhelp32.h>
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
54
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
55 HINSTANCE CSubprocess::hInstLib1 = VER_PLATFORM_WIN32_NT==CSubprocess::GetPlatform()?LoadLibrary(_T("PSAPI.DLL")):LoadLibrary(_T("Kernel32.DLL")) ;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
56 HINSTANCE CSubprocess::hInstLib2 = VER_PLATFORM_WIN32_NT==CSubprocess::GetPlatform()?LoadLibrary(_T("NTDLL.DLL")):NULL;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
57
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
58 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
59
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
60 //#define CloseHandle(x) TRACE(_T("CSubprocess::CloseHandle %x\n"),x);::CloseHandle(x)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
61
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
62 const unsigned int CSubprocess::PROCESS_KILL_EXIT_CODE=0xCCFFCCFF;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
63
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
64 CSubprocess::CSubprocess(bool bAutoDelete):
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
65 m_pfnContinue(DefaultContinuationFunc),
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
66 m_pContinuationFuncParam(0),
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
67 m_bAutoDelete(bAutoDelete),
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
68 m_bThreadTerminated(true),
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
69 m_bVerbose(false),
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
70 m_nExitCode(-1),
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
71 m_idProcess(0),
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
72 m_pLogparam(0),
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
73 m_pfnLogfunc(0),
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
74 m_bKillThread(false)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
75 {
84
489eb5632bc3 Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents: 82
diff changeset
76 #ifdef _WIN32
489eb5632bc3 Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents: 82
diff changeset
77 m_hProcess=0;
489eb5632bc3 Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents: 82
diff changeset
78 #endif
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
79 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
80
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
81 CSubprocess::~CSubprocess()
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
82 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
83 Kill();
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
84 if(!CeCosThreadUtils::WaitFor(m_bThreadTerminated,1000)){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
85 m_bKillThread=true;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
86 CeCosThreadUtils::WaitFor(m_bThreadTerminated);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
87 }
84
489eb5632bc3 Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents: 82
diff changeset
88 #ifdef _WIN32
489eb5632bc3 Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents: 82
diff changeset
89 if(m_hProcess){
489eb5632bc3 Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents: 82
diff changeset
90 CloseHandle(m_hProcess);
489eb5632bc3 Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents: 82
diff changeset
91 }
489eb5632bc3 Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents: 82
diff changeset
92 #endif
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
93 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
94
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
95 bool CSubprocess::Run(LogFunc *pfnLog,void * pLogparam, LPCTSTR pszCmd,bool bBlock/*=true*/)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
96 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
97 bool rc;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
98 if(!m_bThreadTerminated){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
99 rc=false;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
100 } else {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
101 m_pfnLogfunc=pfnLog;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
102 m_pLogparam=pLogparam;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
103 #ifdef _WIN32
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
104 // UNIX does it from the thread func. WIN32 could too, but it's nice to know at the time
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
105 // of calling run whether the process is successfully created.
84
489eb5632bc3 Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents: 82
diff changeset
106 if(m_hProcess){
489eb5632bc3 Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents: 82
diff changeset
107 // Normally done in the dtor
489eb5632bc3 Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents: 82
diff changeset
108 CloseHandle(m_hProcess);
489eb5632bc3 Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents: 82
diff changeset
109 }
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
110 rc=CreateProcess(pszCmd);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
111 #else
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
112 m_strCmd=pszCmd;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
113 rc=true;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
114 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
115 if(rc){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
116 m_bKillThread=false;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
117 if(bBlock){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
118 // When using RunThread, the manipulation of this Boolean is taken care of.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
119 // Here we must do it ourselves.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
120 m_bThreadTerminated=false;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
121 ThreadFunc();
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
122 m_bThreadTerminated=true;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
123 } else {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
124 CeCosThreadUtils::RunThread(SThreadFunc,this,&m_bThreadTerminated,String::SFormat(_T("subprocess %d read"),m_idProcess));
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
125 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
126 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
127 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
128 return rc;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
129 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
130
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
131 #ifdef _WIN32
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
132 bool CSubprocess::CreateProcess(LPCTSTR pszCmdline)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
133 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
134
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
135 STARTUPINFO si; // For CreateProcess call
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
136 HANDLE hrPipe,hwPipe,hwPipe2,m_hrPipeTemp,m_hwPipeTemp;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
137 // Create the anonymous pipe
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
138
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
139 SECURITY_ATTRIBUTES saPipe; // Security for anonymous pipe
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
140 saPipe.nLength = sizeof(SECURITY_ATTRIBUTES);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
141 saPipe.lpSecurityDescriptor = NULL;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
142 saPipe.bInheritHandle = true;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
143
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
144 ::CreatePipe(&m_hrPipeTemp,&hwPipe,&saPipe,10240);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
145
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
146 // In most cases you can get away with using the same anonymous
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
147 // pipe write handle for both the child's standard output and
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
148 // standard error, but this may cause problems if the child app
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
149 // explicitly closes one of its standard output or error handles. If
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
150 // that happens, the anonymous pipe will close, since the child's
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
151 // standard output and error handles are really the same handle. The
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
152 // child won't be able to write to the other write handle since the
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
153 // pipe is now gone, and parent reads from the pipe will return
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
154 // ERROR_BROKEN_PIPE and child output will be lost. To solve this
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
155 // problem, simply duplicate the write end of the pipe to create
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
156 // another distinct, separate handle to the write end of the pipe.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
157 // One pipe write handle will serve as standard out, the other as
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
158 // standard error. Now *both* write handles must be closed before the
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
159 // write end of the pipe actually closes.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
160
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
161 ::DuplicateHandle(::GetCurrentProcess(), // Source process
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
162 hwPipe, // Handle to duplicate
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
163 ::GetCurrentProcess(), // Destination process
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
164 &hwPipe2, // New handle, used as stderr by child
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
165 0, // New access flags - ignored since DUPLICATE_SAME_ACCESS
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
166 true, // It's inheritable
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
167 DUPLICATE_SAME_ACCESS);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
168
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
169 ::CreatePipe(&hrPipe,&m_hwPipeTemp,&saPipe,10240);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
170
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
171
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
172 // Create new output read handle and the input write handles, setting
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
173 // the Properties to FALSE. Otherwise, the child inherits the
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
174 // properties and, as a result, non-closeable handles to the pipes
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
175 // are created.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
176 DuplicateHandle(GetCurrentProcess(),m_hrPipeTemp,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
177 GetCurrentProcess(),
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
178 &m_hrPipe, // Address of new handle.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
179 0,FALSE, // Make it uninheritable.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
180 DUPLICATE_SAME_ACCESS);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
181
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
182 DuplicateHandle(GetCurrentProcess(),m_hwPipeTemp,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
183 GetCurrentProcess(),
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
184 &m_hwPipe, // Address of new handle.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
185 0,FALSE, // Make it uninheritable.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
186 DUPLICATE_SAME_ACCESS);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
187
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
188 // Close inheritable copies of the handles we do not want to be inherited:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
189 CloseHandle(m_hrPipeTemp);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
190 CloseHandle(m_hwPipeTemp);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
191
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
192
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
193 memset(&si, 0, sizeof(si));
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
194 si.cb = sizeof(si);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
195
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
196 si.hStdOutput = hwPipe;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
197 si.hStdError = hwPipe2;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
198 si.hStdInput = hrPipe;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
199 si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
200 si.wShowWindow = SW_SHOW;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
201
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
202 LPCTSTR pszDir;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
203 if(m_strDir.empty()){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
204 pszDir=NULL; // current directory
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
205 } else {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
206 pszDir=m_strDir;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
207 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
208
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
209 PROCESS_INFORMATION pi;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
210 String strCmd(pszCmdline);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
211
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
212 String strOrigpath;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
213 if(!m_strPath.empty()){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
214 int nSize=GetEnvironmentVariable(_T("PATH"), NULL, 0);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
215 if(nSize>0){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
216 GetEnvironmentVariable(_T("PATH"),strOrigpath.GetBuffer(nSize),nSize);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
217 strOrigpath.ReleaseBuffer();
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
218 SetEnvironmentVariable(_T("PATH"),m_strPath);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
219 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
220 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
221
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
222 bool rc=(TRUE==::CreateProcess(NULL,strCmd.GetBuffer(),NULL,NULL,true,DETACHED_PROCESS|CREATE_NEW_PROCESS_GROUP,NULL,pszDir,&si,&pi));
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
223
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
224 if(!m_strPath.empty()){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
225 SetEnvironmentVariable(_T("PATH"),strOrigpath);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
226 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
227
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
228 m_nErr=GetLastError();
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
229
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
230 strCmd.ReleaseBuffer();
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
231
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
232 if(rc){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
233 m_idProcess=pi.dwProcessId;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
234 m_hProcess=pi.hProcess;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
235 if(m_bVerbose){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
236 Output(String::SFormat(_T("*** Process %d created \"%s\"\n"),m_idProcess,pszCmdline));
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
237 }
84
489eb5632bc3 Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents: 82
diff changeset
238 TRACE(String::SFormat(_T("Process %d created \"%s\"\n"),m_idProcess,pszCmdline));
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
239 m_nExitCode=STILL_ACTIVE;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
240 CloseHandle(pi.hThread);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
241 } else {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
242 m_idProcess=0;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
243 if(m_bVerbose){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
244 Output(String::SFormat(_T("*** Failed to create process \"%s\" %s\n"),pszCmdline,(LPCTSTR)ErrorString()));
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
245 }
84
489eb5632bc3 Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents: 82
diff changeset
246 TRACE(String::SFormat(_T("Failed to create process \"%s\" %s\n"),pszCmdline,(LPCTSTR)ErrorString()));
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
247 m_nExitCode=GetLastError();
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
248 CloseHandle(m_hrPipe);m_hrPipe=INVALID_HANDLE_VALUE;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
249 CloseHandle(m_hwPipe);m_hwPipe=INVALID_HANDLE_VALUE;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
250 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
251
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
252 CloseHandle(hrPipe);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
253 CloseHandle(hwPipe);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
254 CloseHandle(hwPipe2);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
255
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
256 return rc;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
257
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
258 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
259
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
260 void CSubprocess::ThreadFunc()
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
261 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
262
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
263 TRACE(_T("Reading from process %d\n"),m_idProcess);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
264
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
265 DWORD dwAvail;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
266
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 84
diff changeset
267 DWORD dwExitCode;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 84
diff changeset
268
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
269 while (!m_bKillThread && m_pfnContinue(m_pContinuationFuncParam) && ::PeekNamedPipe(m_hrPipe, NULL, 0, 0, &dwAvail, NULL)){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
270 //TRACE(_T("P%d\n"),dwAvail);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
271 if(dwAvail){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
272 dwAvail=MIN(dwAvail,80); // Read a maximum of 80 characters at a time
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
273 DWORD dwRead;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
274 char *buf=new char[dwAvail+1];
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
275 //TRACE(_T("R%d\n"),dwAvail);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
276 if(!::ReadFile(m_hrPipe, buf, dwAvail, &dwRead, NULL)){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
277 TRACE(_T("ReadFile returns false\n"));
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
278 delete [] buf;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
279 break;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
280 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
281 buf[dwRead]='\0';
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
282 Output(String::CStrToUnicodeStr(buf));
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
283 delete [] buf;
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 84
diff changeset
284 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 84
diff changeset
285 else if (!ProcessAlive())
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 84
diff changeset
286 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 84
diff changeset
287 TRACE(_T("m_bThreadTerminated=%d\n"),m_bThreadTerminated);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 84
diff changeset
288 break;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 84
diff changeset
289 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 84
diff changeset
290 // Fix for hanging in an endless loop under Windows ME, by Bill Diehls <billabloke@yahoo.com>
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 84
diff changeset
291 else if (::GetExitCodeProcess(m_hProcess, &dwExitCode) && dwExitCode!=STILL_ACTIVE)
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 84
diff changeset
292 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 84
diff changeset
293 break;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 84
diff changeset
294 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 84
diff changeset
295 else
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 84
diff changeset
296 {
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
297 CeCosThreadUtils::Sleep(250);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
298 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
299 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
300
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
301 ::GetExitCodeProcess(m_hProcess, &dwExitCode);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
302 m_nExitCode=dwExitCode;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
303
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
304 #ifdef _DEBUG
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
305 String str;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
306 switch(dwExitCode){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
307 case STILL_ACTIVE:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
308 str=_T("still alive");
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
309 if(m_bKillThread){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
310 str+=_T(" - requested to stop reading");
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
311 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
312 break;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
313 case PROCESS_KILL_EXIT_CODE:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
314 str=_T("killed");
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
315 break;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
316 default:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
317 str.Format(_T("terminated rc=%d"),dwExitCode);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
318 break;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
319 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
320 TRACE(_T("Finished reading from process %d (%s)\n"),m_idProcess,(LPCTSTR)str);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
321 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
322
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
323 CloseHandle(m_hrPipe);m_hrPipe=INVALID_HANDLE_VALUE;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
324 CloseHandle(m_hwPipe);m_hwPipe=INVALID_HANDLE_VALUE;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
325
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
326 if(m_bAutoDelete){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
327 m_bThreadTerminated=true; // or else the dtor will block
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
328 delete this;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
329 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
330 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
331
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
332 #else // UNIX
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
333
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
334 bool CSubprocess::CreateProcess(LPCTSTR pszCmdline)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
335 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
336 m_idProcess=0;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
337 int fdchild=-1; // the file descriptor for the child (slave) half of the pseudo-tty pair
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
338
2094
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
339 // Try the Unix98 scheme to get a pseudo-tty pair
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
340 String strMasterTty("/dev/ptmx"), strChildTty;
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
341 m_tty=open(strMasterTty, O_RDWR | O_NOCTTY);
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
342 if (-1!=m_tty) {
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
343 if ((0 == grantpt(m_tty)) && (0 == unlockpt(m_tty))) {
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
344 strChildTty = ptsname(m_tty);
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
345 if (!strChildTty.empty()) {
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
346 fdchild = open(strChildTty, O_RDWR);
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
347 }
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
348 }
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
349 if (-1==fdchild) {
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
350 close(m_tty);
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
351 m_tty=fdchild=-1;
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
352 } else {
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
353 VTRACE("opened %s - fd=%d\n",(LPCTSTR)strMasterTty,m_tty);
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
354 }
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
355 }
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
356
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
357 if (-1==m_tty) {
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
358 // Try the BSD scheme to get a free /dev/ptyp0 (master) and /dev/ttyp0 (slave) tty pair
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
359 for(unsigned int c=0;c<64;c++){
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
360 strMasterTty.Format("/dev/pty%c%x",'p'+c/16,c%16);
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
361
2094
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
362 m_tty=open(strMasterTty, O_RDWR | O_NOCTTY);
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
363 if (-1!=m_tty) {
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
364 strChildTty.Format("/dev/tty%c%x",'p'+c/16,c%16);
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
365
2094
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
366 fdchild = open(strChildTty, O_RDWR);
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
367 if (-1==fdchild) {
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
368 close(m_tty);
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
369 m_tty=fdchild=-1;
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
370 } else {
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
371 VTRACE("opened %s - fd=%d\n",(LPCTSTR)strMasterTty,m_tty);
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
372 break;
a22e535e2a4c * common/Subprocess.cpp (CSubprocess::CreateProcess): Try the Unix98 PTY
jld
parents: 177
diff changeset
373 }
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
374 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
375 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
376 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
377
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
378 if(-1==m_tty){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
379 ERROR(_T("Failed to get a pty\n"));
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
380 return false;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
381 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
382
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
383 TRACE(_T("Master pty %s (fd %d) slave pty %s (fd %d)\n"),(LPCTSTR)strMasterTty,m_tty,(LPCTSTR)strChildTty,fdchild);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
384
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
385 m_idProcess=fork();
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
386
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
387 switch (m_idProcess) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
388 // Fork failed
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
389 case -1:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
390 TRACE(_T("Failed to create process - %s\n"),strerror(errno));
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
391 m_idProcess=0;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
392 break;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
393 case 0:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
394 // Process is created (we're the child)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
395 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
396 // Close all descriptors except the slave side of the pseudo-terminal
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
397 for (int fd = 0; fd < (int) sysconf(_SC_OPEN_MAX); fd++) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
398 if(fd!=fdchild){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
399 close(fd);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
400 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
401 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
402 setsid();
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
403
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
404 dup2(fdchild, 0);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
405 dup2(fdchild, 1);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
406 dup2(fdchild, 2);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
407
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
408 close(fdchild);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
409
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
410 if(!m_strDir.empty()){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
411 if(0!=chdir(m_strDir)){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
412 if(m_bVerbose){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
413 fprintf(stderr,_T("*** Failed to change directory to %s\n"),(LPCTSTR)m_strDir);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
414 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
415 exit (5);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
416 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
417 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
418 if(m_bVerbose){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
419 fprintf(stderr,_T("*** Process %d created \"%s\"\n"),m_idProcess,pszCmdline);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
420 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
421
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
422 StringArray ar;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
423 int argc=String(pszCmdline).Chop(ar,_TCHAR(' '),true);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
424 TCHAR **argv=new TCHAR *[1+argc];
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
425 for(int i=0;i<argc;i++){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
426 argv[i]=new TCHAR[1+strlen(ar[i])];
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
427 strcpy(argv[i],ar[i]);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
428 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
429 argv[argc]=0;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
430 if(!m_strPath.empty()){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
431 _tputenv(String::SFormat(_T("PATH=%s"),(LPCTSTR)m_strPath));
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
432 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
433 _texecvp(argv[0], argv);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
434 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
435
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
436 fprintf(stderr,"exec error - %s\n",strerror(errno));
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
437 exit(4);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
438
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
439 default:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
440 // Process is created (we're the parent)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
441 TRACE(_T("Closing fd %d\n"),fdchild);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
442 close(fdchild);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
443 TRACE(_T("Forked to create process %s - process id <%d>\n"), pszCmdline, m_idProcess);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
444 break;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
445 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
446 return 0!=m_idProcess;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
447 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
448
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
449 void CSubprocess::ThreadFunc()
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
450 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
451 if(!CreateProcess(m_strCmd)){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
452 ERROR(_T("Failed to create process for %s\n"),(LPCTSTR)m_strCmd);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
453 } else {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
454 fcntl(m_tty,F_SETFL,O_NONBLOCK);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
455 int rc;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
456 do {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
457 TCHAR buf[4096];
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
458 rc=read(m_tty, buf, sizeof(buf)-1);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
459 if(rc>=0){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
460 buf[rc]='\0';
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
461 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
462 switch(rc){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
463 case -1:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
464 if(EAGAIN==errno){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
465 CeCosThreadUtils::Sleep(250);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
466 } else {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
467 goto Done;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
468 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
469 break;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
470 case 0:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
471 goto Done;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
472 continue;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
473 default:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
474 buf[rc]=_TCHAR('\0');
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
475 Output(String::CStrToUnicodeStr(buf));
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
476 continue;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
477 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
478 } while(!m_bKillThread && m_pfnContinue(m_pContinuationFuncParam));
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
479 Done:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
480 TRACE(_T("Closing fd %d\n"),m_tty);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
481 close (m_tty);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
482
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
483 switch(waitpid(m_idProcess,&m_nExitCode,WNOHANG));
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
484 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
485
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
486 if(m_bAutoDelete){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
487 delete this;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
488 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
489 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
490 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
491
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
492 void CSubprocess::Output (LPCTSTR psz)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
493 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
494 m_pfnLogfunc(m_pLogparam,psz);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
495 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
496
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
497 void CSubprocess::Send(LPCTSTR str)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
498 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
499 char *psz=String(str).GetCString();
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
500 int nToWrite=strlen(psz);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
501 const char *c=psz;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
502 do {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
503 #ifdef _WIN32
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
504 DWORD dwWritten;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
505 if(!::WriteFile(m_hwPipe,psz,nToWrite,&dwWritten,0)){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
506 break;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
507 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
508 #else
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
509 int dwWritten = write(m_tty, c, nToWrite);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
510 if(-1==dwWritten){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
511 break;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
512 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
513 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
514 nToWrite-=(int)dwWritten;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
515 c+=(int)dwWritten;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
516 } while (nToWrite>0);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
517 //::FlushFileBuffers(m_hwPipe);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
518 delete [] psz;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
519 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
520
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
521 bool CSubprocess::Kill(bool bRecurse)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
522 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
523 TRACE(_T("CSubprocess::Kill pid %d recurse=%d\n"),m_idProcess,bRecurse);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
524 PInfoArray arPinfo;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
525 bool rc=false;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
526 if(m_idProcess && -1!=m_idProcess){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
527 // Start of with the easy one:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
528 if(bRecurse) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
529 // Need to gather this information before we orphan our grandchildren:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
530 PSExtract(arPinfo);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
531 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
532
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
533 #ifdef _WIN32
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
534
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
535 if(m_hProcess){
84
489eb5632bc3 Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents: 82
diff changeset
536 TRACE(_T("Terminate process %s\n"),(LPCTSTR)Name(m_idProcess));
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
537 rc=(TRUE==::TerminateProcess(m_hProcess,PROCESS_KILL_EXIT_CODE));
84
489eb5632bc3 Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents: 82
diff changeset
538 // dtor's (or subsequent Run's) responsibility to close the handle
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
539 }
84
489eb5632bc3 Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents: 82
diff changeset
540
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
541 #else
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
542 rc=(0==kill(m_idProcess,SIGTERM));
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
543 int status;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
544 waitpid(m_idProcess,&status,WNOHANG);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
545 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
546
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
547 if(bRecurse) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
548 // kill process *and* its children
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
549 // FIXME: needs to be top-down
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
550 for(int i=0;i<(signed)arPinfo.size();i++){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
551 if(arPinfo[i].IsChildOf(m_idProcess)){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
552
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
553 #ifdef _WIN32
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
554 // begin hack
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
555 const String strName(Name(arPinfo[i].PID));
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
556 if(_tcsstr(strName,_T("eCosTest")) || _tcsstr(strName,_T("cmd.EXE")) || _tcsstr(strName,_T("CMD.EXE")) || arPinfo[i].PID==(signed)GetCurrentProcessId()){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
557 continue;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
558 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
559 // end hack
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
560 HANDLE hProcess=::OpenProcess(PROCESS_TERMINATE,false,arPinfo[i].PID);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
561 if(hProcess){
84
489eb5632bc3 Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents: 82
diff changeset
562 TRACE(_T("Terminate process %s\n"),(LPCTSTR)Name(arPinfo[i].PID));
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
563 rc&=(TRUE==::TerminateProcess(hProcess,PROCESS_KILL_EXIT_CODE));
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
564 CloseHandle(hProcess);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
565 } else {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
566 rc=false;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
567 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
568 #else
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
569 rc&=(0==kill(arPinfo[i].PID,SIGTERM));
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
570 int status;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
571 waitpid(arPinfo[i].PID,&status,WNOHANG);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
572 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
573 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
574 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
575 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
576 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
577 return rc;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
578 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
579
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
580 Time CSubprocess::CpuTime(bool bRecurse) const
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
581 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
582 Time t=0;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
583 // kill process *and* its children
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
584 // FIXME: needs to be top-down
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
585
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
586 #ifdef _WIN32
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
587 __int64 ftCreation,ftExit,ftKernel,ftUser;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
588 if(m_hProcess && ::GetProcessTimes (m_hProcess,(FILETIME *)&ftCreation,(FILETIME *)&ftExit,(FILETIME *)&ftKernel,(FILETIME *)&ftUser)){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
589 t+=Time((ftKernel+ftUser)/10000);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
590 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
591
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
592 if(bRecurse){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
593 PInfoArray arPinfo;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
594 PSExtract(arPinfo);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
595 if(m_idProcess && -1!=m_idProcess){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
596 for(int i=0;i<(signed)arPinfo.size();i++){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
597 if(arPinfo[i].IsChildOf(m_idProcess)){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
598 t+=arPinfo[i].tCpu;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
599 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
600 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
601 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
602 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
603 #else
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
604 PInfoArray arPinfo;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
605 PSExtract(arPinfo);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
606 for(int i=0;i<(signed)arPinfo.size();i++){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
607 if(arPinfo[i].PID==m_idProcess || arPinfo[i].IsChildOf(m_idProcess)){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
608 t+=arPinfo[i].tCpu;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
609 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
610 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
611 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
612 return t;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
613 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
614
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
615 #ifdef _WIN32
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
616 bool CSubprocess::PSExtract(CSubprocess::PInfoArray &arPinfo)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
617 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
618 bool rc=false;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
619 arPinfo.clear();
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
620 // If Windows NT:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
621 switch(GetPlatform()) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
622 case VER_PLATFORM_WIN32_NT:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
623 if(hInstLib1) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
624
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
625 // Get procedure addresses.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
626 static BOOL (WINAPI *lpfEnumProcesses)( DWORD *, DWORD cb, DWORD * ) = (BOOL(WINAPI *)(DWORD *,DWORD,DWORD*))GetProcAddress( hInstLib1, "EnumProcesses" ) ;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
627 if( lpfEnumProcesses) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
628
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
629 if(hInstLib2) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
630
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
631 static DWORD (WINAPI *lpfNtQueryInformationProcess)( HANDLE, int, void *, DWORD, LPDWORD ) =
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
632 (DWORD(WINAPI *)(HANDLE, int, void *, DWORD, LPDWORD)) GetProcAddress( hInstLib2,"NtQueryInformationProcess" ) ;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
633
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
634 if(lpfNtQueryInformationProcess){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
635 DWORD dwMaxPids=256;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
636 DWORD dwPidSize;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
637 DWORD *arPids = NULL ;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
638 do {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
639 delete [] arPids;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
640 arPids=new DWORD[dwMaxPids];
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
641 } while(lpfEnumProcesses(arPids, dwMaxPids, &dwPidSize) && dwPidSize/sizeof(DWORD)==dwMaxPids) ;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
642
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
643 if(dwPidSize/sizeof(DWORD)<dwMaxPids){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
644 rc=true;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
645 for( DWORD dwIndex = 0 ; (signed)dwIndex < dwPidSize/sizeof(DWORD); dwIndex++ ) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
646 // Regardless of OpenProcess success or failure, we
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
647 // still call the enum func with the ProcID.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
648 DWORD pid=arPids[dwIndex];
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
649 HANDLE hProcess=::OpenProcess( PROCESS_QUERY_INFORMATION, FALSE, pid );
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
650 if (hProcess ) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
651 struct {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
652 DWORD ExitStatus; // receives process termination status
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
653 DWORD PebBaseAddress; // receives process environment block address
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
654 DWORD AffinityMask; // receives process affinity mask
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
655 DWORD BasePriority; // receives process priority class
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
656 ULONG UniqueProcessId; // receives process identifier
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
657 ULONG InheritedFromUniqueProcessId; // receives parent process identifier
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
658 } pbi;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
659 memset( &pbi, 0, sizeof(pbi));
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
660 DWORD retLen;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
661 __int64 ftCreation,ftExit,ftKernel,ftUser;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
662 if(lpfNtQueryInformationProcess(hProcess, 0 /*ProcessBasicInformation*/, &pbi, sizeof(pbi), &retLen)>=0 &&
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
663 TRUE==::GetProcessTimes (hProcess,(FILETIME *)&ftCreation,(FILETIME *)&ftExit,(FILETIME *)&ftKernel,(FILETIME *)&ftUser)){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
664 // The second test is important. It excludes orphaned processes who appear to have been adopted by virtue of a new
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
665 // process having been created with the same ID as their original parent.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
666 PInfo p;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
667 p.PID=pid;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
668 p.PPID=pbi.InheritedFromUniqueProcessId;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
669 p.tCreation=ftCreation;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
670 p.tCpu=Time((ftKernel+ftUser)/10000);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
671 arPinfo.push_back(p);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
672 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
673
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
674 CloseHandle(hProcess);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
675
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
676 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
677 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
678 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
679 delete [] arPids;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
680 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
681 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
682 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
683 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
684 break;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
685 case VER_PLATFORM_WIN32_WINDOWS:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
686
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
687 if( hInstLib1) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
688
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
689 static HANDLE (WINAPI *lpfCreateToolhelp32Snapshot)(DWORD,DWORD)=
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
690 (HANDLE(WINAPI *)(DWORD,DWORD))GetProcAddress( hInstLib1,"CreateToolhelp32Snapshot" ) ;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
691 static BOOL (WINAPI *lpfProcess32First)(HANDLE,LPPROCESSENTRY32)=
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
692 (BOOL(WINAPI *)(HANDLE,LPPROCESSENTRY32))GetProcAddress( hInstLib1, "Process32First" ) ;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
693 static BOOL (WINAPI *lpfProcess32Next)(HANDLE,LPPROCESSENTRY32)=
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
694 (BOOL(WINAPI *)(HANDLE,LPPROCESSENTRY32))GetProcAddress( hInstLib1, "Process32Next" ) ;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
695 if( lpfProcess32Next && lpfProcess32First && lpfCreateToolhelp32Snapshot) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
696
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
697 // Get a handle to a Toolhelp snapshot of the systems
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
698 // processes.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
699 HANDLE hSnapShot = lpfCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) ;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
700 if(INVALID_HANDLE_VALUE != hSnapShot) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
701 // Get the first process' information.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
702 PROCESSENTRY32 procentry;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
703 procentry.dwSize = sizeof(PROCESSENTRY32) ;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
704 if(lpfProcess32First( hSnapShot, &procentry )){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
705 rc=true;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
706 do {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
707 PInfo p;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
708 p.PID=procentry.th32ProcessID;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
709 p.PPID=procentry.th32ParentProcessID;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
710 arPinfo.push_back(p);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
711 } while(lpfProcess32Next( hSnapShot, &procentry ));
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
712 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
713 CloseHandle(hSnapShot);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
714 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
715 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
716 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
717 break;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
718 default:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
719 break;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
720 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
721
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
722 SetParents(arPinfo);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
723
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
724 if(!rc){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
725 ERROR(_T("Couldn't get process information!\n"));
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
726 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
727 return rc;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
728 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
729
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
730 #else // UNIX
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
731
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
732 bool CSubprocess::PSExtract(CSubprocess::PInfoArray &arPinfo)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
733 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
734 arPinfo.clear();
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
735 int i;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
736 FILE *f=popen("ps -l",_T("r") MODE_TEXT);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
737 if(f){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
738 char buf[100];
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
739 while(fgets(buf,sizeof(buf)-1,f)){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
740 TCHAR discard[100];
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
741 PInfo p;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
742 // Output is in the form
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
743 // F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
744 //100 S 490 877 876 0 70 0 - 368 wait4 pts/0 00:00:00 bash
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
745 int F,UID,C,PRI,NI,SZ,HH,MM,SS;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
746 bool rc=(15==_stscanf(buf,_T("%d %s %d %d %d %d %d %d %s %d %s %s %d:%d:%d"),&F,discard,&UID,&p.PID,&p.PPID,&C,&PRI,&NI,discard,&SZ,discard,discard,&HH,&MM,&SS));
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
747 if(rc){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
748 p.tCpu=1000*(SS+60*(60*HH+MM));
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
749 arPinfo.push_back(p);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
750 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
751 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
752 pclose(f);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
753 for(i=0;i<(signed)arPinfo.size();i++){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
754 int pid=arPinfo[i].PPID;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
755 arPinfo[i].pParent=0;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
756 for(int j=0;j<(signed)arPinfo.size();j++){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
757 if(i!=j && arPinfo[j].PID==pid){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
758 arPinfo[i].pParent=&arPinfo[j];
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
759 break;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
760 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
761 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
762 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
763 } else {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
764 ERROR(_T("Failed to run ps -l\n"));
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
765 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
766 return true; //FIXME
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
767 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
768
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
769 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
770
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
771 void CSubprocess::SetParents(CSubprocess::PInfoArray &arPinfo)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
772 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
773 int i;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
774 for(i=0;i<(signed)arPinfo.size();i++){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
775 PInfo &p=arPinfo[i];
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
776 p.pParent=0;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
777 for(int j=0;j<(signed)arPinfo.size();j++){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
778 if(arPinfo[j].PID==p.PPID
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
779 #ifdef _WIN32
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
780 && arPinfo[j].tCreation<p.tCreation
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
781 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
782 )
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
783 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
784 arPinfo[i].pParent=&arPinfo[j];
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
785 break;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
786 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
787 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
788 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
789
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
790 // Check for circularity
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
791 bool bCircularity=false;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
792 for(i=0;i<(signed)arPinfo.size();i++){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
793 PInfo *p=&arPinfo[i];
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
794 for(int j=0;j<(signed)arPinfo.size() && p;j++){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
795 p=p->pParent;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
796 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
797 // If all is well, p should be NULL here. Otherwise we have a loop.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
798 if(p){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
799 // Make sure it can't foul things up:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
800 arPinfo[i].pParent=0;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
801 bCircularity=true;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
802 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
803 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
804
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
805 if(bCircularity){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
806 ERROR(_T("!!! Circularly linked process list at index %d\n"),i);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
807 for(int k=0;k<(signed)arPinfo.size();k++){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
808 const PInfo &p=arPinfo[k];
84
489eb5632bc3 Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents: 82
diff changeset
809 ERROR(_T("%d: %s ppid=%4d\n"),k,(LPCTSTR)Name(p.PID),p.PPID);
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
810 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
811 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
812 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
813
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
814 bool CSubprocess::PInfo::IsChildOf(int pid) const
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
815 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
816 for(PInfo *p=pParent;p && p!=this;p=p->pParent) { // guard against circular linkage
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
817 if(p->PID==pid){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
818 return true;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
819 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
820 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
821 return false;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
822 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
823
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
824 const String CSubprocess::Name(int pid)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
825 {
84
489eb5632bc3 Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents: 82
diff changeset
826 String str(String::SFormat(_T("id=%d"),pid));
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
827 #ifdef _DEBUG
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
828 #ifdef _WIN32
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
829 if(VER_PLATFORM_WIN32_NT==GetPlatform() && hInstLib1){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
830 static BOOL (WINAPI *lpfEnumProcessModules)( HANDLE, HMODULE *, DWORD, LPDWORD ) =
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
831 (BOOL(WINAPI *)(HANDLE, HMODULE *, DWORD, LPDWORD)) GetProcAddress( hInstLib1,"EnumProcessModules" ) ;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
832 static DWORD (WINAPI *lpfGetModuleFileNameEx)( HANDLE, HMODULE, LPTSTR, DWORD )=
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
833 (DWORD (WINAPI *)(HANDLE, HMODULE,LPTSTR, DWORD )) GetProcAddress( hInstLib1,"GetModuleFileNameExA" ) ;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
834 if( lpfEnumProcessModules && lpfGetModuleFileNameEx ) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
835 HANDLE hProcess=::OpenProcess(PROCESS_ALL_ACCESS,false,pid);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
836 if(hProcess) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
837 HMODULE hMod;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
838 DWORD dwSize;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
839 if(lpfEnumProcessModules( hProcess, &hMod, sizeof(HMODULE), &dwSize ) ){
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
840 // Get Full pathname:
84
489eb5632bc3 Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents: 82
diff changeset
841 TCHAR buf[1+MAX_PATH];
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
842 lpfGetModuleFileNameEx( hProcess, hMod, buf, MAX_PATH);
84
489eb5632bc3 Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents: 82
diff changeset
843 str+=_TCHAR(' ');
489eb5632bc3 Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents: 82
diff changeset
844 str+=buf;
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
845 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
846 CloseHandle(hProcess);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
847 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
848 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
849 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
850 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
851 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
852 return str;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
853 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
854
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
855 #ifdef _WIN32
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
856 DWORD CSubprocess::GetPlatform()
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
857 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
858 OSVERSIONINFO osver;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
859 osver.dwOSVersionInfoSize = sizeof( osver ) ;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
860 return GetVersionEx( &osver ) ? osver.dwPlatformId : (DWORD)-1;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
861 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
862 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
863
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
864 bool CSubprocess::ProcessAlive()
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
865 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
866 return !m_bThreadTerminated;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
867 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
868
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
869 void CSubprocess::CloseInput()
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
870 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
871 #ifdef _WIN32
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
872 CloseHandle(m_hwPipe);m_hwPipe=INVALID_HANDLE_VALUE;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
873 #else
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
874 close(m_tty);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
875 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
876 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
877
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
878 bool CSubprocess::Wait(Duration dTimeout)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
879 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
880 return CeCosThreadUtils::WaitFor(m_bThreadTerminated,dTimeout);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
881 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
882
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
883 const String CSubprocess::ErrorString() const
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
884 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
885 #ifdef _WIN32
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
886 TCHAR *pszMsg;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
887 FormatMessage(
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
888 FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
889 NULL,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
890 m_nErr,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
891 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
892 (LPTSTR)&pszMsg,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
893 0,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
894 NULL
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
895 );
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
896 return pszMsg;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
897 #else
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
898 return strerror(errno);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
899 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
900 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
901