summaryrefslogtreecommitdiffstats
path: root/src/ninja.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/ninja.cc')
-rw-r--r--src/ninja.cc19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/ninja.cc b/src/ninja.cc
index bb3abe1..58c1c80 100644
--- a/src/ninja.cc
+++ b/src/ninja.cc
@@ -495,9 +495,13 @@ void EncodeJSONString(const char *str) {
int ToolCompilationDatabase(Globals* globals, int argc, char* argv[]) {
bool first = true;
- char cwd[PATH_MAX];
+ vector<char> cwd;
- if (!getcwd(cwd, PATH_MAX)) {
+ do {
+ cwd.resize(cwd.size() + 1024);
+ errno = 0;
+ } while (!getcwd(&cwd[0], cwd.size()) && errno == ERANGE);
+ if (errno != 0 && errno != ERANGE) {
Error("cannot determine working directory: %s", strerror(errno));
return 1;
}
@@ -511,7 +515,7 @@ int ToolCompilationDatabase(Globals* globals, int argc, char* argv[]) {
putchar(',');
printf("\n {\n \"directory\": \"");
- EncodeJSONString(cwd);
+ EncodeJSONString(&cwd[0]);
printf("\",\n \"command\": \"");
EncodeJSONString((*e)->EvaluateCommand().c_str());
printf("\",\n \"file\": \"");
@@ -807,9 +811,14 @@ int NinjaMain(int argc, char** argv) {
case 'f':
input_file = optarg;
break;
- case 'j':
- config.parallelism = atoi(optarg);
+ case 'j': {
+ char* end;
+ int value = strtol(optarg, &end, 10);
+ if (*end != 0 || value <= 0)
+ Fatal("invalid -j parameter");
+ config.parallelism = value;
break;
+ }
case 'k': {
char* end;
int value = strtol(optarg, &end, 10);