15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This command-line program dumps the contents of a set of cache files, either 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to stdout or to another set of cache files. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/at_exit.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/disk_cache/blockfile/disk_format.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/tools/dump_cache/dump_files.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/tools/dump_cache/simple_cache_dumper.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum Errors { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GENERIC = -1, 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ALL_GOOD = 0, 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INVALID_ARGUMENT = 1, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_ACCESS_ERROR, 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UNKNOWN_VERSION, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TOOL_NOT_FOUND, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Folders to read and write cache files. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kInputPath[] = "input"; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kOutputPath[] = "output"; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Dumps the file headers to stdout. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDumpHeaders[] = "dump-headers"; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Dumps all entries to stdout. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDumpContents[] = "dump-contents"; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Convert the cache to files. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDumpToFiles[] = "dump-to-files"; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int Help() { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("warning: input files are modified by this tool\n"); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("dump_cache --input=path1 [--output=path2]\n"); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("--dump-headers: display file headers\n"); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("--dump-contents: display all entries\n"); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("--dump-to-files: write the contents of the cache to files\n"); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return INVALID_ARGUMENT; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------------------------------------------------- 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int main(int argc, const char* argv[]) { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setup an AtExitManager so Singleton objects will be destroyed. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AtExitManager at_exit_manager; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::CommandLine::Init(argc, argv); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const base::CommandLine& command_line = 6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) *base::CommandLine::ForCurrentProcess(); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath input_path = command_line.GetSwitchValuePath(kInputPath); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (input_path.empty()) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Help(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool dump_to_files = command_line.HasSwitch(kDumpToFiles); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath output_path = command_line.GetSwitchValuePath(kOutputPath); 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dump_to_files && output_path.empty()) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Help(); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int version = GetMajorVersion(input_path); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!version) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return FILE_ACCESS_ERROR; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (dump_to_files) { 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::SimpleCacheDumper dumper(input_path, output_path); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dumper.Run(); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ALL_GOOD; 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_line.HasSwitch(kDumpContents)) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return DumpContents(input_path); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_line.HasSwitch(kDumpHeaders)) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return DumpHeaders(input_path); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Help(); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 89