X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FShell.h;h=0a58aa45da4c8a4ab4d3dfd4605f9838279ecae2;hb=1b6b202c47642fed52b59360c5c566c20e710e47;hp=f7009c04f747d37f962aa06d2c18097e151ba47c;hpb=5bebf3c9ea5276ce8a099bcce9a3dfa9c6727bb8;p=folly.git diff --git a/folly/Shell.h b/folly/Shell.h index f7009c04..0a58aa45 100644 --- a/folly/Shell.h +++ b/folly/Shell.h @@ -1,5 +1,5 @@ /* - * Copyright 2016 Facebook, Inc. + * Copyright 2017 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,25 +38,56 @@ namespace folly { */ std::string shellQuote(StringPiece argument); +namespace detail { +template +std::vector shellify( + StringPiece format, + Arguments&&... arguments) { + auto command = sformat( + format, + shellQuote(to(std::forward(arguments)))...); + return {"/bin/sh", "-c", command}; +} + +struct ShellCmdFormat { + StringPiece format; + template + std::vector operator()(Arguments&&... arguments) const { + return ::folly::detail::shellify( + format, std::forward(arguments)...); + } +}; + +} // namespace detail + +inline namespace literals { +inline namespace shell_literals { +constexpr detail::ShellCmdFormat operator"" _shellify( + char const* name, + std::size_t length) { + return {folly::StringPiece(name, length)}; +} +} // inline namespace shell_literals +} // inline namespace literals + /** * Create argument array for `Subprocess()` for a process running in a * shell. * * The shell to use is always going to be `/bin/sh`. * - * The format string should always be a string literal to protect against - * shell injections. Arguments will automatically be escaped with `'`. - * - * TODO(dominik): find a way to ensure statically determined format strings. + * This is deprecated in favour of the user-defined-literal `_shellify` + * from namespace `folly::shell_literals` because that requires that the format + * string is a compile-time constant which can be inspected during code reviews */ template +FOLLY_DEPRECATED( + "Use `\"command {} {} ...\"_shellify(argument1, argument2 ...)` from " + "namespace `folly::literals::shell_literals`") std::vector shellify( - const StringPiece format, + StringPiece format, Arguments&&... arguments) { - auto command = sformat( - format, - shellQuote(to(std::forward(arguments)))...); - return {"/bin/sh", "-c", command}; + return detail::shellify(format, std::forward(arguments)...); } } // folly