xref: /src/contrib/llvm-project/compiler-rt/lib/fuzzer/FuzzerUtilLinux.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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 Andric int 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 Andric void 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 Andric void 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