aboutsummaryrefslogtreecommitdiff
path: root/bbot/machine.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'bbot/machine.cxx')
-rw-r--r--bbot/machine.cxx145
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>