1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #include "base/process/process_handle.h" 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker #include "base/files/file_util.h" 8*6777b538SAndroid Build Coastguard Worker #include "base/numerics/safe_conversions.h" 9*6777b538SAndroid Build Coastguard Worker #include "base/process/internal_linux.h" 10*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h" 11*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_AIX) 12*6777b538SAndroid Build Coastguard Worker #include "base/process/internal_aix.h" 13*6777b538SAndroid Build Coastguard Worker #endif 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker namespace base { 16*6777b538SAndroid Build Coastguard Worker GetParentProcessId(ProcessHandle process)17*6777b538SAndroid Build Coastguard WorkerProcessId GetParentProcessId(ProcessHandle process) { 18*6777b538SAndroid Build Coastguard Worker ProcessId pid = 19*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_AIX) 20*6777b538SAndroid Build Coastguard Worker internalAIX::ReadProcStatsAndGetFieldAsInt64(process, 21*6777b538SAndroid Build Coastguard Worker internalAIX::VM_PPID); 22*6777b538SAndroid Build Coastguard Worker #else 23*6777b538SAndroid Build Coastguard Worker checked_cast<ProcessId>(internal::ReadProcStatsAndGetFieldAsInt64( 24*6777b538SAndroid Build Coastguard Worker process, internal::VM_PPID)); 25*6777b538SAndroid Build Coastguard Worker #endif 26*6777b538SAndroid Build Coastguard Worker // TODO(zijiehe): Returns 0 if |process| does not have a parent process. 27*6777b538SAndroid Build Coastguard Worker if (pid) 28*6777b538SAndroid Build Coastguard Worker return pid; 29*6777b538SAndroid Build Coastguard Worker return -1; 30*6777b538SAndroid Build Coastguard Worker } 31*6777b538SAndroid Build Coastguard Worker GetProcessExecutablePath(ProcessHandle process)32*6777b538SAndroid Build Coastguard WorkerFilePath GetProcessExecutablePath(ProcessHandle process) { 33*6777b538SAndroid Build Coastguard Worker FilePath stat_file = internal::GetProcPidDir(process).Append("exe"); 34*6777b538SAndroid Build Coastguard Worker FilePath exe_name; 35*6777b538SAndroid Build Coastguard Worker if (!ReadSymbolicLink(stat_file, &exe_name)) { 36*6777b538SAndroid Build Coastguard Worker // No such process. Happens frequently in e.g. TerminateAllChromeProcesses 37*6777b538SAndroid Build Coastguard Worker return FilePath(); 38*6777b538SAndroid Build Coastguard Worker } 39*6777b538SAndroid Build Coastguard Worker return exe_name; 40*6777b538SAndroid Build Coastguard Worker } 41*6777b538SAndroid Build Coastguard Worker 42*6777b538SAndroid Build Coastguard Worker } // namespace base 43