bool Process::openDocument (const String& fileName, const String& parameters) { String cmdString (fileName.replace (" ", "\\ ",false)); cmdString << " " << parameters; if ( cmdString.startsWithIgnoreCase ("file:") || File::createFileWithoutCheckingPath (fileName).isDirectory() || ! isFileExecutable (fileName)) { // create a command that tries to launch a bunch of likely browsers const char* const browserNames[] = { "xdg-open", "/etc/alternatives/x-www-browser", "firefox", "mozilla", "google-chrome", "chromium-browser", "opera", "konqueror" }; StringArray cmdLines; for (int i = 0; i < numElementsInArray (browserNames); ++i) cmdLines.add (String (browserNames[i]) + " " + cmdString.trim().quoted()); cmdString = cmdLines.joinIntoString (" || "); } const char* const argv[4] = { "/bin/sh", "-c", cmdString.toUTF8(), 0 }; const int cpid = fork(); if (cpid == 0) { setsid(); // Child process execve (argv[0], (char**) argv, environ); exit (0); } return cpid >= 0; }
bool Process::openDocument (const String& fileName, const String& parameters) { String cmdString (fileName.replace (" ", "\\ ",false)); cmdString << " " << parameters; if (/*URL::isProbablyAWebsiteURL (fileName) ||*/ cmdString.startsWithIgnoreCase ("file:") /*|| URL::isProbablyAnEmailAddress (fileName)*/ || File::createFileWithoutCheckingPath (fileName).isDirectory() || ! isFileExecutable (fileName)) { // create a command that tries to launch a bunch of likely browsers static const char* const browserNames[] = { "xdg-open", "/etc/alternatives/x-www-browser", "firefox", "mozilla", "google-chrome", "chromium-browser", "opera", "konqueror" }; StringArray cmdLines; for (int i = 0; i < numElementsInArray (browserNames); ++i) cmdLines.add (String (browserNames[i]) + " " + cmdString.trim().quoted()); cmdString = cmdLines.joinIntoString (" || "); } const char* const argv[4] = { "/bin/sh", "-c", cmdString.toUTF8(), nullptr }; #if JUCE_USE_VFORK const int cpid = vfork(); #else const int cpid = fork(); #endif if (cpid == 0) { #if ! JUCE_USE_VFORK setsid(); #endif // Child process if (execvp (argv[0], (char**) argv) < 0) _exit (0); } return cpid >= 0; }
QString clangExecutable(const QString &fileNameOrPath, bool *isValid) { QString executable = fileNameOrPath; if (executable.isEmpty()) { *isValid = false; return executable; } if (!QFileInfo(executable).isAbsolute()) { const Utils::Environment &environment = Utils::Environment::systemEnvironment(); const QString executableFromPath = environment.searchInPath(executable).toString(); if (executableFromPath.isEmpty()) { *isValid = false; return executable; } executable = executableFromPath; } *isValid = isFileExecutable(executable) && isClangExecutableUsable(executable); return executable; }
QString clangExecutableFromSettings(Core::Id toolchainType, bool *isValid) { QString executable = ClangStaticAnalyzerSettings::instance()->clangExecutable(); if (executable.isEmpty()) { *isValid = false; return executable; } const QString hostExeSuffix = QLatin1String(QTC_HOST_EXE_SUFFIX); const Qt::CaseSensitivity caseSensitivity = Utils::HostOsInfo::fileNameCaseSensitivity(); const bool hasSuffix = executable.endsWith(hostExeSuffix, caseSensitivity); if (toolchainType == ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID) { if (hasSuffix) executable.chop(hostExeSuffix.length()); executable.append(QLatin1String("-cl")); if (hasSuffix) executable.append(hostExeSuffix); } const QFileInfo fileInfo = QFileInfo(executable); if (fileInfo.isAbsolute()) { if (!hasSuffix) executable.append(hostExeSuffix); } else { const Utils::Environment &environment = Utils::Environment::systemEnvironment(); const QString executableFromPath = environment.searchInPath(executable).toString(); if (executableFromPath.isEmpty()) { *isValid = false; return executable; } executable = executableFromPath; } *isValid = isFileExecutable(executable) && isClangExecutableUsable(executable); return executable; }