/* * Win32ShellUtils.cpp * * Copyright (C) 2022 by Posit Software, PBC * * Unless you have received this program directly from Posit Software pursuant * to the terms of a commercial license agreement with Posit Software, then * this program is licensed to you under the terms of version 3 of the * GNU Affero General Public License. This program is distributed WITHOUT * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT, * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details. * */ #include #include namespace rstudio { namespace core { namespace shell_utils { std::string escape(const std::string& arg) { /* NOTE: This may be broken in cases where the arg contains special characters like %, ", etc. However, unlike with any sane shell, the Windows shell does not have a consistent way to escape out special characters. And what it does have is horribly under-documented. I thought it best to leave this simple to start and see if anything comes up from field testing. */ return "\"" + arg + "\""; } std::string escape(const core::FilePath& path) { return escape(string_utils::utf8ToSystem(path.getAbsolutePath())); } std::string join(const std::string& command1, const std::string& command2) { return "(" + command1 + ") & (" + command2 + ")"; } std::string join_and(const std::string& command1, const std::string& command2) { return "(" + command1 + ") && (" + command2 + ")"; } std::string join_or(const std::string& command1, const std::string& command2) { return "(" + command1 + ") || (" + command2 + ")"; } std::string sendStdErrToStdOut(const std::string& command) { return "(" + command + ") 2>&1"; } std::string sendAllOutputToNull(const std::string& command) { return "(" + command + ") >NUL 2>&1"; } std::string sendStdErrToNull(const std::string& command) { return "(" + command + ") 2> NUL"; } std::string sendNullToStdIn(const std::string& command) { return "(" + command + ") < NUL"; } namespace { FilePath s_devnull("NUL"); } // namespace const FilePath& devnull() { return s_devnull; } } } }