1/*
2 * Copyright 2005-2010, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include "external_commands.h"
8
9#include <errno.h>
10#include <stdio.h>
11#include <string.h>
12
13
14static FILE*
15get_input()
16{
17	static FILE* sInput = fdopen(3, "r");
18	return sInput;
19}
20
21
22static FILE*
23get_output()
24{
25	static FILE* sOutput = fdopen(4, "w");
26	return sOutput;
27}
28
29
30bool
31FSShell::get_external_command(char* buffer, int size)
32{
33	// get the input stream
34	FILE* in = get_input();
35	if (in == NULL) {
36		fprintf(stderr, "Error: Failed to open command input: %s\n",
37			strerror(errno));
38		return false;
39	}
40
41	while (true) {
42		// read a command line
43		if (fgets(buffer, size, in) != NULL)
44			return true;
45
46		// when interrupted, try again
47		if (errno != EINTR)
48			return false;
49	}
50}
51
52
53void
54FSShell::reply_to_external_command(int result)
55{
56	// get the output stream
57	FILE* out = get_output();
58	if (out == NULL) {
59		fprintf(stderr, "Error: Failed to open command output: %s\n",
60			strerror(errno));
61		return;
62	}
63
64	if (fprintf(out, "%d\n", result) < 0 || fflush(out) == EOF) {
65		fprintf(stderr, "Error: Failed to write command reply to output reply: "
66			"%s\n", strerror(errno));
67	}
68}
69
70
71void
72FSShell::external_command_cleanup()
73{
74	// The file will be closed automatically when the team exits.
75}
76