summaryrefslogtreecommitdiff
path: root/src/monitor-cmd.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/monitor-cmd.cc')
-rw-r--r--src/monitor-cmd.cc35
1 files changed, 30 insertions, 5 deletions
diff --git a/src/monitor-cmd.cc b/src/monitor-cmd.cc
index b67ae7a..580f45f 100644
--- a/src/monitor-cmd.cc
+++ b/src/monitor-cmd.cc
@@ -16,6 +16,7 @@
#include "io.hh"
#include "ios_save.hh"
#include "looper.hh"
+#include "packages.hh"
#include "resolver.hh"
#include "monitor.hh"
@@ -23,8 +24,10 @@ namespace {
class Delegate : public Monitor::Delegate {
public:
- Delegate(std::ostream& out, bool interleave, Looper* looper)
- : out_(out), interleave_(interleave), looper_(looper), attached_(false) {
+ Delegate(std::ostream& out, bool interleave,
+ std::unique_ptr<PackagesWriter>&& writer, Looper* looper)
+ : out_(out), interleave_(interleave), writer_(std::move(writer)),
+ looper_(looper), attached_(false) {
}
void state(Monitor* monitor, Monitor::State state) override {
@@ -96,6 +99,11 @@ public:
private:
void print_package(Package& pkg, bool last, char const* data, size_t size) {
if (size == 0 && !last) return;
+ if (writer_) {
+ assert(last);
+ writer_->write(pkg, data, size);
+ return;
+ }
{
ios_save save(out_);
out_ << "*** " << pkg.timestamp.tv_sec << '.'
@@ -132,6 +140,7 @@ private:
std::ostream& out_;
bool interleave_;
+ std::unique_ptr<PackagesWriter> writer_;
Looper* looper_;
bool attached_;
std::unordered_map<uint32_t, Package> packages_;
@@ -153,11 +162,12 @@ void quit_loop(Looper* looper, int, uint8_t) {
}
bool run(std::ostream& out, bool interleave,
+ std::unique_ptr<PackagesWriter>&& writer,
std::string const& host, uint16_t port) {
std::unique_ptr<Looper> looper(Looper::create());
std::unique_ptr<Resolver> resolver(Resolver::create(looper.get()));
std::unique_ptr<Delegate> delegate(
- new Delegate(out, interleave, looper.get()));
+ new Delegate(out, interleave, std::move(writer), looper.get()));
std::unique_ptr<Monitor> monitor(
Monitor::create(looper.get(), resolver.get(), delegate.get()));
out << "# Connecting to " << host << ':' << port << std::endl;
@@ -182,6 +192,7 @@ int main(int argc, char** argv) {
args->add('i', "interleave",
"unless set packages are not output until they are complete");
args->add('o', "output", "FILE", "output packages to FILE instead of stdout");
+ args->add("tpp", "write tpp output format instead of readable text");
args->add('h', "help", "display this text and exit");
args->add('V', "version", "display version and exit");
if (!args->run(argc, argv)) {
@@ -223,6 +234,10 @@ int main(int argc, char** argv) {
port = 9000;
}
auto interleave = args->is_set('i');
+ if (interleave && args->is_set("tpp")) {
+ std::cerr << "Interleave and tpp options cannot be combined." << std::endl;
+ return EXIT_FAILURE;
+ }
auto output = args->arg('o', nullptr);
if (output) {
std::ofstream out(output, std::ofstream::trunc);
@@ -230,8 +245,18 @@ int main(int argc, char** argv) {
std::cerr << "Unable to open " << output << " for writing." << std::endl;
return EXIT_FAILURE;
}
- return run(out, interleave, host, port);
+ if (args->is_set("tpp")) {
+ return run(std::cout, interleave, std::unique_ptr<PackagesWriter>(
+ PackagesWriter::create(&out)), host, port);
+ } else {
+ return run(out, interleave, nullptr, host, port);
+ }
} else {
- return run(std::cout, interleave, host, port);
+ if (args->is_set("tpp")) {
+ return run(std::cerr, interleave, std::unique_ptr<PackagesWriter>(
+ PackagesWriter::create(&std::cout)), host, port);
+ } else {
+ return run(std::cout, interleave, nullptr, host, port);
+ }
}
}