int main(int argc, char **argv) { LogLevel logLevel = LogLevel::Error; Path file; for (int i=1; i<argc; ++i) { if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--verbose")) { ++logLevel; } else { file = argv[i]; } } setenv("LIBCLANG_NOTHREADS", "1", 0); signal(SIGSEGV, sigHandler); signal(SIGABRT, sigHandler); signal(SIGBUS, sigHandler); Flags<LogMode> logType = LogStderr; std::shared_ptr<SyslogCloser> closer; if (ClangIndexer::serverOpts() & Server::RPLogToSyslog) { logType |= LogSyslog; closer.reset(new SyslogCloser); } initLogging(argv[0], logType, logLevel); (void)closer; RTags::initMessages(); std::shared_ptr<EventLoop> eventLoop(new EventLoop); eventLoop->init(EventLoop::MainEventLoop); String data; if (!file.isEmpty()) { data = file.readAll(); } else { uint32_t size; if (!fread(&size, sizeof(size), 1, stdin)) { error() << "Failed to read from stdin"; return 1; } data.resize(size); if (!fread(&data[0], size, 1, stdin)) { error() << "Failed to read from stdin"; return 2; } // FILE *f = fopen("/tmp/data", "w"); // fwrite(data.constData(), data.size(), 1, f); // fclose(f); } ClangIndexer indexer; if (!indexer.exec(data)) { error() << "ClangIndexer error"; return 3; } return 0; }
int main(int argc, char **argv) { setvbuf(stdout, NULL, _IONBF, 0); setvbuf(stderr, NULL, _IONBF, 0); LogLevel logLevel = LogLevel::Error; Path file; bool logToSyslog = false; bool daemon = false; for (int i=1; i<argc; ++i) { if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--verbose")) { ++logLevel; } else if (!strcmp(argv[i], "--priority")) { // ignore, only for wrapping purposes ++i; } else if (!strcmp(argv[i], "--log-to-syslog")) { logToSyslog = true; } else if (!strcmp(argv[i], "--daemon")) { daemon = true; } else { file = argv[i]; } } if (const char *env = getenv("TMPDIR")) { // should really always be set by rdm Path path = Path(env).ensureTrailingSlash(); path += String::number(getpid()); path.mkdir(Path::Recursive); setenv("TMPDIR", path.c_str(), 1); } if (!daemon) setenv("LIBCLANG_NOTHREADS", "1", 0); signal(SIGSEGV, sigHandler); signal(SIGABRT, sigHandler); signal(SIGBUS, sigHandler); signal(SIGALRM, [](int) { ClangIndexer::transition(ClangIndexer::Stopped); }); Flags<LogFlag> logFlags = LogStderr; std::shared_ptr<SyslogCloser> closer; if (logToSyslog & Server::RPLogToSyslog) { logFlags |= LogSyslog; closer.reset(new SyslogCloser); } initLogging(argv[0], logFlags, logLevel); (void)closer; RTags::initMessages(); auto eventLoop = std::make_shared<EventLoop>(); eventLoop->init(EventLoop::MainEventLoop); ClangIndexer indexer; while (true) { String data; if (!file.isEmpty()) { data = file.readAll(); } else { uint32_t size; if (!fread(&size, sizeof(size), 1, stdin)) { error() << "Failed to read from stdin"; return 1; } data.resize(size); if (!fread(&data[0], size, 1, stdin)) { error() << "Failed to read from stdin"; return 2; } // FILE *f = fopen("/tmp/data", "w"); // fwrite(data.constData(), data.size(), 1, f); // fclose(f); } if (!indexer.exec(data)) { error() << "ClangIndexer error"; return 3; } if (daemon) { if (ClangIndexer::state() == ClangIndexer::Running) { printf("@FINISHED@"); fflush(stdout); } ClangIndexer::transition(ClangIndexer::NotStarted); } else { break; } } return 0; }