diff options
Diffstat (limited to 'bbot/machine.cxx')
-rw-r--r-- | bbot/machine.cxx | 145 |
1 files changed, 78 insertions, 67 deletions
diff --git a/bbot/machine.cxx b/bbot/machine.cxx index bf0c0bf..2f1e56b 100644 --- a/bbot/machine.cxx +++ b/bbot/machine.cxx @@ -165,13 +165,13 @@ namespace bbot shutdown (size_t& seconds) override; virtual void - forcedown () override; + forcedown (bool fail_hard) override; virtual void suspend () override; bool - wait (size_t& seconds) override; + wait (size_t& seconds, bool fail_hard) override; using machine::wait; @@ -180,7 +180,7 @@ namespace bbot private: void - monitor_command (const string&); + monitor_command (const string&, bool fail_hard = true); private: path kvm; // Hypervisor binary. @@ -341,10 +341,10 @@ namespace bbot } void kvm_machine:: - forcedown () + forcedown (bool fh) { - monitor_command ("system_reset"); - wait (); + monitor_command ("system_reset", fh); + wait (fh); } void kvm_machine:: @@ -362,91 +362,102 @@ namespace bbot } bool kvm_machine:: - wait (size_t& sec) - try + wait (size_t& sec, bool fh) { - tracer trace ("kvm_machine::wait"); + try + { + tracer trace ("kvm_machine::wait"); + + bool t; + for (; !(t = proc.try_wait ()) && sec != 0; --sec) + sleep (1); - bool t; - for (; !(t = proc.try_wait ()) && sec != 0; --sec) - sleep (1); + if (t) + { + run_io_finish (trace, proc, kvm, fh); + net.destroy (); //@@ Always fails hard. + try_rmfile (monitor, true); // QEMU doesn't seem to remove it. + } - if (t) + return t; + } + catch (const process_error& e) { - run_io_finish (trace, proc, kvm); - net.destroy (); - try_rmfile (monitor, true); // QEMU doesn't seem to remove it. + diag_record dr; if (fh) dr << fail; else dr << error; + dr << "unable to execute " << kvm << ": " << e; } - return t; - } - catch (const process_error& e) - { - fail << "unable to execute " << kvm << ": " << e << endf; + throw failed (); } void kvm_machine:: - monitor_command (const string& c) - try + monitor_command (const string& c, bool fh) { - sockaddr_un addr; - addr.sun_family = AF_LOCAL; - strcpy (addr.sun_path, monitor.string ().c_str ()); // Size check in ctor + try + { + sockaddr_un addr; + addr.sun_family = AF_LOCAL; + strcpy (addr.sun_path, monitor.string ().c_str ()); // Size check in ctor - auto_fd sock (socket (AF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC, 0)); + auto_fd sock (socket (AF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC, 0)); - if (sock.get () == -1) - throw_system_error (errno); + if (sock.get () == -1) + throw_system_error (errno); - if (connect (sock.get (), - reinterpret_cast<sockaddr*> (&addr), - sizeof (addr)) == -1) - throw_system_error (errno); + if (connect (sock.get (), + reinterpret_cast<sockaddr*> (&addr), + sizeof (addr)) == -1) + throw_system_error (errno); - // Read until we get something. - // - auto readsome = [&sock] () - { - ifdstream ifs (move (sock), - fdstream_mode::non_blocking, - ostream::badbit); - - char buf[256]; - for (streamsize n (0), m (0); - n == 0 || m != 0; - m = ifs.readsome (buf, sizeof (buf) - 1)) + // Read until we get something. + // + auto readsome = [&sock] () { - if (m != 0) + ifdstream ifs (move (sock), + fdstream_mode::non_blocking, + ostream::badbit); + + char buf[256]; + for (streamsize n (0), m (0); + n == 0 || m != 0; + m = ifs.readsome (buf, sizeof (buf) - 1)) { - n += m; + if (m != 0) + { + n += m; - //buf[m] = '\0'; - //text << buf; + //buf[m] = '\0'; + //text << buf; + } } - } - sock = ifs.release (); - }; + sock = ifs.release (); + }; - // Read QEMU welcome. - // - readsome (); + // Read QEMU welcome. + // + readsome (); - // Write our command. - // + // Write our command. + // + { + ofdstream ofs (move (sock), fdstream_mode::blocking); + ofs << c << endl; + sock = ofs.release (); + } + + // Read QEMU reply (may hit eof). + // + readsome (); + return; + } + catch (const system_error& e) { - ofdstream ofs (move (sock), fdstream_mode::blocking); - ofs << c << endl; - sock = ofs.release (); + diag_record dr; if (fh) dr << fail; else dr << error; + dr << "unable to communicate with qemu monitor: " << e; } - // Read QEMU reply (may hit eof). - // - readsome (); - } - catch (const system_error& e) - { - fail << "unable to communicate with qemu monitor: " << e; + throw failed (); } unique_ptr<machine> |