| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium 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 #ifndef CHROMEOS_PLATFORM_UPDATE_ENGINE_FILESYSTEM_COPIER_ACTION_H__ | 5 #ifndef CHROMEOS_PLATFORM_UPDATE_ENGINE_FILESYSTEM_COPIER_ACTION_H__ |
| 6 #define CHROMEOS_PLATFORM_UPDATE_ENGINE_FILESYSTEM_COPIER_ACTION_H__ | 6 #define CHROMEOS_PLATFORM_UPDATE_ENGINE_FILESYSTEM_COPIER_ACTION_H__ |
| 7 | 7 |
| 8 #include <sys/stat.h> | 8 #include <sys/stat.h> |
| 9 #include <sys/types.h> | 9 #include <sys/types.h> |
| 10 |
| 10 #include <string> | 11 #include <string> |
| 11 #include <vector> | 12 #include <vector> |
| 13 |
| 12 #include <gio/gio.h> | 14 #include <gio/gio.h> |
| 13 #include <glib.h> | 15 #include <glib.h> |
| 16 #include <gtest/gtest_prod.h> // for FRIEND_TEST |
| 17 |
| 14 #include "update_engine/action.h" | 18 #include "update_engine/action.h" |
| 15 #include "update_engine/install_plan.h" | 19 #include "update_engine/install_plan.h" |
| 20 #include "update_engine/omaha_hash_calculator.h" |
| 16 | 21 |
| 17 // This action will only do real work if it's a delta update. It will | 22 // This action will only do real work if it's a delta update. It will |
| 18 // copy the root partition to install partition, and then terminate. | 23 // copy the root partition to install partition, and then terminate. |
| 19 | 24 |
| 20 namespace chromeos_update_engine { | 25 namespace chromeos_update_engine { |
| 21 | 26 |
| 22 class FilesystemCopierAction; | 27 class FilesystemCopierAction; |
| 23 | 28 |
| 24 template<> | 29 template<> |
| 25 class ActionTraits<FilesystemCopierAction> { | 30 class ActionTraits<FilesystemCopierAction> { |
| 26 public: | 31 public: |
| 27 // Takes the install plan as input | 32 // Takes the install plan as input |
| 28 typedef InstallPlan InputObjectType; | 33 typedef InstallPlan InputObjectType; |
| 29 // Passes the install plan as output | 34 // Passes the install plan as output |
| 30 typedef InstallPlan OutputObjectType; | 35 typedef InstallPlan OutputObjectType; |
| 31 }; | 36 }; |
| 32 | 37 |
| 33 class FilesystemCopierAction : public Action<FilesystemCopierAction> { | 38 class FilesystemCopierAction : public Action<FilesystemCopierAction> { |
| 34 public: | 39 public: |
| 35 explicit FilesystemCopierAction(bool copying_kernel_install_path) | 40 explicit FilesystemCopierAction(bool copying_kernel_install_path) |
| 36 : copying_kernel_install_path_(copying_kernel_install_path), | 41 : copying_kernel_install_path_(copying_kernel_install_path), |
| 37 src_stream_(NULL), | 42 src_stream_(NULL), |
| 38 dst_stream_(NULL), | 43 dst_stream_(NULL), |
| 39 canceller_(NULL), | 44 canceller_(NULL), |
| 40 read_in_flight_(false), | 45 read_in_flight_(false), |
| 41 buffer_valid_size_(0) {} | 46 buffer_valid_size_(0), |
| 47 filesystem_size_(kint64max) {} |
| 42 typedef ActionTraits<FilesystemCopierAction>::InputObjectType | 48 typedef ActionTraits<FilesystemCopierAction>::InputObjectType |
| 43 InputObjectType; | 49 InputObjectType; |
| 44 typedef ActionTraits<FilesystemCopierAction>::OutputObjectType | 50 typedef ActionTraits<FilesystemCopierAction>::OutputObjectType |
| 45 OutputObjectType; | 51 OutputObjectType; |
| 46 void PerformAction(); | 52 void PerformAction(); |
| 47 void TerminateProcessing(); | 53 void TerminateProcessing(); |
| 48 | 54 |
| 49 // Used for testing, so we can copy from somewhere other than root | 55 // Used for testing, so we can copy from somewhere other than root |
| 50 void set_copy_source(const std::string& path) { | 56 void set_copy_source(const std::string& path) { |
| 51 copy_source_ = path; | 57 copy_source_ = path; |
| 52 } | 58 } |
| 53 | 59 |
| 54 // Debugging/logging | 60 // Debugging/logging |
| 55 static std::string StaticType() { return "FilesystemCopierAction"; } | 61 static std::string StaticType() { return "FilesystemCopierAction"; } |
| 56 std::string Type() const { return StaticType(); } | 62 std::string Type() const { return StaticType(); } |
| 57 | 63 |
| 58 private: | 64 private: |
| 65 friend class FilesystemCopierActionTest; |
| 66 FRIEND_TEST(FilesystemCopierActionTest, RunAsRootDetermineFilesystemSizeTest); |
| 67 |
| 59 // Callback from glib when the copy operation is done. | 68 // Callback from glib when the copy operation is done. |
| 60 void AsyncReadyCallback(GObject *source_object, GAsyncResult *res); | 69 void AsyncReadyCallback(GObject *source_object, GAsyncResult *res); |
| 61 static void StaticAsyncReadyCallback(GObject *source_object, | 70 static void StaticAsyncReadyCallback(GObject *source_object, |
| 62 GAsyncResult *res, | 71 GAsyncResult *res, |
| 63 gpointer user_data) { | 72 gpointer user_data) { |
| 64 reinterpret_cast<FilesystemCopierAction*>(user_data)->AsyncReadyCallback( | 73 reinterpret_cast<FilesystemCopierAction*>(user_data)->AsyncReadyCallback( |
| 65 source_object, res); | 74 source_object, res); |
| 66 } | 75 } |
| 67 | 76 |
| 68 // Cleans up all the variables we use for async operations and tells | 77 // Cleans up all the variables we use for async operations and tells |
| 69 // the ActionProcessor we're done w/ success as passed in. | 78 // the ActionProcessor we're done w/ success as passed in. |
| 70 // was_cancelled should be true if TerminateProcessing() was called. | 79 // was_cancelled should be true if TerminateProcessing() was called. |
| 71 void Cleanup(bool success, bool was_cancelled); | 80 void Cleanup(bool success, bool was_cancelled); |
| 72 | 81 |
| 82 // Determine, if possible, the source file system size to avoid copying the |
| 83 // whole partition. Currently this supports only the root file system assuming |
| 84 // it's ext3-compatible. |
| 85 void DetermineFilesystemSize(int fd); |
| 86 |
| 87 // Returns the number of bytes to read based on the size of the buffer and the |
| 88 // filesystem size. |
| 89 int64_t GetBytesToRead(); |
| 90 |
| 73 // If true, this action is copying to the kernel_install_path from | 91 // If true, this action is copying to the kernel_install_path from |
| 74 // the install plan, otherwise it's copying just to the install_path. | 92 // the install plan, otherwise it's copying just to the install_path. |
| 75 const bool copying_kernel_install_path_; | 93 const bool copying_kernel_install_path_; |
| 76 | 94 |
| 77 // The path to copy from. If empty (the default), the source is from the | 95 // The path to copy from. If empty (the default), the source is from the |
| 78 // passed in InstallPlan. | 96 // passed in InstallPlan. |
| 79 std::string copy_source_; | 97 std::string copy_source_; |
| 80 | 98 |
| 81 // If non-NULL, these are GUnixInputStream objects for the opened | 99 // If non-NULL, these are GUnixInputStream objects for the opened |
| 82 // source/destination partitions. | 100 // source/destination partitions. |
| 83 GInputStream* src_stream_; | 101 GInputStream* src_stream_; |
| 84 GOutputStream* dst_stream_; | 102 GOutputStream* dst_stream_; |
| 85 | 103 |
| 86 // If non-NULL, the cancellable object for the in-flight async call. | 104 // If non-NULL, the cancellable object for the in-flight async call. |
| 87 GCancellable* canceller_; | 105 GCancellable* canceller_; |
| 88 | 106 |
| 89 // True if we're waiting on a read to complete; false if we're | 107 // True if we're waiting on a read to complete; false if we're |
| 90 // waiting on a write. | 108 // waiting on a write. |
| 91 bool read_in_flight_; | 109 bool read_in_flight_; |
| 92 | 110 |
| 93 // The buffer for storing data we read/write. | 111 // The buffer for storing data we read/write. |
| 94 std::vector<char> buffer_; | 112 std::vector<char> buffer_; |
| 95 | 113 |
| 96 // Number of valid elements in buffer_. | 114 // Number of valid elements in buffer_. |
| 97 std::vector<char>::size_type buffer_valid_size_; | 115 std::vector<char>::size_type buffer_valid_size_; |
| 98 | 116 |
| 99 // The install plan we're passed in via the input pipe. | 117 // The install plan we're passed in via the input pipe. |
| 100 InstallPlan install_plan_; | 118 InstallPlan install_plan_; |
| 101 | 119 |
| 120 // Calculates the hash of the copied data. |
| 121 OmahaHashCalculator hasher_; |
| 122 |
| 123 // Copies and hashes this many bytes from the head of the input stream. This |
| 124 // field is initialized when the action is started and decremented as more |
| 125 // bytes get copied. |
| 126 int64_t filesystem_size_; |
| 127 |
| 102 DISALLOW_COPY_AND_ASSIGN(FilesystemCopierAction); | 128 DISALLOW_COPY_AND_ASSIGN(FilesystemCopierAction); |
| 103 }; | 129 }; |
| 104 | 130 |
| 105 } // namespace chromeos_update_engine | 131 } // namespace chromeos_update_engine |
| 106 | 132 |
| 107 #endif // CHROMEOS_PLATFORM_UPDATE_ENGINE_FILESYSTEM_COPIER_ACTION_H__ | 133 #endif // CHROMEOS_PLATFORM_UPDATE_ENGINE_FILESYSTEM_COPIER_ACTION_H__ |
| OLD | NEW |