Chromium Code Reviews| OLD | NEW | 
|---|---|
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium 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 <sys/types.h> | 5 #include <sys/types.h> | 
| 6 #include <sys/stat.h> | 6 #include <sys/stat.h> | 
| 7 #include <errno.h> | 7 #include <errno.h> | 
| 8 #include <fcntl.h> | |
| 8 #include <unistd.h> | 9 #include <unistd.h> | 
| 9 #include <set> | 10 #include <set> | 
| 10 #include <string> | 11 #include <string> | 
| 12 #include <vector> | |
| 11 #include <gflags/gflags.h> | 13 #include <gflags/gflags.h> | 
| 12 #include <glib.h> | 14 #include <glib.h> | 
| 13 #include "base/command_line.h" | 15 #include "base/command_line.h" | 
| 14 #include "chromeos/obsolete_logging.h" | 16 #include "chromeos/obsolete_logging.h" | 
| 15 #include "update_engine/delta_diff_generator.h" | 17 #include "update_engine/delta_diff_generator.h" | 
| 18 #include "update_engine/delta_performer.h" | |
| 16 #include "update_engine/subprocess.h" | 19 #include "update_engine/subprocess.h" | 
| 17 #include "update_engine/update_metadata.pb.h" | 20 #include "update_engine/update_metadata.pb.h" | 
| 18 #include "update_engine/utils.h" | 21 #include "update_engine/utils.h" | 
| 19 | 22 | 
| 20 DEFINE_string(old_dir, "", | 23 DEFINE_string(old_dir, "", | 
| 21 "Directory where the old rootfs is loop mounted read-only"); | 24 "Directory where the old rootfs is loop mounted read-only"); | 
| 22 DEFINE_string(new_dir, "", | 25 DEFINE_string(new_dir, "", | 
| 23 "Directory where the new rootfs is loop mounted read-only"); | 26 "Directory where the new rootfs is loop mounted read-only"); | 
| 24 DEFINE_string(old_image, "", "Path to the old rootfs"); | 27 DEFINE_string(old_image, "", "Path to the old rootfs"); | 
| 25 DEFINE_string(new_image, "", "Path to the new rootfs"); | 28 DEFINE_string(new_image, "", "Path to the new rootfs"); | 
| 26 DEFINE_string(out_file, "", "Path to output file"); | 29 DEFINE_string(out_file, "", "Path to output file"); | 
| 30 DEFINE_string(apply_delta, "", | |
| 31 "If set, apply delta over old_image. (For debugging.)"); | |
| 27 | 32 | 
| 28 // This file contains a simple program that takes an old path, a new path, | 33 // This file contains a simple program that takes an old path, a new path, | 
| 29 // and an output file as arguments and the path to an output file and | 34 // and an output file as arguments and the path to an output file and | 
| 30 // generates a delta that can be sent to Chrome OS clients. | 35 // generates a delta that can be sent to Chrome OS clients. | 
| 31 | 36 | 
| 32 using std::set; | 37 using std::set; | 
| 33 using std::string; | 38 using std::string; | 
| 39 using std::vector; | |
| 34 | 40 | 
| 35 namespace chromeos_update_engine { | 41 namespace chromeos_update_engine { | 
| 36 | 42 | 
| 37 namespace { | 43 namespace { | 
| 38 | 44 | 
| 39 bool IsDir(const char* path) { | 45 bool IsDir(const char* path) { | 
| 40 struct stat stbuf; | 46 struct stat stbuf; | 
| 41 TEST_AND_RETURN_FALSE_ERRNO(lstat(path, &stbuf) == 0); | 47 TEST_AND_RETURN_FALSE_ERRNO(lstat(path, &stbuf) == 0); | 
| 42 return S_ISDIR(stbuf.st_mode); | 48 return S_ISDIR(stbuf.st_mode); | 
| 43 } | 49 } | 
| 44 | 50 | 
| 45 int Main(int argc, char** argv) { | 51 int Main(int argc, char** argv) { | 
| 46 g_thread_init(NULL); | 52 g_thread_init(NULL); | 
| 47 google::ParseCommandLineFlags(&argc, &argv, true); | 53 google::ParseCommandLineFlags(&argc, &argv, true); | 
| 48 CommandLine::Init(argc, argv); | 54 CommandLine::Init(argc, argv); | 
| 49 Subprocess::Init(); | 55 Subprocess::Init(); | 
| 50 logging::InitLogging("delta_generator.log", | 56 logging::InitLogging("delta_generator.log", | 
| 51 logging::LOG_ONLY_TO_SYSTEM_DEBUG_LOG, | 57 logging::LOG_ONLY_TO_SYSTEM_DEBUG_LOG, | 
| 52 logging::DONT_LOCK_LOG_FILE, | 58 logging::DONT_LOCK_LOG_FILE, | 
| 53 logging::APPEND_TO_OLD_LOG_FILE); | 59 logging::APPEND_TO_OLD_LOG_FILE); | 
| 60 if (!FLAGS_apply_delta.empty()) { | |
| 61 if (FLAGS_old_image.empty()) { | |
| 62 LOG(FATAL) << "Must pass --old_image with --apply_delta."; | |
| 63 } | |
| 64 DeltaPerformer performer; | |
| 65 CHECK_EQ(0, performer.Open(FLAGS_old_image.c_str(), 0, 0)); | |
| 
 
Daniel Erat
2010/04/23 17:47:25
mind using the more-natural-to-read CHECK_EQ(actua
 
adlr
2010/04/23 20:50:17
Done.
 
 | |
| 66 vector<char> buf(1024 * 1024); | |
| 67 int fd = open(FLAGS_apply_delta.c_str(), O_RDONLY, 0); | |
| 68 CHECK_GE(fd, 0); | |
| 69 ScopedFdCloser fd_closer(&fd); | |
| 70 for (off_t offset = 0;; offset += buf.size()) { | |
| 71 ssize_t bytes_read; | |
| 72 CHECK(utils::PReadAll(fd, &buf[0], buf.size(), offset, &bytes_read)); | |
| 73 if (bytes_read == 0) | |
| 74 break; | |
| 75 CHECK_EQ(bytes_read, performer.Write(&buf[0], bytes_read)); | |
| 76 } | |
| 77 CHECK_EQ(0, performer.Close()); | |
| 78 LOG(INFO) << "done applying delta."; | |
| 79 return 0; | |
| 80 } | |
| 54 if (FLAGS_old_dir.empty() || FLAGS_new_dir.empty() || | 81 if (FLAGS_old_dir.empty() || FLAGS_new_dir.empty() || | 
| 55 FLAGS_old_image.empty() || FLAGS_new_image.empty() || | 82 FLAGS_old_image.empty() || FLAGS_new_image.empty() || | 
| 56 FLAGS_out_file.empty()) { | 83 FLAGS_out_file.empty()) { | 
| 57 LOG(FATAL) << "Missing required argument(s)"; | 84 LOG(FATAL) << "Missing required argument(s)"; | 
| 58 } | 85 } | 
| 59 if ((!IsDir(FLAGS_old_dir.c_str())) || (!IsDir(FLAGS_new_dir.c_str()))) { | 86 if ((!IsDir(FLAGS_old_dir.c_str())) || (!IsDir(FLAGS_new_dir.c_str()))) { | 
| 60 LOG(FATAL) << "old_dir or new_dir not directory"; | 87 LOG(FATAL) << "old_dir or new_dir not directory"; | 
| 61 } | 88 } | 
| 62 | 89 | 
| 63 DeltaDiffGenerator::GenerateDeltaUpdateFile(FLAGS_old_dir, | 90 DeltaDiffGenerator::GenerateDeltaUpdateFile(FLAGS_old_dir, | 
| 64 FLAGS_old_image, | 91 FLAGS_old_image, | 
| 65 FLAGS_new_dir, | 92 FLAGS_new_dir, | 
| 66 FLAGS_new_image, | 93 FLAGS_new_image, | 
| 67 FLAGS_out_file); | 94 FLAGS_out_file); | 
| 68 | 95 | 
| 69 return 0; | 96 return 0; | 
| 70 } | 97 } | 
| 71 | 98 | 
| 72 } // namespace {} | 99 } // namespace {} | 
| 73 | 100 | 
| 74 } // namespace chromeos_update_engine | 101 } // namespace chromeos_update_engine | 
| 75 | 102 | 
| 76 int main(int argc, char** argv) { | 103 int main(int argc, char** argv) { | 
| 77 return chromeos_update_engine::Main(argc, argv); | 104 return chromeos_update_engine::Main(argc, argv); | 
| 78 } | 105 } | 
| OLD | NEW |