/* * Copyright (c) 2021, Aziz Berkay Yesilyurt * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include #include #include ErrorOr serenity_main(Main::Arguments args) { TRY(Core::System::pledge("stdio rpath")); TRY(Core::System::unveil("/sys/kernel/processes", "r")); TRY(Core::System::unveil("/etc/passwd", "r")); TRY(Core::System::unveil(nullptr, nullptr)); bool case_insensitive = false; bool invert_match = false; char const* pattern = nullptr; Core::ArgsParser args_parser; args_parser.add_option(case_insensitive, "Make matches case-insensitive", nullptr, 'i'); args_parser.add_option(invert_match, "Select non-matching lines", "invert-match", 'v'); args_parser.add_positional_argument(pattern, "Process name to search for", "process-name"); args_parser.parse(args); PosixOptions options {}; if (case_insensitive) options |= PosixFlags::Insensitive; Regex re(pattern, options); if (re.parser_result.error != regex::Error::NoError) { return 1; } auto all_processes = Core::ProcessStatisticsReader::get_all(); if (!all_processes.has_value()) return 1; Vector matches; for (auto& it : all_processes.value().processes) { auto result = re.match(it.name, PosixFlags::Global); if (result.success ^ invert_match) { matches.append(it.pid); } } quick_sort(matches); for (auto& match : matches) { outln("{}", match); } return 0; }