From 025898f437c8487e044313c1a506d56d7f4f9e81 Mon Sep 17 00:00:00 2001 From: Thor Harald Johansen Date: Mon, 26 Jul 2021 08:04:27 +0200 Subject: [PATCH] Make Bogofilter register incoming emails; comment out redundant section --- include/popen2.hpp | 9 +++++++++ src/bogofilter-smtpd.cpp | 25 ++--------------------- src/popen2.cpp | 43 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 23 deletions(-) create mode 100644 include/popen2.hpp create mode 100644 src/popen2.cpp diff --git a/include/popen2.hpp b/include/popen2.hpp new file mode 100644 index 0000000..b61a016 --- /dev/null +++ b/include/popen2.hpp @@ -0,0 +1,9 @@ +#ifndef _POPEN2 +#define _POPEN2 + +#include + +// Like popen(), but returns two FILE*: child's stdin and stdout, respectively. +std::pair popen2(const char *command); + +#endif diff --git a/src/bogofilter-smtpd.cpp b/src/bogofilter-smtpd.cpp index 1c277a6..9a9b5f8 100644 --- a/src/bogofilter-smtpd.cpp +++ b/src/bogofilter-smtpd.cpp @@ -64,7 +64,7 @@ void on_data_line(protocol::protocol_t& protocol, protocol::message_t message) { } if(data_line == ".") { - FILE* f = popen("bogofilter -v 1>&2", "w"); + FILE* f = popen("bogofilter -vu 1>&2", "w"); for(string& line : session.message.header) { fprintf(f, "%s\n", line.c_str()); } @@ -102,27 +102,6 @@ void on_commit(protocol::protocol_t& protocol, protocol::message_t message) { auto session_token = protocol::session_token_from(message); try { auto& session = sessions.at(session_key); - /* - switch(session.status) { - case mail::status::SPAM: - debug && cerr << "Classified as spam" << endl; - - protocol.junk(session_key, session_token); - break; - - case mail::status::HAM: - case mail::status::UNSURE: - debug && cerr << "Classified as ham or unsure" << endl; - protocol.proceed(session_key, session_token); - break; - - case mail::status::ERROR: - debug && cerr << "Bogofilter error" << endl; - protocol.fail(session_key, session_token); - break; - } - */ - protocol.proceed(session_key, session_token); } catch(out_of_range& e) { cerr << "Unknown session key from SMTPD" << endl; @@ -154,4 +133,4 @@ int main(int argc, char** argv) { protocol.run(); return 0; -} \ No newline at end of file +} diff --git a/src/popen2.cpp b/src/popen2.cpp new file mode 100644 index 0000000..debc4b3 --- /dev/null +++ b/src/popen2.cpp @@ -0,0 +1,43 @@ +#ifndef _POPEN2 +#define _POPEN2 + +#include + +#include + +#include +#include +#include +#include + + +// Like popen(), but returns two FILE*: child's stdin and stdout, respectively. +std::pair popen2(const char *command) { + // pipes[0]: parent writes, child reads (child's stdin) + // pipes[1]: child writes, parent reads (child's stdout) + int pipes[2][2]; + + pipe(pipes[0]); + pipe(pipes[1]); + + if (fork() > 0) { + // parent + close(pipes[0][0]); + close(pipes[1][1]); + + return {fdopen(pipes[0][1], "w"), fdopen(pipes[1][0], "r")}; + } else { + // child + close(pipes[0][1]); + close(pipes[1][0]); + + dup2(pipes[0][0], STDIN_FILENO); + dup2(pipes[1][1], STDOUT_FILENO); + + execl("/bin/sh", "/bin/sh", "-c", command, NULL); + + exit(1); + } +} + +#endif