-static
-void
-count (boost::filesystem::path dir, uint64_t& total_bytes)
-{
- using namespace boost::filesystem;
- for (directory_iterator i = directory_iterator(dir); i != directory_iterator(); ++i) {
- if (is_directory(*i)) {
- count (*i, total_bytes);
- } else {
- total_bytes += file_size (*i);
- }
- }
-}
-
-static
-string
-write (boost::filesystem::path from, boost::filesystem::path to, uint64_t& total_remaining, uint64_t total)
-{
- ext4_file out;
- int r = ext4_fopen(&out, to.generic_string().c_str(), "wb");
- if (r != EOK) {
- throw CopyError (String::compose("Failed to open file %1", to.generic_string()), r);
- }
-
- FILE* in = fopen_boost (from, "rb");
- if (!in) {
- ext4_fclose (&out);
- throw CopyError (String::compose("Failed to open file %1", from.string()), 0);
- }
-
- uint8_t* buffer = new uint8_t[block_size];
- Digester digester;
-
- uint64_t remaining = file_size (from);
- while (remaining > 0) {
- uint64_t const this_time = min(remaining, block_size);
- size_t read = fread (buffer, 1, this_time, in);
- if (read != this_time) {
- fclose (in);
- ext4_fclose (&out);
- delete[] buffer;
- throw CopyError (String::compose("Short read; expected %1 but read %2", this_time, read), 0);
- }
-
- digester.add (buffer, this_time);
-
- size_t written;
- r = ext4_fwrite (&out, buffer, this_time, &written);
- if (r != EOK) {
- fclose (in);
- ext4_fclose (&out);
- delete[] buffer;
- throw CopyError ("Write failed", r);
- }
- if (written != this_time) {
- fclose (in);
- ext4_fclose (&out);
- delete[] buffer;
- throw CopyError (String::compose("Short write; expected %1 but wrote %2", this_time, written), 0);
- }
- remaining -= this_time;
- total_remaining -= this_time;
- nanomsg->send(String::compose(DISK_WRITER_PROGRESS "\n%1\n", (1 - float(total_remaining) / total)), SHORT_TIMEOUT);
- }
-
- fclose (in);
- ext4_fclose (&out);
- delete[] buffer;
-
- return digester.get ();
-}
-
-static
-string
-read (boost::filesystem::path from, boost::filesystem::path to, uint64_t& total_remaining, uint64_t total)
-{
- ext4_file in;
- LOG_DISK("Opening %1 for read", to.generic_string());
- int r = ext4_fopen(&in, to.generic_string().c_str(), "rb");
- if (r != EOK) {
- throw VerifyError (String::compose("Failed to open file %1", to.generic_string()), r);
- }
- LOG_DISK("Opened %1 for read", to.generic_string());
-
- uint8_t* buffer = new uint8_t[block_size];
- Digester digester;
-
- uint64_t remaining = file_size (from);
- while (remaining > 0) {
- uint64_t const this_time = min(remaining, block_size);
- size_t read;
- r = ext4_fread (&in, buffer, this_time, &read);
- if (read != this_time) {
- ext4_fclose (&in);
- delete[] buffer;
- throw VerifyError (String::compose("Short read; expected %1 but read %2", this_time, read), 0);
- }
-
- digester.add (buffer, this_time);
- remaining -= this_time;
- total_remaining -= this_time;
- nanomsg->send(String::compose(DISK_WRITER_PROGRESS "\n%1\n", (1 - float(total_remaining) / total)), SHORT_TIMEOUT);
- }
-
- ext4_fclose (&in);
- delete[] buffer;