mock_nacl_gdb.cc revision 7d4cd473f85ac64c3747c96c277f9e506a0d2246
1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include <cstdio> 6#include <cstring> 7 8#include "base/command_line.h" 9#include "base/environment.h" 10#include "base/file_util.h" 11#include "base/logging.h" 12#include "base/memory/scoped_ptr.h" 13#include "base/process_util.h" 14 15static const char kEvalCommand[] = "--eval-command"; 16static const char kCommand[] = "--command"; 17static const char kNaClIrt[] = "nacl-irt \""; 18static const char kPass[] = "PASS"; 19static const char kAttach[] = "target remote :4014"; 20 21int main(int argc, char** argv) { 22 scoped_ptr<base::Environment> env(base::Environment::Create()); 23 std::string mock_nacl_gdb_file; 24 env->GetVar("MOCK_NACL_GDB", &mock_nacl_gdb_file); 25 CHECK_GE(argc, 5); 26 // First argument should be --eval-command. 27 CHECK_EQ(strcmp(argv[1], kEvalCommand), 0); 28 // Second argument should start with nacl-irt. 29 CHECK_GE(strlen(argv[2]), strlen(kNaClIrt)); 30 CHECK_EQ(strncmp(argv[2], kNaClIrt, strlen(kNaClIrt)), 0); 31 char* irt_file_name = strdup(&argv[2][strlen(kNaClIrt)]); 32 CHECK_GE(strlen(irt_file_name), 1u); 33 // Remove closing quote. 34 irt_file_name[strlen(irt_file_name) - 1] = 0; 35 FILE* irt_file = fopen(irt_file_name, "r"); 36 free(irt_file_name); 37 // nacl-irt parameter must be a file name. 38 PCHECK(irt_file); 39 fclose(irt_file); 40 CHECK_EQ(strcmp(argv[3], kEvalCommand), 0); 41 CHECK_EQ(strcmp(argv[4], kAttach), 0); 42 int i = 5; 43 // Skip additional --eval-command parameters. 44 while (i < argc) { 45 if (strcmp(argv[i], kEvalCommand) == 0) { 46 i += 2; 47 continue; 48 } 49 if (strcmp(argv[i], kCommand) == 0) { 50 // Command line shouldn't end with --command switch without value. 51 i += 2; 52 CHECK_LE(i, argc); 53 std::string nacl_gdb_script(argv[i - 1]); 54 file_util::WriteFile(base::FilePath::FromUTF8Unsafe(nacl_gdb_script), 55 kPass, strlen(kPass)); 56 continue; 57 } 58 // Unknown argument. 59 NOTREACHED() << "Invalid argument " << argv[i]; 60 } 61 CHECK_EQ(i, argc); 62 file_util::WriteFile(base::FilePath::FromUTF8Unsafe(mock_nacl_gdb_file), 63 kPass, strlen(kPass)); 64 return 0; 65} 66