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