File: process.cpp

package info (click to toggle)
libfilezilla 0.54.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,504 kB
  • sloc: cpp: 31,105; sh: 4,241; makefile: 375; xml: 37
file content (111 lines) | stat: -rw-r--r-- 2,678 bytes parent folder | download | duplicates (3)
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <libfilezilla/process.hpp>

#include <iostream>
#include <string>

namespace {
// Helper function to extract a directory from argv[0] so that the
// demos can be run independent of the current working directory.
fz::native_string get_program_dir(int argc, char ** argv)
{
	std::string_view path;
	if (argc > 0) {
		path = argv[0];
#ifdef FZ_WINDOWS
		auto delim = path.find_last_of("/\\");
#else
		auto delim = path.find_last_of("/");
#endif
		if (delim == std::string::npos) {
			path = std::string_view();
		}
		else {
			path = path.substr(0, delim + 1);
		}
	}

	return fz::to_native(path);
}

#ifdef FZ_WINDOWS
auto suffix = fzT(".exe");
#else
auto suffix = fzT("");
#endif
}

int main(int argc, char *argv[])
{
	// Start the timer_fizzbuzz demo which should be in the same directory as the process demo
	fz::process p;
	if (!p.spawn(get_program_dir(argc, argv) + fzT("timer_fizzbuzz") + suffix)) {
		std::cerr << "Could not spawn process" << std::endl;
		return 1;
	}
	std::cout << "Spawned process" << std::endl;

	// Send a line to the process
	if (!p.write("6\n")) {
		std::cerr << "Sending data to the process failed. Looks like it could not be started or has quit early." << std::endl;
		return 1;
	}

	std::cout << "Waiting on process to print woof..." << std::endl;


	// We don't want to do anything else while waiting, so we don't need a thread to receive data asynchronously
	std::string input;
	bool done = false;
	while (!done) {
		char buf[100];
		fz::rwresult r = p.read(buf, 100);
		if (!r) {
			std::cerr << "Could not read from process" << std::endl;
			return 1;
		}
		else if (!r.value_) {
			std::cerr << "Unexpected EOF from process" << std::endl;
			return 1;
		}

		input += std::string(buf, r.value_);

		// Extract complete lines from the input
		auto delim = input.find_first_of("\r\n");
		while (delim != std::string::npos) {
			std::string line = input.substr(0, delim);
			input = input.substr(delim + 1);
			delim = input.find_first_of("\r\n");

			if (!line.empty()) {
				std::cout << "Received line from process: " << line << std::endl;
				if (line == "woof") {
					done = true;
				}
			}
		}
	}

	// Send a line to the process
	if (!p.write("0\n")) {
		std::cerr << "Sending data to the process failed. Looks like it could not be started or has quit early." << std::endl;
		return 1;
	}

	std::cout << "Told process to quit." << std::endl;

	while (true) {
		char buf[100];
		fz::rwresult r = p.read(buf, 100);
		if (!r) {
			std::cerr << "Could not read from process" << std::endl;
			return 1;
		}
		else if (!r.value_) {
			std::cerr << "Received the expected EOF from process" << std::endl;
			break;
		}
	}

	return 0;
}