1cdf4f305SDimitry Andric //===- FuzzerUtilLinux.cpp - Misc utils for Linux. ------------------------===// 2cdf4f305SDimitry Andric // 38f3cadc2SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 48f3cadc2SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 58f3cadc2SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6cdf4f305SDimitry Andric // 7cdf4f305SDimitry Andric //===----------------------------------------------------------------------===// 8cdf4f305SDimitry Andric // Misc utils for Linux. 9cdf4f305SDimitry Andric //===----------------------------------------------------------------------===// 10cfca06d7SDimitry Andric #include "FuzzerPlatform.h" 1193c1b73aSDimitry Andric #if LIBFUZZER_LINUX || LIBFUZZER_NETBSD || LIBFUZZER_FREEBSD || \ 12b60736ecSDimitry Andric LIBFUZZER_EMSCRIPTEN 13cdf4f305SDimitry Andric #include "FuzzerCommand.h" 14e3b55780SDimitry Andric #include "FuzzerInternal.h" 15cdf4f305SDimitry Andric 16e3b55780SDimitry Andric #include <signal.h> 17cdf4f305SDimitry Andric #include <stdlib.h> 188f3cadc2SDimitry Andric #include <sys/types.h> 198f3cadc2SDimitry Andric #include <sys/wait.h> 20706b4fc4SDimitry Andric #include <unistd.h> 218f3cadc2SDimitry Andric 22cdf4f305SDimitry Andric 23cdf4f305SDimitry Andric namespace fuzzer { 24cdf4f305SDimitry Andric ExecuteCommand(const Command & Cmd)25cdf4f305SDimitry Andricint ExecuteCommand(const Command &Cmd) { 26cdf4f305SDimitry Andric std::string CmdLine = Cmd.toString(); 278f3cadc2SDimitry Andric int exit_code = system(CmdLine.c_str()); 288f3cadc2SDimitry Andric if (WIFEXITED(exit_code)) 298f3cadc2SDimitry Andric return WEXITSTATUS(exit_code); 30e3b55780SDimitry Andric if (WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGINT) 31e3b55780SDimitry Andric return Fuzzer::InterruptExitCode(); 328f3cadc2SDimitry Andric return exit_code; 33cdf4f305SDimitry Andric } 34cdf4f305SDimitry Andric DiscardOutput(int Fd)35706b4fc4SDimitry Andricvoid DiscardOutput(int Fd) { 36706b4fc4SDimitry Andric FILE* Temp = fopen("/dev/null", "w"); 37706b4fc4SDimitry Andric if (!Temp) 38706b4fc4SDimitry Andric return; 39706b4fc4SDimitry Andric dup2(fileno(Temp), Fd); 40706b4fc4SDimitry Andric fclose(Temp); 41706b4fc4SDimitry Andric } 42706b4fc4SDimitry Andric SetThreadName(std::thread & thread,const std::string & name)43b1c73532SDimitry Andricvoid SetThreadName(std::thread &thread, const std::string &name) { 44b1c73532SDimitry Andric #if LIBFUZZER_LINUX || LIBFUZZER_FREEBSD 45b1c73532SDimitry Andric (void)pthread_setname_np(thread.native_handle(), name.c_str()); 46b1c73532SDimitry Andric #elif LIBFUZZER_NETBSD 47ac9a064cSDimitry Andric (void)pthread_setname_np(thread.native_handle(), "%s", const_cast<char *>(name.c_str())); 48b1c73532SDimitry Andric #endif 49b1c73532SDimitry Andric } 50b1c73532SDimitry Andric 51cdf4f305SDimitry Andric } // namespace fuzzer 52cdf4f305SDimitry Andric 5393c1b73aSDimitry Andric #endif 54