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_iterator.h"
6*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
7*6777b538SAndroid Build Coastguard Worker
8*6777b538SAndroid Build Coastguard Worker namespace base {
9*6777b538SAndroid Build Coastguard Worker
10*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
ProcessEntry()11*6777b538SAndroid Build Coastguard Worker ProcessEntry::ProcessEntry() : pid_(0), ppid_(0), gid_(0) {}
12*6777b538SAndroid Build Coastguard Worker ProcessEntry::ProcessEntry(const ProcessEntry& other) = default;
13*6777b538SAndroid Build Coastguard Worker ProcessEntry::~ProcessEntry() = default;
14*6777b538SAndroid Build Coastguard Worker #endif
15*6777b538SAndroid Build Coastguard Worker
NextProcessEntry()16*6777b538SAndroid Build Coastguard Worker const ProcessEntry* ProcessIterator::NextProcessEntry() {
17*6777b538SAndroid Build Coastguard Worker bool result = false;
18*6777b538SAndroid Build Coastguard Worker do {
19*6777b538SAndroid Build Coastguard Worker result = CheckForNextProcess();
20*6777b538SAndroid Build Coastguard Worker } while (result && !IncludeEntry());
21*6777b538SAndroid Build Coastguard Worker if (result)
22*6777b538SAndroid Build Coastguard Worker return &entry_;
23*6777b538SAndroid Build Coastguard Worker return nullptr;
24*6777b538SAndroid Build Coastguard Worker }
25*6777b538SAndroid Build Coastguard Worker
Snapshot()26*6777b538SAndroid Build Coastguard Worker ProcessIterator::ProcessEntries ProcessIterator::Snapshot() {
27*6777b538SAndroid Build Coastguard Worker ProcessEntries found;
28*6777b538SAndroid Build Coastguard Worker while (const ProcessEntry* process_entry = NextProcessEntry()) {
29*6777b538SAndroid Build Coastguard Worker found.push_back(*process_entry);
30*6777b538SAndroid Build Coastguard Worker }
31*6777b538SAndroid Build Coastguard Worker return found;
32*6777b538SAndroid Build Coastguard Worker }
33*6777b538SAndroid Build Coastguard Worker
IncludeEntry()34*6777b538SAndroid Build Coastguard Worker bool ProcessIterator::IncludeEntry() {
35*6777b538SAndroid Build Coastguard Worker return !filter_ || filter_->Includes(entry_);
36*6777b538SAndroid Build Coastguard Worker }
37*6777b538SAndroid Build Coastguard Worker
NamedProcessIterator(const FilePath::StringType & executable_name,const ProcessFilter * filter,bool use_prefix_match)38*6777b538SAndroid Build Coastguard Worker NamedProcessIterator::NamedProcessIterator(
39*6777b538SAndroid Build Coastguard Worker const FilePath::StringType& executable_name,
40*6777b538SAndroid Build Coastguard Worker const ProcessFilter* filter,
41*6777b538SAndroid Build Coastguard Worker bool use_prefix_match)
42*6777b538SAndroid Build Coastguard Worker : ProcessIterator(filter),
43*6777b538SAndroid Build Coastguard Worker executable_name_(executable_name),
44*6777b538SAndroid Build Coastguard Worker use_prefix_match_(use_prefix_match) {
45*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
46*6777b538SAndroid Build Coastguard Worker // On Android, the process name contains only the last 15 characters, which
47*6777b538SAndroid Build Coastguard Worker // is in file /proc/<pid>/stat, the string between open parenthesis and close
48*6777b538SAndroid Build Coastguard Worker // parenthesis. Please See ProcessIterator::CheckForNextProcess for details.
49*6777b538SAndroid Build Coastguard Worker // Now if the length of input process name is greater than 15, only save the
50*6777b538SAndroid Build Coastguard Worker // last 15 characters.
51*6777b538SAndroid Build Coastguard Worker if (executable_name_.size() > 15) {
52*6777b538SAndroid Build Coastguard Worker executable_name_ = FilePath::StringType(executable_name_,
53*6777b538SAndroid Build Coastguard Worker executable_name_.size() - 15, 15);
54*6777b538SAndroid Build Coastguard Worker }
55*6777b538SAndroid Build Coastguard Worker #endif
56*6777b538SAndroid Build Coastguard Worker }
57*6777b538SAndroid Build Coastguard Worker
58*6777b538SAndroid Build Coastguard Worker NamedProcessIterator::~NamedProcessIterator() = default;
59*6777b538SAndroid Build Coastguard Worker
GetProcessCount(const FilePath::StringType & executable_name,const ProcessFilter * filter)60*6777b538SAndroid Build Coastguard Worker int GetProcessCount(const FilePath::StringType& executable_name,
61*6777b538SAndroid Build Coastguard Worker const ProcessFilter* filter) {
62*6777b538SAndroid Build Coastguard Worker int count = 0;
63*6777b538SAndroid Build Coastguard Worker NamedProcessIterator iter(executable_name, filter);
64*6777b538SAndroid Build Coastguard Worker while (iter.NextProcessEntry())
65*6777b538SAndroid Build Coastguard Worker ++count;
66*6777b538SAndroid Build Coastguard Worker return count;
67*6777b538SAndroid Build Coastguard Worker }
68*6777b538SAndroid Build Coastguard Worker
69*6777b538SAndroid Build Coastguard Worker } // namespace base
70