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_setname_np(thread.native_handle(), "%s" , const_cast<char *>(name.c_str())); |
48 | #endif |
49 | } |
50 | |
51 | } // namespace fuzzer |
52 | |
53 | #endif |
54 | |