xref: /openbsd-src/gnu/llvm/compiler-rt/lib/fuzzer/FuzzerUtilLinux.cpp (revision 810390e339a5425391477d5d41c78d7cab2424ac)
13cab2bb3Spatrick //===- FuzzerUtilLinux.cpp - Misc utils for Linux. ------------------------===//
23cab2bb3Spatrick //
33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information.
53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63cab2bb3Spatrick //
73cab2bb3Spatrick //===----------------------------------------------------------------------===//
83cab2bb3Spatrick // Misc utils for Linux.
93cab2bb3Spatrick //===----------------------------------------------------------------------===//
101f9cb04fSpatrick #include "FuzzerPlatform.h"
113cab2bb3Spatrick #if LIBFUZZER_LINUX || LIBFUZZER_NETBSD || LIBFUZZER_FREEBSD ||                \
12d89ec533Spatrick     LIBFUZZER_EMSCRIPTEN
133cab2bb3Spatrick #include "FuzzerCommand.h"
14*810390e3Srobert #include "FuzzerInternal.h"
153cab2bb3Spatrick 
16*810390e3Srobert #include <signal.h>
173cab2bb3Spatrick #include <stdlib.h>
183cab2bb3Spatrick #include <sys/types.h>
193cab2bb3Spatrick #include <sys/wait.h>
203cab2bb3Spatrick #include <unistd.h>
213cab2bb3Spatrick 
223cab2bb3Spatrick 
233cab2bb3Spatrick namespace fuzzer {
243cab2bb3Spatrick 
ExecuteCommand(const Command & Cmd)253cab2bb3Spatrick int ExecuteCommand(const Command &Cmd) {
263cab2bb3Spatrick   std::string CmdLine = Cmd.toString();
273cab2bb3Spatrick   int exit_code = system(CmdLine.c_str());
283cab2bb3Spatrick   if (WIFEXITED(exit_code))
293cab2bb3Spatrick     return WEXITSTATUS(exit_code);
30*810390e3Srobert   if (WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGINT)
31*810390e3Srobert     return Fuzzer::InterruptExitCode();
323cab2bb3Spatrick   return exit_code;
333cab2bb3Spatrick }
343cab2bb3Spatrick 
DiscardOutput(int Fd)353cab2bb3Spatrick void DiscardOutput(int Fd) {
363cab2bb3Spatrick   FILE* Temp = fopen("/dev/null", "w");
373cab2bb3Spatrick   if (!Temp)
383cab2bb3Spatrick     return;
393cab2bb3Spatrick   dup2(fileno(Temp), Fd);
403cab2bb3Spatrick   fclose(Temp);
413cab2bb3Spatrick }
423cab2bb3Spatrick 
433cab2bb3Spatrick } // namespace fuzzer
443cab2bb3Spatrick 
453cab2bb3Spatrick #endif
46