--- a/src/AwkHandler.h Fri May 03 17:33:00 2019 +0200
+++ b/src/AwkHandler.h Sun May 05 01:08:24 2019 +0200
@@ -55,6 +55,8 @@
Configuration configuration;
writer::RelationalWriter* relationalWriter;
+ int awkInputWriterFD = -1;
+
void createPipe(int& readerFD, int& writerFD) {
int fds[2];
int result = pipe(fds);
@@ -70,7 +72,19 @@
void closeOrThrow(int fd) {
int error = close(fd);
- if (error) throw cli::RelpipeCLIException(L"Unable to close FD: ", cli::CLI::EXIT_CODE_UNEXPECTED_ERROR); // TODO: better exceptions?
+ if (error) throw cli::RelpipeCLIException(L"Unable to close FD: " + to_wstring(fd) + L" from PID: " + to_wstring(getpid()), cli::CLI::EXIT_CODE_UNEXPECTED_ERROR); // TODO: better exceptions?
+ }
+
+ void cleanUp() {
+ if (awkInputWriterFD >= 0) {
+ closeOrThrow(awkInputWriterFD);
+ fwprintf(stderr, L"writing done and closed\n");
+ __pid_t waitResult1 = wait(NULL);
+ fwprintf(stderr, L"wait 1 done: %d\n", waitResult1);
+ __pid_t waitResult2 = wait(NULL);
+ fwprintf(stderr, L"wait 2 done: %d\n", waitResult2);
+ awkInputWriterFD = -1;
+ }
}
public:
@@ -79,10 +93,10 @@
}
void startRelation(string_t name, vector<AttributeMetadata> attributes) override {
+ cleanUp();
int awkInputReaderFD;
- int awkInputWriterFD;
int awkOutputReaderFD;
int awkOutputWriterFD;
@@ -95,11 +109,11 @@
throw cli::RelpipeCLIException(L"Unable to fork AWK process.", cli::CLI::EXIT_CODE_UNEXPECTED_ERROR); // TODO: better exceptions?
} else if (awkPid == 0) {
// AWK child process
- close(awkInputWriterFD);
- close(awkOutputReaderFD);
+ closeOrThrow(awkInputWriterFD);
+ closeOrThrow(awkOutputReaderFD);
- redirectFD(awkInputReaderFD, 0);
- redirectFD(awkOutputWriterFD, 1);
+ redirectFD(awkInputReaderFD, STDIN_FILENO);
+ redirectFD(awkOutputWriterFD, STDOUT_FILENO);
fwprintf(stderr, L"I am child AWK with PID: %d\n", getpid());
@@ -107,8 +121,8 @@
} else {
// Parent process
- close(awkInputReaderFD);
- close(awkOutputWriterFD);
+ closeOrThrow(awkInputReaderFD);
+ closeOrThrow(awkOutputWriterFD);
fwprintf(stderr, L"Forked AWK has PID: %d\n", awkPid);
__pid_t writerPid = fork();
@@ -117,7 +131,7 @@
throw cli::RelpipeCLIException(L"Unable to fork Writer process.", cli::CLI::EXIT_CODE_UNEXPECTED_ERROR); // TODO: better exceptions?
} else if (writerPid == 0) {
// Writer child process
- close(awkInputWriterFD);
+ closeOrThrow(awkInputWriterFD);
fwprintf(stderr, L"I am child Writer with PID: %d\n", getpid());
__gnu_cxx::stdio_filebuf<char> awkOutputReaderBuffer(awkOutputReaderFD, std::ios::in);
@@ -129,39 +143,35 @@
}
std::cout << "--- PIPE end ----------" << std::endl;
- close(awkOutputReaderFD);
+ closeOrThrow(awkOutputReaderFD);
+ exit(0);
} else {
// Parent process
- close(awkOutputReaderFD);
+ closeOrThrow(awkOutputReaderFD);
fwprintf(stderr, L"Forked Writer has PID: %d\n", writerPid);
dprintf(awkInputWriterFD, "hello world :-)\n");
- close(awkInputWriterFD);
+ //closeOrThrow(awkInputWriterFD);
/*
__gnu_cxx::stdio_filebuf<char> awkInputWriterBuffer(awkInputWriterFD, std::ios::out);
std::ostream awkInputWriter(&awkInputWriterBuffer);
awkInputWriter << "hello world :-)" << std::endl;
awkInputWriter.flush();
- close(awkInputWriterFD);
+ closeOrThrow(awkInputWriterFD);
*/
- fwprintf(stderr, L"writing done and closed\n");
- __pid_t waitResult1 = wait(NULL);
- fwprintf(stderr, L"wait 1 done: %d\n", waitResult1);
- __pid_t waitResult2 = wait(NULL);
- fwprintf(stderr, L"wait 2 done: %d\n", waitResult2);
}
}
}
void attribute(const string_t& value) override {
-
+ dprintf(awkInputWriterFD, "attribute!\n");
}
void endOfPipe() {
-
+ cleanUp();
}
};