1 //===-- FDReader.cpp ------------------------------------------------------===// 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 9 #include "FDReader.h" 10 #include <cassert> 11 #include <cstring> 12 #include <iostream> 13 #include <unistd.h> 14 15 namespace __llvm_libc { 16 namespace testutils { 17 FDReader()18FDReader::FDReader() { 19 if (::pipe(pipefd)) { 20 std::cerr << "pipe(2) failed"; 21 abort(); 22 } 23 } 24 ~FDReader()25FDReader::~FDReader() { 26 ::close(pipefd[0]); 27 ::close(pipefd[1]); 28 } 29 matchWritten(const char * str)30bool FDReader::matchWritten(const char *str) { 31 32 ::close(pipefd[1]); 33 34 constexpr ssize_t ChunkSize = 4096 * 4; 35 36 char Buffer[ChunkSize]; 37 std::string PipeStr; 38 std::string InputStr(str); 39 40 for (int BytesRead; (BytesRead = ::read(pipefd[0], Buffer, ChunkSize));) { 41 if (BytesRead > 0) { 42 PipeStr.insert(PipeStr.size(), Buffer, BytesRead); 43 } else { 44 assert(0 && "Error reading from pipe"); 45 return false; 46 } 47 } 48 49 return PipeStr == InputStr; 50 } 51 52 } // namespace testutils 53 } // namespace __llvm_libc 54