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