summaryrefslogtreecommitdiff
path: root/chromium/net/tools/dump_cache/dump_cache.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/tools/dump_cache/dump_cache.cc')
-rw-r--r--chromium/net/tools/dump_cache/dump_cache.cc183
1 files changed, 183 insertions, 0 deletions
diff --git a/chromium/net/tools/dump_cache/dump_cache.cc b/chromium/net/tools/dump_cache/dump_cache.cc
new file mode 100644
index 00000000000..dd423b7a950
--- /dev/null
+++ b/chromium/net/tools/dump_cache/dump_cache.cc
@@ -0,0 +1,183 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This command-line program dumps the contents of a set of cache files, either
+// to stdout or to another set of cache files.
+
+#include <stdio.h>
+#include <string>
+
+#include "base/at_exit.h"
+#include "base/command_line.h"
+#include "base/strings/string16.h"
+#include "base/strings/string_util.h"
+#include "base/strings/stringprintf.h"
+#include "net/disk_cache/disk_format.h"
+#include "net/tools/dump_cache/dump_files.h"
+#include "net/tools/dump_cache/simple_cache_dumper.h"
+
+#if defined(OS_WIN)
+#include "base/process/launch.h"
+#include "base/win/scoped_handle.h"
+#include "net/tools/dump_cache/upgrade_win.h"
+#endif
+
+enum Errors {
+ GENERIC = -1,
+ ALL_GOOD = 0,
+ INVALID_ARGUMENT = 1,
+ FILE_ACCESS_ERROR,
+ UNKNOWN_VERSION,
+ TOOL_NOT_FOUND,
+};
+
+const char kUpgradeHelp[] =
+ "\nIn order to use the upgrade function, a version of this tool that\n"
+ "understands the file format of the files to upgrade is needed. For\n"
+ "instance, to upgrade files saved with file format 3.4 to version 5.2,\n"
+ "a version of this program that was compiled with version 3.4 has to be\n"
+ "located beside this executable, and named dump_cache_3.exe, and this\n"
+ "executable should be compiled with version 5.2 being the current one.";
+
+// Folders to read and write cache files.
+const char kInputPath[] = "input";
+const char kOutputPath[] = "output";
+
+// Dumps the file headers to stdout.
+const char kDumpHeaders[] = "dump-headers";
+
+// Dumps all entries to stdout.
+const char kDumpContents[] = "dump-contents";
+
+// Convert the cache to files.
+const char kDumpToFiles[] = "dump-to-files";
+
+// Upgrade an old version to the current one.
+const char kUpgrade[] = "upgrade";
+
+// Internal use:
+const char kSlave[] = "slave";
+const char kPipe[] = "pipe";
+
+int Help() {
+ printf("warning: input files are modified by this tool\n");
+ printf("dump_cache --input=path1 [--output=path2]\n");
+ printf("--dump-headers: display file headers\n");
+ printf("--dump-contents: display all entries\n");
+ printf("--upgrade: copy contents to the output path\n");
+ printf("--dump-to-files: write the contents of the cache to files\n");
+ return INVALID_ARGUMENT;
+}
+
+#if defined(OS_WIN)
+
+// Starts a new process, to generate the files.
+int LaunchSlave(CommandLine command_line,
+ const base::string16& pipe_number,
+ int version) {
+ bool do_upgrade = command_line.HasSwitch(kUpgrade);
+ bool do_convert_to_text = command_line.HasSwitch(kDumpToFiles);
+
+ if (do_upgrade) {
+ base::FilePath program(
+ base::StringPrintf(L"%ls%d", L"dump_cache", version));
+ command_line.SetProgram(program);
+ }
+
+ if (do_upgrade || do_convert_to_text)
+ command_line.AppendSwitch(kSlave);
+
+ command_line.AppendSwitchNative(kPipe, pipe_number);
+ if (!base::LaunchProcess(command_line, base::LaunchOptions(), NULL)) {
+ printf("Unable to launch the needed version of this tool: %ls\n",
+ command_line.GetProgram().value().c_str());
+ printf(kUpgradeHelp);
+ return TOOL_NOT_FOUND;
+ }
+ return ALL_GOOD;
+}
+
+#endif
+
+// -----------------------------------------------------------------------
+
+int main(int argc, const char* argv[]) {
+ // Setup an AtExitManager so Singleton objects will be destroyed.
+ base::AtExitManager at_exit_manager;
+
+ CommandLine::Init(argc, argv);
+
+ const CommandLine& command_line = *CommandLine::ForCurrentProcess();
+ base::FilePath input_path = command_line.GetSwitchValuePath(kInputPath);
+ if (input_path.empty())
+ return Help();
+
+ bool dump_to_files = command_line.HasSwitch(kDumpToFiles);
+ bool upgrade = command_line.HasSwitch(kUpgrade);
+
+ base::FilePath output_path = command_line.GetSwitchValuePath(kOutputPath);
+ if ((dump_to_files || upgrade) && output_path.empty())
+ return Help();
+
+ int version = GetMajorVersion(input_path);
+ if (!version)
+ return FILE_ACCESS_ERROR;
+
+ bool slave_required = upgrade;
+ if (version != disk_cache::kCurrentVersion >> 16) {
+ if (command_line.HasSwitch(kSlave)) {
+ printf("Unknown version\n");
+ return UNKNOWN_VERSION;
+ }
+ slave_required = true;
+ }
+
+#if defined(OS_WIN)
+ base::string16 pipe_number = command_line.GetSwitchValueNative(kPipe);
+ if (command_line.HasSwitch(kSlave) && slave_required)
+ return RunSlave(input_path, pipe_number);
+
+ base::win::ScopedHandle server;
+ if (slave_required) {
+ server.Set(CreateServer(&pipe_number));
+ if (!server.IsValid()) {
+ printf("Unable to create the server pipe\n");
+ return GENERIC;
+ }
+
+ int ret = LaunchSlave(command_line, pipe_number, version);
+ if (ret)
+ return ret;
+ }
+
+ if (upgrade)
+ return UpgradeCache(output_path, server);
+
+ if (slave_required) {
+ // Wait until the slave starts dumping data before we quit. Lazy "fix" for a
+ // console quirk.
+ Sleep(500);
+ return ALL_GOOD;
+ }
+#else // defined(OS_WIN)
+ if (slave_required) {
+ printf("Unsupported operation\n");
+ return INVALID_ARGUMENT;
+ }
+#endif
+
+ if (dump_to_files) {
+ net::SimpleCacheDumper dumper(input_path, output_path);
+ dumper.Run();
+ return ALL_GOOD;
+ }
+
+ if (command_line.HasSwitch(kDumpContents))
+ return DumpContents(input_path);
+
+ if (command_line.HasSwitch(kDumpHeaders))
+ return DumpHeaders(input_path);
+
+ return Help();
+}