From 8a9e518371df03b3f382e0fe869da83751fdda0b Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Wed, 10 Nov 2021 17:33:22 -0500 Subject: Interprocess communication via pipes (#2009) * #include an absolute path didn't work - because paths were taken to always be relative. * Use 'Process' to communicate with an command line tool. * Remove slang-win-stream * Tidy up windows ProcessUtil. * First version of BufferedReadStream. * Windows working IPC for steams. * Test proxy count option. * Split Process/ProcessUtil. Process is platform dependant. ProcessUtil are functions that are platform independent. * First implementation of Unix Process interface. * Unix process compiles on cygwin. * Fix typo in unix process. * Separate unix pipe stream error of invalid access, from pipe availability. * Fix in standard line extraction. * Make fd non blocking. * Fix issues with Windows Process streams. * Added UnixPipe. * Some fixes around UnixPipeStream. * Make a unix stream closed explicit. * Hack to debug linux process/stream. * Revert to old linux pipe handling. * Pass executable path for unit tests. Split out CommandLine into own source. * Small improvements in process/command line. * Check process behavior with crash. * Make stderr and stdout unbuffered for crash testing. * Only turn disable buffering in crash test. * Disable crash test on CI. * Fix crash on clang/linux. * Enable crash test. Remove _appendBuffer as can use StreamUtil functionality. --- source/core/slang-command-line.h | 60 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 source/core/slang-command-line.h (limited to 'source/core/slang-command-line.h') diff --git a/source/core/slang-command-line.h b/source/core/slang-command-line.h new file mode 100644 index 000000000..85ba1a331 --- /dev/null +++ b/source/core/slang-command-line.h @@ -0,0 +1,60 @@ +// slang-command-line.h +#ifndef SLANG_COMMAND_LINE_H +#define SLANG_COMMAND_LINE_H + +#include "slang-string.h" +#include "slang-list.h" + +namespace Slang { + +struct CommandLine +{ + enum class ExecutableType + { + Unknown, ///< The executable is not specified + Path, ///< The executable is set as a path (ie won't be searched for) + Filename, ///< The executable is set as a filename + }; + + /// Add args - assumed unescaped + void addArg(const String& in) { m_args.add(in); } + void addArgs(const String* args, Int argsCount) { for (Int i = 0; i < argsCount; ++i) addArg(args[i]); } + + /// Find the index of an arg which is exact match for slice + SLANG_INLINE Index findArgIndex(const UnownedStringSlice& slice) const { return m_args.indexOf(slice); } + + /// Set the executable path. + /// NOTE! On some targets the executable path *must* include an extension to be able to start as a process + void setExecutablePath(const String& path) { m_executableType = ExecutableType::Path; m_executable = path; } + + /// Set the executable path from a base directory and an executable name (no suffix such as '.exe' needed) + void setExecutable(const String& dir, const String& name); + + /// Set a filename (such that the path will be looked up + void setExecutableFilename(const String& filename) { m_executableType = ExecutableType::Filename; m_executable = filename; } + + /// For handling args where the switch is placed directly in front of the path + void addPrefixPathArg(const char* prefix, const String& path, const char* pathPostfix = nullptr); + + /// Get the total number of args + SLANG_FORCE_INLINE Index getArgCount() const { return m_args.getCount(); } + + /// Reset to the initial state + void reset() { *this = CommandLine(); } + + /// Append the command line to out + void append(StringBuilder& out) const; + /// convert into a string + String toString() const; + + /// Ctor + CommandLine():m_executableType(ExecutableType::Unknown) {} + + ExecutableType m_executableType; ///< How the executable is specified + String m_executable; ///< Executable to run. Note that the executable is never escaped. + List m_args; ///< The arguments (Stored *unescaped*) +}; + +} + +#endif // SLANG_COMMAND_LINE_H -- cgit v1.2.3