X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Ftools%2Fdcpomatic_disk_writer.cc;h=ef3bf2f776c86936b6ad443e26b3d717eca1d26b;hb=25eb7aa723af004162fc7f95995df250c4e4571b;hp=cfb610f0a14bd3e07b70ed82515d8ed9e92daac2;hpb=cdfe3bf9ed85f5fba872b8a307035a963b88bce1;p=dcpomatic.git diff --git a/src/tools/dcpomatic_disk_writer.cc b/src/tools/dcpomatic_disk_writer.cc index cfb610f0a..ef3bf2f77 100644 --- a/src/tools/dcpomatic_disk_writer.cc +++ b/src/tools/dcpomatic_disk_writer.cc @@ -177,28 +177,45 @@ try "com.dcpomatic.write-drive", [xml]() { bool const success = Drive(xml).unmount(); - if (!nanomsg->send(success ? (DISK_WRITER_OK "\n") : (DISK_WRITER_ERROR "\n"), LONG_TIMEOUT)) { + bool sent_reply = false; + if (success) { + sent_reply = nanomsg->send(DISK_WRITER_OK "\n", LONG_TIMEOUT); + } else { + sent_reply = nanomsg->send(DISK_WRITER_ERROR "\nCould not unmount drive\n1\n", LONG_TIMEOUT); + } + if (!sent_reply) { LOG_DISK_NC("CommunicationFailedError in unmount_finished"); throw CommunicationFailedError (); } }, []() { - if (!nanomsg->send(DISK_WRITER_ERROR "\n", LONG_TIMEOUT)) { + if (!nanomsg->send(DISK_WRITER_ERROR "\nCould not get permission to unmount drive\n1\n", LONG_TIMEOUT)) { LOG_DISK_NC("CommunicationFailedError in unmount_finished"); throw CommunicationFailedError (); } }); } else if (*s == DISK_WRITER_WRITE) { - auto dcp_path_opt = nanomsg->receive (LONG_TIMEOUT); auto device_opt = nanomsg->receive (LONG_TIMEOUT); - if (!dcp_path_opt || !device_opt) { + if (!device_opt) { LOG_DISK_NC("Failed to receive write request"); throw CommunicationFailedError(); } - - auto dcp_path = *dcp_path_opt; auto device = *device_opt; + vector dcp_paths; + while (true) { + auto dcp_path_opt = nanomsg->receive (LONG_TIMEOUT); + if (!dcp_path_opt) { + LOG_DISK_NC("Failed to receive write request"); + throw CommunicationFailedError(); + } + if (*dcp_path_opt != "") { + dcp_paths.push_back(*dcp_path_opt); + } else { + break; + } + } + /* Do some basic sanity checks; this is a bit belt-and-braces but it can't hurt... */ #ifdef DCPOMATIC_OSX @@ -243,11 +260,14 @@ try return true; } - LOG_DISK ("Here we go writing %1 to %2", dcp_path, device); + LOG_DISK("Here we go writing these to %1", device); + for (auto dcp: dcp_paths) { + LOG_DISK(" %1", dcp); + } request_privileges ( "com.dcpomatic.write-drive", - [dcp_path, device]() { + [dcp_paths, device]() { #if defined(DCPOMATIC_LINUX) auto posix_partition = device; /* XXX: don't know if this logic is sensible */ @@ -256,17 +276,17 @@ try } else { posix_partition += "1"; } - dcpomatic::write (dcp_path, device, posix_partition, nanomsg); + dcpomatic::write (dcp_paths, device, posix_partition, nanomsg); #elif defined(DCPOMATIC_OSX) auto fast_device = boost::algorithm::replace_first_copy (device, "/dev/disk", "/dev/rdisk"); - dcpomatic::write (dcp_path, fast_device, fast_device + "s1", nanomsg); + dcpomatic::write (dcp_paths, fast_device, fast_device + "s1", nanomsg); #elif defined(DCPOMATIC_WINDOWS) - dcpomatic::write (dcp_path, device, "", nanomsg); + dcpomatic::write (dcp_paths, device, "", nanomsg); #endif }, []() { if (nanomsg) { - nanomsg->send(DISK_WRITER_ERROR "\nCould not obtain authorization to write to the drive\n", LONG_TIMEOUT); + nanomsg->send(DISK_WRITER_ERROR "\nCould not obtain authorization to write to the drive\n1\n", LONG_TIMEOUT); } }); }