|  | // 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 "net/disk_cache/blockfile/disk_format.h" | 
|  | #include "net/tools/dump_cache/dump_files.h" | 
|  | #include "starboard/types.h" | 
|  |  | 
|  | enum Errors { | 
|  | GENERIC = -1, | 
|  | ALL_GOOD = 0, | 
|  | INVALID_ARGUMENT = 1, | 
|  | FILE_ACCESS_ERROR, | 
|  | UNKNOWN_VERSION, | 
|  | TOOL_NOT_FOUND, | 
|  | }; | 
|  |  | 
|  | // Dumps the file headers to stdout. | 
|  | const char kDumpHeaders[] = "dump-headers"; | 
|  |  | 
|  | // Dumps all entries to stdout. | 
|  | const char kDumpContents[] = "dump-contents"; | 
|  |  | 
|  | // Dumps the LRU lists(s). | 
|  | const char kDumpLists[] = "dump-lists"; | 
|  |  | 
|  | // Dumps the entry at the given address (see kDumpAt). | 
|  | const char kDumpEntry[] = "dump-entry"; | 
|  |  | 
|  | // The cache address to dump. | 
|  | const char kDumpAt[] = "at"; | 
|  |  | 
|  | // Dumps the allocation bitmap of a file (see kDumpFile). | 
|  | const char kDumpAllocation[] = "dump-allocation"; | 
|  |  | 
|  | // The file to look at. | 
|  | const char kDumpFile[] = "file"; | 
|  |  | 
|  | int Help() { | 
|  | printf("dump_cache path_to_files [options]\n"); | 
|  | printf("Dumps internal cache structures.\n"); | 
|  | printf("warning: input files may be modified by this tool\n\n"); | 
|  | printf("--dump-headers: show file headers\n"); | 
|  | printf("--dump-contents [-v] [--full-key] [--csv]: list all entries\n"); | 
|  | printf("--dump-lists: follow the LRU list(s)\n"); | 
|  | printf( | 
|  | "--dump-entry [-v] [--full-key] --at=0xf00: show the data stored at" | 
|  | " 0xf00\n"); | 
|  | printf( | 
|  | "--dump-allocation --file=data_0: show the allocation bitmap of" | 
|  | " data_0\n"); | 
|  | printf("--csv: dump in a comma-separated-values format\n"); | 
|  | printf( | 
|  | "--full-key: show up to 160 chars for the key. Use either -v or the" | 
|  | " key address for longer keys\n"); | 
|  | printf("-v: detailed output (verbose)\n"); | 
|  | return INVALID_ARGUMENT; | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | int main(int argc, const char* argv[]) { | 
|  | // Setup an AtExitManager so Singleton objects will be destroyed. | 
|  | base::AtExitManager at_exit_manager; | 
|  |  | 
|  | base::CommandLine::Init(argc, argv); | 
|  |  | 
|  | const base::CommandLine& command_line = | 
|  | *base::CommandLine::ForCurrentProcess(); | 
|  | base::CommandLine::StringVector args = command_line.GetArgs(); | 
|  | if (args.size() != 1) | 
|  | return Help(); | 
|  |  | 
|  | base::FilePath input_path(args[0]); | 
|  | if (input_path.empty()) | 
|  | return Help(); | 
|  |  | 
|  | int version = GetMajorVersion(input_path); | 
|  | if (version != 2) | 
|  | return FILE_ACCESS_ERROR; | 
|  |  | 
|  | if (command_line.HasSwitch(kDumpContents)) | 
|  | return DumpContents(input_path); | 
|  |  | 
|  | if (command_line.HasSwitch(kDumpLists)) | 
|  | return DumpLists(input_path); | 
|  |  | 
|  | if (command_line.HasSwitch(kDumpEntry) && command_line.HasSwitch(kDumpAt)) | 
|  | return DumpEntryAt(input_path, command_line.GetSwitchValueASCII(kDumpAt)); | 
|  |  | 
|  | if (command_line.HasSwitch(kDumpAllocation) && | 
|  | command_line.HasSwitch(kDumpFile)) { | 
|  | base::FilePath name = | 
|  | input_path.AppendASCII(command_line.GetSwitchValueASCII(kDumpFile)); | 
|  | return DumpAllocation(name); | 
|  | } | 
|  |  | 
|  | if (command_line.HasSwitch(kDumpHeaders)) | 
|  | return DumpHeaders(input_path); | 
|  |  | 
|  | return Help(); | 
|  | } |