| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
- file Copyright.txt or https://cmake.org/licensing for details. */
- #pragma once
- #include "cmConfigure.h" // IWYU pragma: keep
- #include <array>
- #include <cstddef> // IWYU pragma: keep
- #include <cstdint>
- #include <cstdio>
- #include <memory>
- #include <string>
- #include <utility>
- #include <vector>
- #include <cm3p/uv.h>
- class cmUVProcessChain;
- class cmUVProcessChainBuilder
- {
- public:
- enum Stream
- {
- Stream_INPUT = 0,
- Stream_OUTPUT = 1,
- Stream_ERROR = 2,
- };
- cmUVProcessChainBuilder();
- cmUVProcessChainBuilder& AddCommand(
- const std::vector<std::string>& arguments);
- cmUVProcessChainBuilder& SetBuiltinLoop();
- cmUVProcessChainBuilder& SetExternalLoop(uv_loop_t& loop);
- cmUVProcessChainBuilder& SetNoStream(Stream stdio);
- cmUVProcessChainBuilder& SetBuiltinStream(Stream stdio);
- cmUVProcessChainBuilder& SetMergedBuiltinStreams();
- cmUVProcessChainBuilder& SetExternalStream(Stream stdio, int fd);
- cmUVProcessChainBuilder& SetExternalStream(Stream stdio, FILE* stream);
- cmUVProcessChainBuilder& SetWorkingDirectory(std::string dir);
- uv_loop_t* GetLoop() const;
- cmUVProcessChain Start() const;
- private:
- enum StdioType
- {
- None,
- Builtin,
- External,
- };
- friend class cmUVProcessChain;
- struct StdioConfiguration
- {
- StdioType Type = None;
- int FileDescriptor = -1;
- };
- struct ProcessConfiguration
- {
- std::vector<std::string> Arguments;
- };
- std::array<StdioConfiguration, 3> Stdio;
- std::vector<ProcessConfiguration> Processes;
- std::string WorkingDirectory;
- bool MergedBuiltinStreams = false;
- uv_loop_t* Loop = nullptr;
- };
- class cmUVProcessChain
- {
- public:
- enum class ExceptionCode
- {
- None,
- Fault,
- Illegal,
- Interrupt,
- Numerical,
- Spawn,
- Other,
- };
- struct Status
- {
- int SpawnResult;
- bool Finished;
- int64_t ExitStatus;
- int TermSignal;
- std::pair<ExceptionCode, std::string> GetException() const;
- };
- cmUVProcessChain(const cmUVProcessChain& other) = delete;
- cmUVProcessChain(cmUVProcessChain&& other) noexcept;
- ~cmUVProcessChain();
- cmUVProcessChain& operator=(const cmUVProcessChain& other) = delete;
- cmUVProcessChain& operator=(cmUVProcessChain&& other) noexcept;
- uv_loop_t& GetLoop();
- // FIXME: Add stdin support
- int OutputStream();
- int ErrorStream();
- bool Valid() const;
- bool Wait(uint64_t milliseconds = 0);
- std::vector<const Status*> GetStatus() const;
- const Status& GetStatus(std::size_t index) const;
- bool Finished() const;
- private:
- friend class cmUVProcessChainBuilder;
- cmUVProcessChain();
- struct InternalData;
- std::unique_ptr<InternalData> Data;
- };
|