xref: /freebsd-src/contrib/llvm-project/compiler-rt/lib/fuzzer/FuzzerUtilLinux.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric //===- FuzzerUtilLinux.cpp - Misc utils for Linux. ------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric // Misc utils for Linux.
90b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
105ffd83dbSDimitry Andric #include "FuzzerPlatform.h"
110b57cec5SDimitry Andric #if LIBFUZZER_LINUX || LIBFUZZER_NETBSD || LIBFUZZER_FREEBSD ||                \
12e8d8bef9SDimitry Andric     LIBFUZZER_EMSCRIPTEN
130b57cec5SDimitry Andric #include "FuzzerCommand.h"
14bdd1243dSDimitry Andric #include "FuzzerInternal.h"
150b57cec5SDimitry Andric 
16bdd1243dSDimitry Andric #include <signal.h>
170b57cec5SDimitry Andric #include <stdlib.h>
180b57cec5SDimitry Andric #include <sys/types.h>
190b57cec5SDimitry Andric #include <sys/wait.h>
20480093f4SDimitry Andric #include <unistd.h>
210b57cec5SDimitry Andric 
220b57cec5SDimitry Andric 
230b57cec5SDimitry Andric namespace fuzzer {
240b57cec5SDimitry Andric 
250b57cec5SDimitry Andric int ExecuteCommand(const Command &Cmd) {
260b57cec5SDimitry Andric   std::string CmdLine = Cmd.toString();
270b57cec5SDimitry Andric   int exit_code = system(CmdLine.c_str());
280b57cec5SDimitry Andric   if (WIFEXITED(exit_code))
290b57cec5SDimitry Andric     return WEXITSTATUS(exit_code);
30bdd1243dSDimitry Andric   if (WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGINT)
31bdd1243dSDimitry Andric     return Fuzzer::InterruptExitCode();
320b57cec5SDimitry Andric   return exit_code;
330b57cec5SDimitry Andric }
340b57cec5SDimitry Andric 
35480093f4SDimitry Andric void DiscardOutput(int Fd) {
36480093f4SDimitry Andric   FILE* Temp = fopen("/dev/null", "w");
37480093f4SDimitry Andric   if (!Temp)
38480093f4SDimitry Andric     return;
39480093f4SDimitry Andric   dup2(fileno(Temp), Fd);
40480093f4SDimitry Andric   fclose(Temp);
41480093f4SDimitry Andric }
42480093f4SDimitry Andric 
435f757f3fSDimitry Andric void SetThreadName(std::thread &thread, const std::string &name) {
445f757f3fSDimitry Andric #if LIBFUZZER_LINUX || LIBFUZZER_FREEBSD
455f757f3fSDimitry Andric   (void)pthread_setname_np(thread.native_handle(), name.c_str());
465f757f3fSDimitry Andric #elif LIBFUZZER_NETBSD
47*0fca6ea1SDimitry Andric   (void)pthread_setname_np(thread.native_handle(), "%s", const_cast<char *>(name.c_str()));
485f757f3fSDimitry Andric #endif
495f757f3fSDimitry Andric }
505f757f3fSDimitry Andric 
510b57cec5SDimitry Andric } // namespace fuzzer
520b57cec5SDimitry Andric 
530b57cec5SDimitry Andric #endif
54