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)#include <cstdio>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cstring>
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/environment.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kEvalCommand[] = "--eval-command";
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kCommand[] = "--command";
167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)static const char kNaClIrt[] = "nacl-irt \"";
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kPass[] = "PASS";
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)static const char kAttach[] = "target remote :4014";
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int main(int argc, char** argv) {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Environment> env(base::Environment::Create());
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string mock_nacl_gdb_file;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  env->GetVar("MOCK_NACL_GDB", &mock_nacl_gdb_file);
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CHECK_GE(argc, 5);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First argument should be --eval-command.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_EQ(strcmp(argv[1], kEvalCommand), 0);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Second argument should start with nacl-irt.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_GE(strlen(argv[2]), strlen(kNaClIrt));
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_EQ(strncmp(argv[2], kNaClIrt, strlen(kNaClIrt)), 0);
307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  char* irt_file_name = strdup(&argv[2][strlen(kNaClIrt)]);
317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CHECK_GE(strlen(irt_file_name), 1u);
327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Remove closing quote.
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  irt_file_name[strlen(irt_file_name) - 1] = 0;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FILE* irt_file = fopen(irt_file_name, "r");
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  free(irt_file_name);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // nacl-irt parameter must be a file name.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PCHECK(irt_file);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fclose(irt_file);
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CHECK_EQ(strcmp(argv[3], kEvalCommand), 0);
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CHECK_EQ(strcmp(argv[4], kAttach), 0);
417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int i = 5;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Skip additional --eval-command parameters.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (i < argc) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (strcmp(argv[i], kEvalCommand) == 0) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      i += 2;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (strcmp(argv[i], kCommand) == 0) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Command line shouldn't end with --command switch without value.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      i += 2;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CHECK_LE(i, argc);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string nacl_gdb_script(argv[i - 1]);
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      base::WriteFile(base::FilePath::FromUTF8Unsafe(nacl_gdb_script),
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      kPass, strlen(kPass));
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Unknown argument.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Invalid argument " << argv[i];
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CHECK_EQ(i, argc);
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::WriteFile(base::FilePath::FromUTF8Unsafe(mock_nacl_gdb_file),
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                  kPass, strlen(kPass));
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
65