aboutsummaryrefslogtreecommitdiff
path: root/moulitest_read_stdout.c
blob: e2e61d2a0921ba2403e791ab5ebc22a5a22bec61 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/*
 * This is a copy and paste from
 * https://github.com/yyang42/moulitest/blob/205892c29f77027dc45c6a09b6ec26b5a5f8116c/testframework/v3/srcs/capture/capture.c
 */

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
/* #include <capture.h> */
#include <errno.h>
#include <assert.h>

#define MAX_LEN 42000
#define BUF_SIZE MAX_LEN + 1
#define READ 0
#define WRITE 1
#define NO_FD_OPENED -1

int saved_stdout = NO_FD_OPENED;
int	out_pipe[2];
char out_buffer[10 * 1000];

void capture_close_saved_stdout(void)
{
	extern int saved_stdout;

	if (saved_stdout != NO_FD_OPENED)
	{
		/* fprintf(stderr, "== close %d ==\n", saved_stdout); */
		dup2(saved_stdout, STDOUT_FILENO);
		close(saved_stdout); /* important ! */
		saved_stdout = NO_FD_OPENED;
		close(out_pipe[READ]);
		close(out_pipe[WRITE]);
	}
}

void capture_stdout(void)
{
	capture_close_saved_stdout();
	if(pipe(out_pipe) != 0) { /* make a pipe */
		assert(0);
	}
	assert(saved_stdout < 100);
	saved_stdout = dup(STDOUT_FILENO); /* save stdout for display later */
	dup2(out_pipe[WRITE], STDOUT_FILENO); /* redirect stdout to the pipe */
}

static void capture_unblock_fd(int fd)
{
	int flags = fcntl(fd, F_GETFL, 0);
	fcntl(fd, F_SETFL, flags | O_NONBLOCK);
}

char *capture_stdout_get_buf(void)
{
	int ret;
	fflush(stdout);

	capture_unblock_fd(out_pipe[0]);
	*(out_buffer) = '\0';
	ret = read(out_pipe[READ], out_buffer, MAX_LEN); /* read from pipe into buffer */
	out_buffer[ret] = '\0';
	return (out_buffer);
}

void capture_stdout_destroy(void)
{
	extern int saved_stdout;
	dup2(saved_stdout, STDOUT_FILENO); /* reconnect stdout for testing */
	capture_close_saved_stdout();
	//free(cap);
}