| 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/download_action.h" | 5 #include "update_engine/download_action.h" |
| 6 #include <errno.h> | 6 #include <errno.h> |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 #include <glib.h> | 10 #include <glib.h> |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 58 rootfs_buffered_file_writer_.get())); | 58 rootfs_buffered_file_writer_.get())); |
| 59 split_file_writer_->SetFirstOpenArgs( | 59 split_file_writer_->SetFirstOpenArgs( |
| 60 install_plan_.kernel_install_path.c_str(), | 60 install_plan_.kernel_install_path.c_str(), |
| 61 O_WRONLY | O_CREAT | O_TRUNC | O_LARGEFILE, | 61 O_WRONLY | O_CREAT | O_TRUNC | O_LARGEFILE, |
| 62 0644); | 62 0644); |
| 63 decompressing_file_writer_.reset( | 63 decompressing_file_writer_.reset( |
| 64 new GzipDecompressingFileWriter(split_file_writer_.get())); | 64 new GzipDecompressingFileWriter(split_file_writer_.get())); |
| 65 writer_ = decompressing_file_writer_.get(); | 65 writer_ = decompressing_file_writer_.get(); |
| 66 } else { | 66 } else { |
| 67 delta_performer_.reset(new DeltaPerformer(prefs_)); | 67 delta_performer_.reset(new DeltaPerformer(prefs_)); |
| 68 delta_performer_->set_current_kernel_hash( | 68 delta_performer_->set_current_kernel_hash(install_plan_.kernel_hash); |
| 69 &install_plan_.current_kernel_hash); | 69 delta_performer_->set_current_rootfs_hash(install_plan_.rootfs_hash); |
| 70 delta_performer_->set_current_rootfs_hash( | |
| 71 &install_plan_.current_rootfs_hash); | |
| 72 writer_ = delta_performer_.get(); | 70 writer_ = delta_performer_.get(); |
| 73 } | 71 } |
| 74 } | 72 } |
| 75 int rc = writer_->Open(install_plan_.install_path.c_str(), | 73 int rc = writer_->Open(install_plan_.install_path.c_str(), |
| 76 O_TRUNC | O_WRONLY | O_CREAT | O_LARGEFILE, | 74 O_TRUNC | O_WRONLY | O_CREAT | O_LARGEFILE, |
| 77 0644); | 75 0644); |
| 78 if (rc < 0) { | 76 if (rc < 0) { |
| 79 LOG(ERROR) << "Unable to open output file " << install_plan_.install_path; | 77 LOG(ERROR) << "Unable to open output file " << install_plan_.install_path; |
| 80 // report error to processor | 78 // report error to processor |
| 81 processor_->ActionComplete(this, kActionCodeInstallDeviceOpenError); | 79 processor_->ActionComplete(this, kActionCodeInstallDeviceOpenError); |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 162 ActionExitCode code = | 160 ActionExitCode code = |
| 163 successful ? kActionCodeSuccess : kActionCodeDownloadTransferError; | 161 successful ? kActionCodeSuccess : kActionCodeDownloadTransferError; |
| 164 if (code == kActionCodeSuccess) { | 162 if (code == kActionCodeSuccess) { |
| 165 if (!install_plan_.is_full_update) { | 163 if (!install_plan_.is_full_update) { |
| 166 if (!delta_performer_->VerifyPayload("", | 164 if (!delta_performer_->VerifyPayload("", |
| 167 install_plan_.download_hash, | 165 install_plan_.download_hash, |
| 168 install_plan_.size)) { | 166 install_plan_.size)) { |
| 169 LOG(ERROR) << "Download of " << install_plan_.download_url | 167 LOG(ERROR) << "Download of " << install_plan_.download_url |
| 170 << " failed due to payload verification error."; | 168 << " failed due to payload verification error."; |
| 171 code = kActionCodeDownloadPayloadVerificationError; | 169 code = kActionCodeDownloadPayloadVerificationError; |
| 172 } else if (!delta_performer_->VerifyAppliedUpdate( | 170 } else if (!delta_performer_->GetNewPartitionInfo( |
| 173 install_plan_.install_path, install_plan_.kernel_install_path)) { | 171 &install_plan_.kernel_size, |
| 174 LOG(ERROR) << "Download of " << install_plan_.download_url | 172 &install_plan_.kernel_hash, |
| 175 << " failed due to applied update verification error."; | 173 &install_plan_.rootfs_size, |
| 176 code = kActionCodeDownloadAppliedUpdateVerificationError; | 174 &install_plan_.rootfs_hash)) { |
| 175 LOG(ERROR) << "Unable to get new partition hash info."; |
| 176 code = kActionCodeDownloadNewPartitionInfoError; |
| 177 } | 177 } |
| 178 } else { | 178 } else { |
| 179 // Makes sure the hash and size are correct for an old-style full update. | 179 // Makes sure the hash and size are correct for an old-style full update. |
| 180 omaha_hash_calculator_.Finalize(); | 180 omaha_hash_calculator_.Finalize(); |
| 181 if (omaha_hash_calculator_.hash() != install_plan_.download_hash) { | 181 if (omaha_hash_calculator_.hash() != install_plan_.download_hash) { |
| 182 LOG(ERROR) << "Download of " << install_plan_.download_url | 182 LOG(ERROR) << "Download of " << install_plan_.download_url |
| 183 << " failed. Expected hash " << install_plan_.download_hash | 183 << " failed. Expected hash " << install_plan_.download_hash |
| 184 << " but got hash " << omaha_hash_calculator_.hash(); | 184 << " but got hash " << omaha_hash_calculator_.hash(); |
| 185 code = kActionCodeDownloadHashMismatchError; | 185 code = kActionCodeDownloadHashMismatchError; |
| 186 } else if (bytes_received_ != install_plan_.size) { | 186 } else if (bytes_received_ != install_plan_.size) { |
| 187 LOG(ERROR) << "Download of " << install_plan_.download_url | 187 LOG(ERROR) << "Download of " << install_plan_.download_url |
| 188 << " failed. Expected size " << install_plan_.size | 188 << " failed. Expected size " << install_plan_.size |
| 189 << " but got size " << bytes_received_; | 189 << " but got size " << bytes_received_; |
| 190 code = kActionCodeDownloadSizeMismatchError; | 190 code = kActionCodeDownloadSizeMismatchError; |
| 191 } | 191 } |
| 192 } | 192 } |
| 193 } | 193 } |
| 194 | 194 |
| 195 FlushLinuxCaches(); | 195 FlushLinuxCaches(); |
| 196 | 196 |
| 197 // Write the path to the output pipe if we're successful. | 197 // Write the path to the output pipe if we're successful. |
| 198 if (code == kActionCodeSuccess && HasOutputPipe()) | 198 if (code == kActionCodeSuccess && HasOutputPipe()) |
| 199 SetOutputObject(GetInputObject()); | 199 SetOutputObject(install_plan_); |
| 200 processor_->ActionComplete(this, code); | 200 processor_->ActionComplete(this, code); |
| 201 } | 201 } |
| 202 | 202 |
| 203 void DownloadAction::TransferTerminated(HttpFetcher *fetcher) { | 203 void DownloadAction::TransferTerminated(HttpFetcher *fetcher) { |
| 204 if (code_ != kActionCodeSuccess) { | 204 if (code_ != kActionCodeSuccess) { |
| 205 processor_->ActionComplete(this, code_); | 205 processor_->ActionComplete(this, code_); |
| 206 } | 206 } |
| 207 } | 207 } |
| 208 | 208 |
| 209 }; // namespace {} | 209 }; // namespace {} |
| OLD | NEW |