summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/monitor-cmd.cc35
-rw-r--r--src/packages.cc10
-rw-r--r--src/packages.hh5
3 files changed, 39 insertions, 11 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);
+ }
}
}
diff --git a/src/packages.cc b/src/packages.cc
index f2c4ba6..70f9de4 100644
--- a/src/packages.cc
+++ b/src/packages.cc
@@ -29,7 +29,7 @@ public:
}
}
- void write(Package const& package, std::string const& data) override {
+ void write(Package const& package, char const* data, size_t size) override {
if (!open_) {
assert(false);
return;
@@ -43,12 +43,12 @@ public:
ptr = backup.get();
write_package(package, ptr, need);
}
- uint8_t size[8];
- write_u64(size, need + data.size());
- out_->write(reinterpret_cast<char*>(size), 8);
+ uint8_t size_data[8];
+ write_u64(size_data, need + size);
+ out_->write(reinterpret_cast<char*>(size_data), 8);
out_->write(reinterpret_cast<char*>(ptr), need);
backup.reset();
- out_->write(data.data(), data.size());
+ out_->write(data, size);
count_++;
}
diff --git a/src/packages.hh b/src/packages.hh
index f696212..682a75b 100644
--- a/src/packages.hh
+++ b/src/packages.hh
@@ -11,7 +11,10 @@ public:
static PackagesWriter* create(std::ostream* out);
- virtual void write(Package const& package, std::string const& data) = 0;
+ virtual void write(Package const& package, char const* data, size_t size) = 0;
+ void write(Package const& package, std::string const& data) {
+ write(package, data.data(), data.size());
+ }
virtual void flush() = 0;
protected: