| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "update_engine/delta_diff_generator.h" | 5 #include "update_engine/delta_diff_generator.h" |
| 6 | 6 |
| 7 #include <errno.h> | 7 #include <errno.h> |
| 8 #include <fcntl.h> | 8 #include <fcntl.h> |
| 9 #include <inttypes.h> | 9 #include <inttypes.h> |
| 10 #include <sys/stat.h> | 10 #include <sys/stat.h> |
| (...skipping 1203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1214 | 1214 |
| 1215 TEST_AND_RETURN_FALSE(BzipCompress(buf, &buf_compressed)); | 1215 TEST_AND_RETURN_FALSE(BzipCompress(buf, &buf_compressed)); |
| 1216 const bool compress = buf_compressed.size() < buf.size(); | 1216 const bool compress = buf_compressed.size() < buf.size(); |
| 1217 const vector<char>& use_buf = compress ? buf_compressed : buf; | 1217 const vector<char>& use_buf = compress ? buf_compressed : buf; |
| 1218 if (compress) { | 1218 if (compress) { |
| 1219 op->set_type(DeltaArchiveManifest_InstallOperation_Type_REPLACE_BZ); | 1219 op->set_type(DeltaArchiveManifest_InstallOperation_Type_REPLACE_BZ); |
| 1220 } else { | 1220 } else { |
| 1221 op->set_type(DeltaArchiveManifest_InstallOperation_Type_REPLACE); | 1221 op->set_type(DeltaArchiveManifest_InstallOperation_Type_REPLACE); |
| 1222 } | 1222 } |
| 1223 op->set_data_offset(*data_file_size); | 1223 op->set_data_offset(*data_file_size); |
| 1224 TEST_AND_RETURN_FALSE(utils::WriteAll(fd, &use_buf[0], use_buf.size())); |
| 1224 *data_file_size += use_buf.size(); | 1225 *data_file_size += use_buf.size(); |
| 1225 op->set_data_length(use_buf.size()); | 1226 op->set_data_length(use_buf.size()); |
| 1226 Extent* dst_extent = op->add_dst_extents(); | 1227 Extent* dst_extent = op->add_dst_extents(); |
| 1227 dst_extent->set_start_block(offset / kBlockSize); | 1228 dst_extent->set_start_block(offset / kBlockSize); |
| 1228 dst_extent->set_num_blocks(chunk_size / kBlockSize); | 1229 dst_extent->set_num_blocks(chunk_size / kBlockSize); |
| 1229 } | 1230 } |
| 1230 } | 1231 } |
| 1231 | 1232 |
| 1232 return true; | 1233 return true; |
| 1233 } | 1234 } |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1274 | 1275 |
| 1275 const string kTempFileTemplate("/tmp/CrAU_temp_data.XXXXXX"); | 1276 const string kTempFileTemplate("/tmp/CrAU_temp_data.XXXXXX"); |
| 1276 string temp_file_path; | 1277 string temp_file_path; |
| 1277 off_t data_file_size = 0; | 1278 off_t data_file_size = 0; |
| 1278 | 1279 |
| 1279 LOG(INFO) << "Reading files..."; | 1280 LOG(INFO) << "Reading files..."; |
| 1280 | 1281 |
| 1281 vector<DeltaArchiveManifest_InstallOperation> kernel_ops; | 1282 vector<DeltaArchiveManifest_InstallOperation> kernel_ops; |
| 1282 | 1283 |
| 1283 vector<Vertex::Index> final_order; | 1284 vector<Vertex::Index> final_order; |
| 1284 if (!old_image.empty()) { | 1285 { |
| 1285 // Delta update | |
| 1286 int fd; | 1286 int fd; |
| 1287 TEST_AND_RETURN_FALSE( | 1287 TEST_AND_RETURN_FALSE( |
| 1288 utils::MakeTempFile(kTempFileTemplate, &temp_file_path, &fd)); | 1288 utils::MakeTempFile(kTempFileTemplate, &temp_file_path, &fd)); |
| 1289 TEST_AND_RETURN_FALSE(fd >= 0); | 1289 TEST_AND_RETURN_FALSE(fd >= 0); |
| 1290 ScopedFdCloser fd_closer(&fd); | 1290 ScopedFdCloser fd_closer(&fd); |
| 1291 if (!old_image.empty()) { |
| 1292 // Delta update |
| 1291 | 1293 |
| 1292 TEST_AND_RETURN_FALSE(DeltaReadFiles(&graph, | 1294 TEST_AND_RETURN_FALSE(DeltaReadFiles(&graph, |
| 1293 &blocks, | 1295 &blocks, |
| 1294 old_root, | 1296 old_root, |
| 1295 new_root, | 1297 new_root, |
| 1296 fd, | 1298 fd, |
| 1297 &data_file_size)); | 1299 &data_file_size)); |
| 1298 LOG(INFO) << "done reading normal files"; | 1300 LOG(INFO) << "done reading normal files"; |
| 1299 CheckGraph(graph); | 1301 CheckGraph(graph); |
| 1300 | 1302 |
| 1301 graph.resize(graph.size() + 1); | 1303 graph.resize(graph.size() + 1); |
| 1302 TEST_AND_RETURN_FALSE(ReadUnwrittenBlocks(blocks, | 1304 TEST_AND_RETURN_FALSE(ReadUnwrittenBlocks(blocks, |
| 1305 fd, |
| 1306 &data_file_size, |
| 1307 new_image, |
| 1308 &graph.back())); |
| 1309 |
| 1310 // Read kernel partition |
| 1311 TEST_AND_RETURN_FALSE(DeltaCompressKernelPartition(old_kernel_part, |
| 1312 new_kernel_part, |
| 1313 &kernel_ops, |
| 1314 fd, |
| 1315 &data_file_size)); |
| 1316 |
| 1317 LOG(INFO) << "done reading kernel"; |
| 1318 CheckGraph(graph); |
| 1319 |
| 1320 LOG(INFO) << "Creating edges..."; |
| 1321 CreateEdges(&graph, blocks); |
| 1322 LOG(INFO) << "Done creating edges"; |
| 1323 CheckGraph(graph); |
| 1324 |
| 1325 TEST_AND_RETURN_FALSE(ConvertGraphToDag(&graph, |
| 1326 new_root, |
| 1303 fd, | 1327 fd, |
| 1304 &data_file_size, | 1328 &data_file_size, |
| 1305 new_image, | 1329 &final_order)); |
| 1306 &graph.back())); | 1330 } else { |
| 1307 | 1331 // Full update |
| 1308 // Read kernel partition | 1332 TEST_AND_RETURN_FALSE(ReadFullUpdateFromDisk(&graph, |
| 1309 TEST_AND_RETURN_FALSE(DeltaCompressKernelPartition(old_kernel_part, | 1333 new_kernel_part, |
| 1310 new_kernel_part, | 1334 new_image, |
| 1311 &kernel_ops, | 1335 fd, |
| 1312 fd, | 1336 &data_file_size, |
| 1313 &data_file_size)); | 1337 kFullUpdateChunkSize, |
| 1314 | 1338 &kernel_ops, |
| 1315 LOG(INFO) << "done reading kernel"; | 1339 &final_order)); |
| 1316 CheckGraph(graph); | 1340 } |
| 1317 | |
| 1318 LOG(INFO) << "Creating edges..."; | |
| 1319 CreateEdges(&graph, blocks); | |
| 1320 LOG(INFO) << "Done creating edges"; | |
| 1321 CheckGraph(graph); | |
| 1322 | |
| 1323 TEST_AND_RETURN_FALSE(ConvertGraphToDag(&graph, | |
| 1324 new_root, | |
| 1325 fd, | |
| 1326 &data_file_size, | |
| 1327 &final_order)); | |
| 1328 } else { | |
| 1329 // Full update | |
| 1330 int fd = 0; | |
| 1331 TEST_AND_RETURN_FALSE(ReadFullUpdateFromDisk(&graph, | |
| 1332 new_kernel_part, | |
| 1333 new_image, | |
| 1334 fd, | |
| 1335 &data_file_size, | |
| 1336 kFullUpdateChunkSize, | |
| 1337 &kernel_ops, | |
| 1338 &final_order)); | |
| 1339 } | 1341 } |
| 1340 | 1342 |
| 1341 // Convert to protobuf Manifest object | 1343 // Convert to protobuf Manifest object |
| 1342 DeltaArchiveManifest manifest; | 1344 DeltaArchiveManifest manifest; |
| 1343 CheckGraph(graph); | 1345 CheckGraph(graph); |
| 1344 InstallOperationsToManifest(graph, final_order, kernel_ops, &manifest); | 1346 InstallOperationsToManifest(graph, final_order, kernel_ops, &manifest); |
| 1345 | 1347 |
| 1346 CheckGraph(graph); | 1348 CheckGraph(graph); |
| 1347 manifest.set_block_size(kBlockSize); | 1349 manifest.set_block_size(kBlockSize); |
| 1348 | 1350 |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1475 LOG(INFO) << "Signing the update..."; | 1477 LOG(INFO) << "Signing the update..."; |
| 1476 vector<char> signature_blob; | 1478 vector<char> signature_blob; |
| 1477 TEST_AND_RETURN_FALSE(PayloadSigner::SignPayload(output_path, | 1479 TEST_AND_RETURN_FALSE(PayloadSigner::SignPayload(output_path, |
| 1478 private_key_path, | 1480 private_key_path, |
| 1479 &signature_blob)); | 1481 &signature_blob)); |
| 1480 TEST_AND_RETURN_FALSE(writer.Write(&signature_blob[0], | 1482 TEST_AND_RETURN_FALSE(writer.Write(&signature_blob[0], |
| 1481 signature_blob.size()) == | 1483 signature_blob.size()) == |
| 1482 static_cast<ssize_t>(signature_blob.size())); | 1484 static_cast<ssize_t>(signature_blob.size())); |
| 1483 } | 1485 } |
| 1484 | 1486 |
| 1487 LOG(INFO) << "final dump"; |
| 1488 graph_utils::DumpGraph(graph); |
| 1485 ReportPayloadUsage(graph, manifest); | 1489 ReportPayloadUsage(graph, manifest); |
| 1486 | 1490 |
| 1487 LOG(INFO) << "All done. Successfully created delta file."; | 1491 LOG(INFO) << "All done. Successfully created delta file."; |
| 1488 return true; | 1492 return true; |
| 1489 } | 1493 } |
| 1490 | 1494 |
| 1491 const char* const kBsdiffPath = "/usr/bin/bsdiff"; | 1495 const char* const kBsdiffPath = "/usr/bin/bsdiff"; |
| 1492 const char* const kBspatchPath = "/usr/bin/bspatch"; | 1496 const char* const kBspatchPath = "/usr/bin/bspatch"; |
| 1493 const char* const kDeltaMagic = "CrAU"; | 1497 const char* const kDeltaMagic = "CrAU"; |
| 1494 | 1498 |
| 1495 }; // namespace chromeos_update_engine | 1499 }; // namespace chromeos_update_engine |
| OLD | NEW |