File: test_in_out_buf.cpp

package info (click to toggle)
libgtextutils 0.7-6
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 368 kB
  • sloc: cpp: 947; ansic: 418; makefile: 81
file content (92 lines) | stat: -rw-r--r-- 2,304 bytes parent folder | download | duplicates (6)
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/*
   Gordon's Text-Utilities Library
   Copyright (C) 2009-2013 Assaf Gordon (assafgordon@gmail.com)

   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU Affero General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU Affero General Public License for more details.

   You should have received a copy of the GNU Affero General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>
*/
#include <vector>
#include <map>
#include <string>
#include <iostream>
#include <fstream>

#include <err.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

#include <gtextutils/inbuf1.hpp>
#include <gtextutils/outbuf3.hpp>
#include "tests_assertion.h"

/*
 * Test for File-Descriptor-based input and output buffers, through a system pipe.
 */

using namespace std;

int fork_pipe_command ( const char* program, const char* output_filename)
{
	int fd;
	pid_t child_pid;
	int parent_pipe[2];
	if (pipe(parent_pipe)!=0)
		err(1,"pipe (for gzip) failed");
		
	child_pid = fork();
	if (child_pid>0) {
		/* The parent process */
		fd = parent_pipe[1];
		close(parent_pipe[0]);
		return fd;
	}

	/* The child process */

	//the compressor's STDIN is the pipe from the parent
	dup2(parent_pipe[0], STDIN_FILENO);
	close(parent_pipe[1]);

	//the compressor's STDOUT is the output file
	//(which can be the parent's STDOUT, too)
	fd = open(output_filename, O_WRONLY | O_CREAT, 0666 );
	if (fd==-1)
		err(1,"Failed to open output '%s'", output_filename);
	dup2(fd, STDOUT_FILENO);
	
	//Run GZIP
	execlp(program,program,"-f",NULL);

	//Should never get here...
	err(1,"execlp(%s) failed",program);
}

void test_compress_output()
{
	int pipe_out_fd = fork_pipe_command ( "gzip", "fdout.txt.gz" ) ;
	josuttis_fdostream out(pipe_out_fd);

	out << "first line" << endl;
	out << "second line" << endl;
	out << "third line" << endl;

	close(pipe_out_fd);
}

int main()
{
	test_compress_output();
}