1*4b9c6d91SCole Faust /* Copyright 2021 The ChromiumOS Authors 2*4b9c6d91SCole Faust * Use of this source code is governed by a BSD-style license that can be 3*4b9c6d91SCole Faust * found in the LICENSE file. 4*4b9c6d91SCole Faust */ 5*4b9c6d91SCole Faust 6*4b9c6d91SCole Faust #include "test_util.h" 7*4b9c6d91SCole Faust 8*4b9c6d91SCole Faust #include <stdio.h> 9*4b9c6d91SCole Faust #include <stdlib.h> 10*4b9c6d91SCole Faust #include <string.h> 11*4b9c6d91SCole Faust #include <unistd.h> 12*4b9c6d91SCole Faust 13*4b9c6d91SCole Faust #include "util.h" 14*4b9c6d91SCole Faust 15*4b9c6d91SCole Faust #define MAX_PIPE_CAPACITY (4096) 16*4b9c6d91SCole Faust write_to_pipe(const std::string & content)17*4b9c6d91SCole FaustFILE *write_to_pipe(const std::string& content) 18*4b9c6d91SCole Faust { 19*4b9c6d91SCole Faust int pipefd[2]; 20*4b9c6d91SCole Faust if (pipe(pipefd) == -1) { 21*4b9c6d91SCole Faust die("pipe(pipefd) failed"); 22*4b9c6d91SCole Faust } 23*4b9c6d91SCole Faust 24*4b9c6d91SCole Faust size_t len = content.length(); 25*4b9c6d91SCole Faust if (len > MAX_PIPE_CAPACITY) 26*4b9c6d91SCole Faust die("write_to_pipe cannot handle >4KB content."); 27*4b9c6d91SCole Faust size_t i = 0; 28*4b9c6d91SCole Faust unsigned int attempts = 0; 29*4b9c6d91SCole Faust ssize_t ret; 30*4b9c6d91SCole Faust while (i < len) { 31*4b9c6d91SCole Faust ret = write(pipefd[1], content.c_str() + i, len - i); 32*4b9c6d91SCole Faust if (ret == -1) { 33*4b9c6d91SCole Faust close(pipefd[0]); 34*4b9c6d91SCole Faust close(pipefd[1]); 35*4b9c6d91SCole Faust return NULL; 36*4b9c6d91SCole Faust } 37*4b9c6d91SCole Faust 38*4b9c6d91SCole Faust /* If we write 0 bytes three times in a row, fail. */ 39*4b9c6d91SCole Faust if (ret == 0) { 40*4b9c6d91SCole Faust if (++attempts >= 3) { 41*4b9c6d91SCole Faust close(pipefd[0]); 42*4b9c6d91SCole Faust close(pipefd[1]); 43*4b9c6d91SCole Faust warn("write() returned 0 three times in a row"); 44*4b9c6d91SCole Faust return NULL; 45*4b9c6d91SCole Faust } 46*4b9c6d91SCole Faust continue; 47*4b9c6d91SCole Faust } 48*4b9c6d91SCole Faust 49*4b9c6d91SCole Faust attempts = 0; 50*4b9c6d91SCole Faust i += (size_t)ret; 51*4b9c6d91SCole Faust } 52*4b9c6d91SCole Faust 53*4b9c6d91SCole Faust close(pipefd[1]); 54*4b9c6d91SCole Faust return fdopen(pipefd[0], "r"); 55*4b9c6d91SCole Faust } 56*4b9c6d91SCole Faust source_path(const std::string & file)57*4b9c6d91SCole Fauststd::string source_path(const std::string& file) { 58*4b9c6d91SCole Faust std::string srcdir = getenv("SRC") ? : "."; 59*4b9c6d91SCole Faust return srcdir + "/" + file; 60*4b9c6d91SCole Faust } 61