1 //===- FuzzerUtilLinux.cpp - Misc utils for Linux. ------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // Misc utils for Linux. 9 //===----------------------------------------------------------------------===// 10 #include "FuzzerPlatform.h" 11 #if LIBFUZZER_LINUX || LIBFUZZER_NETBSD || LIBFUZZER_FREEBSD || \ 12 LIBFUZZER_EMSCRIPTEN 13 #include "FuzzerCommand.h" 14 #include "FuzzerInternal.h" 15 16 #include <signal.h> 17 #include <stdlib.h> 18 #include <sys/types.h> 19 #include <sys/wait.h> 20 #include <unistd.h> 21 22 23 namespace fuzzer { 24 25 int ExecuteCommand(const Command &Cmd) { 26 std::string CmdLine = Cmd.toString(); 27 int exit_code = system(CmdLine.c_str()); 28 if (WIFEXITED(exit_code)) 29 return WEXITSTATUS(exit_code); 30 if (WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGINT) 31 return Fuzzer::InterruptExitCode(); 32 return exit_code; 33 } 34 35 void DiscardOutput(int Fd) { 36 FILE* Temp = fopen("/dev/null", "w"); 37 if (!Temp) 38 return; 39 dup2(fileno(Temp), Fd); 40 fclose(Temp); 41 } 42 43 void SetThreadName(std::thread &thread, const std::string &name) { 44 #if LIBFUZZER_LINUX || LIBFUZZER_FREEBSD 45 (void)pthread_setname_np(thread.native_handle(), name.c_str()); 46 #elif LIBFUZZER_NETBSD 47 (void)pthread_set_name_np(thread.native_handle(), "%s", name.c_str()); 48 #endif 49 } 50 51 } // namespace fuzzer 52 53 #endif 54