mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-17 16:10:49 +01:00
Dep/Misc: More deps
This commit is contained in:
31
dep/cppformat/CMakeLists.txt
Normal file
31
dep/cppformat/CMakeLists.txt
Normal file
@@ -0,0 +1,31 @@
|
||||
include(CheckCXXCompilerFlag)
|
||||
include(CheckSymbolExists)
|
||||
|
||||
set(FMT_SOURCES format.cc format.h)
|
||||
|
||||
# Use variadic templates
|
||||
add_definitions(-DFMT_VARIADIC_TEMPLATES=1)
|
||||
|
||||
# Use deleted functions
|
||||
add_definitions(-DFMT_USE_DELETED_FUNCTIONS=1)
|
||||
|
||||
# Use static assert
|
||||
add_definitions(-DFMT_USE_STATIC_ASSERT=1)
|
||||
|
||||
if (WIN32)
|
||||
check_symbol_exists(open io.h HAVE_OPEN)
|
||||
else ()
|
||||
check_symbol_exists(open fcntl.h HAVE_OPEN)
|
||||
endif ()
|
||||
|
||||
if (HAVE_OPEN)
|
||||
add_definitions(-DFMT_USE_FILE_DESCRIPTORS=1)
|
||||
set(FMT_SOURCES ${FMT_SOURCES} posix.cc posix.h)
|
||||
endif ()
|
||||
|
||||
add_library(format STATIC ${FMT_SOURCES})
|
||||
|
||||
if (CMAKE_COMPILER_IS_GNUCXX)
|
||||
set_target_properties(format PROPERTIES COMPILE_FLAGS
|
||||
"-Wall -Wextra -Wshadow -pedantic")
|
||||
endif ()
|
||||
335
dep/cppformat/ChangeLog.rst
Normal file
335
dep/cppformat/ChangeLog.rst
Normal file
@@ -0,0 +1,335 @@
|
||||
1.1.0 - 2015-03-06
|
||||
------------------
|
||||
|
||||
* Added ``BasicArrayWriter``, a class template that provides operations for
|
||||
formatting and writing data into a fixed-size array
|
||||
(`#105 <https://github.com/cppformat/cppformat/issues/105>`_ and
|
||||
`#122 <https://github.com/cppformat/cppformat/issues/122>`_):
|
||||
|
||||
.. code:: c++
|
||||
|
||||
char buffer[100];
|
||||
fmt::ArrayWriter w(buffer);
|
||||
w.write("The answer is {}", 42);
|
||||
|
||||
* Added `0 A.D. <http://play0ad.com/>`_ and `PenUltima Online (POL)
|
||||
<http://www.polserver.com/>`_ to the list of notable projects using C++ Format.
|
||||
|
||||
* C++ Format now uses MSVC intrinsics for better formatting performance
|
||||
(`#115 <https://github.com/cppformat/cppformat/pull/115>`_,
|
||||
`#116 <https://github.com/cppformat/cppformat/pull/116>`_,
|
||||
`#118 <https://github.com/cppformat/cppformat/pull/118>`_ and
|
||||
`#121 <https://github.com/cppformat/cppformat/pull/121>`_).
|
||||
Previously these optimizations where only used on GCC and Clang.
|
||||
Thanks to `@CarterLi <https://github.com/CarterLi>`_ and
|
||||
`@objectx <https://github.com/objectx>`_.
|
||||
|
||||
* CMake install target (`#119 <https://github.com/cppformat/cppformat/pull/119>`_).
|
||||
Thanks to `@TrentHouliston <https://github.com/TrentHouliston>`_.
|
||||
|
||||
You can now install C++ Format with ``make install`` command.
|
||||
|
||||
* Improved `Biicode <http://www.biicode.com/>`_ support
|
||||
(`#98 <https://github.com/cppformat/cppformat/pull/98>`_ and
|
||||
`#104 <https://github.com/cppformat/cppformat/pull/104>`_). Thanks to
|
||||
`@MariadeAnton <https://github.com/MariadeAnton>`_ and
|
||||
`@franramirez688 <https://github.com/franramirez688>`_.
|
||||
|
||||
* Improved support for bulding with `Android NDK
|
||||
<https://developer.android.com/tools/sdk/ndk/index.html>`_
|
||||
(`#107 <https://github.com/cppformat/cppformat/pull/107>`_).
|
||||
Thanks to `@newnon <https://github.com/newnon>`_.
|
||||
|
||||
The `android-ndk-example <https://github.com/cppformat/android-ndk-example>`_
|
||||
repository provides and example of using C++ Format with Android NDK:
|
||||
|
||||
.. image:: https://raw.githubusercontent.com/cppformat/android-ndk-example/
|
||||
master/screenshot.png
|
||||
|
||||
* Improved documentation of ``SystemError`` and ``WindowsError``
|
||||
(`#54 <https://github.com/cppformat/cppformat/issues/54>`_).
|
||||
|
||||
* Various code improvements
|
||||
(`#110 <https://github.com/cppformat/cppformat/pull/110>`_,
|
||||
`#111 <https://github.com/cppformat/cppformat/pull/111>`_
|
||||
`#112 <https://github.com/cppformat/cppformat/pull/112>`_).
|
||||
Thanks to `@CarterLi <https://github.com/CarterLi>`_.
|
||||
|
||||
* Improved compile-time errors when formatting wide into narrow strings
|
||||
(`#117 <https://github.com/cppformat/cppformat/issues/117>`_).
|
||||
|
||||
* Fixed ``BasicWriter::write`` without formatting arguments when C++11 support
|
||||
is disabled (`#109 <https://github.com/cppformat/cppformat/issues/109>`_).
|
||||
|
||||
* Fixed header-only build on OS X with GCC 4.9
|
||||
(`#124 <https://github.com/cppformat/cppformat/issues/124>`_).
|
||||
|
||||
* Fixed packaging issues (`#94 <https://github.com/cppformat/cppformat/issues/94>`_).
|
||||
|
||||
* Fixed warnings in GCC, MSVC and Xcode/Clang
|
||||
(`#95 <https://github.com/cppformat/cppformat/issues/95>`_,
|
||||
`#96 <https://github.com/cppformat/cppformat/issues/96>`_ and
|
||||
`#114 <https://github.com/cppformat/cppformat/pull/114>`_).
|
||||
|
||||
* Added `changelog <https://github.com/cppformat/cppformat/blob/master/ChangeLog.rst>`_
|
||||
(`#103 <https://github.com/cppformat/cppformat/issues/103>`_).
|
||||
|
||||
1.0.0 - 2015-02-05
|
||||
------------------
|
||||
|
||||
* Add support for a header-only configuration when ``FMT_HEADER_ONLY`` is
|
||||
defined before including ``format.h``:
|
||||
|
||||
.. code:: c++
|
||||
|
||||
#define FMT_HEADER_ONLY
|
||||
#include "format.h"
|
||||
|
||||
* Compute string length in the constructor of ``BasicStringRef``
|
||||
instead of the ``size`` method
|
||||
(`#79 <https://github.com/cppformat/cppformat/issues/79>`_).
|
||||
This eliminates size computation for string literals on reasonable optimizing
|
||||
compilers.
|
||||
|
||||
* Fix formatting of types with overloaded ``operator <<`` for ``std::wostream``
|
||||
(`#86 <https://github.com/cppformat/cppformat/issues/86>`_):
|
||||
|
||||
.. code:: c++
|
||||
|
||||
fmt::format(L"The date is {0}", Date(2012, 12, 9));
|
||||
|
||||
* Fix linkage of tests on Arch Linux
|
||||
(`#89 <https://github.com/cppformat/cppformat/issues/89>`_).
|
||||
|
||||
* Allow precision specifier for non-float arguments
|
||||
(`#90 <https://github.com/cppformat/cppformat/issues/90>`_):
|
||||
|
||||
.. code:: c++
|
||||
|
||||
fmt::print("{:.3}\n", "Carpet"); // prints "Car"
|
||||
|
||||
* Fix build on Android NDK
|
||||
(`#93 <https://github.com/cppformat/cppformat/issues/93>`_)
|
||||
|
||||
* Improvements to documentation build procedure.
|
||||
|
||||
* Remove ``FMT_SHARED`` CMake variable in favor of standard `BUILD_SHARED_LIBS
|
||||
<http://www.cmake.org/cmake/help/v3.0/variable/BUILD_SHARED_LIBS.html>`_.
|
||||
|
||||
* Fix error handling in ``fmt::fprintf``.
|
||||
|
||||
* Fix a number of warnings.
|
||||
|
||||
0.12.0 - 2014-10-25
|
||||
-------------------
|
||||
|
||||
* [Breaking] Improved separation between formatting and buffer management.
|
||||
``Writer`` is now a base class that cannot be instantiated directly.
|
||||
The new ``MemoryWriter`` class implements the default buffer management
|
||||
with small allocations done on stack. So ``fmt::Writer`` should be replaced
|
||||
with ``fmt::MemoryWriter`` in variable declarations.
|
||||
|
||||
Old code:
|
||||
|
||||
.. code:: c++
|
||||
|
||||
fmt::Writer w;
|
||||
|
||||
New code:
|
||||
|
||||
.. code:: c++
|
||||
|
||||
fmt::MemoryWriter w;
|
||||
|
||||
If you pass ``fmt::Writer`` by reference, you can continue to do so:
|
||||
|
||||
.. code:: c++
|
||||
|
||||
void f(fmt::Writer &w);
|
||||
|
||||
This doesn't affect the formatting API.
|
||||
|
||||
* Support for custom memory allocators
|
||||
(`#69 <https://github.com/cppformat/cppformat/issues/69>`_)
|
||||
|
||||
* Formatting functions now accept `signed char` and `unsigned char` strings as
|
||||
arguments (`#73 <https://github.com/cppformat/cppformat/issues/73>`_):
|
||||
|
||||
.. code:: c++
|
||||
|
||||
auto s = format("GLSL version: {}", glGetString(GL_VERSION));
|
||||
|
||||
* Reduced code bloat. According to the new `benchmark results
|
||||
<https://github.com/cppformat/cppformat#compile-time-and-code-bloat>`_,
|
||||
cppformat is close to ``printf`` and by the order of magnitude better than
|
||||
Boost Format in terms of compiled code size.
|
||||
|
||||
* Improved appearance of the documentation on mobile by using the `Sphinx
|
||||
Bootstrap theme <http://ryan-roemer.github.io/sphinx-bootstrap-theme/>`_:
|
||||
|
||||
.. |old| image:: https://cloud.githubusercontent.com/assets/576385/4792130/
|
||||
cd256436-5de3-11e4-9a62-c077d0c2b003.png
|
||||
|
||||
.. |new| image:: https://cloud.githubusercontent.com/assets/576385/4792131/
|
||||
cd29896c-5de3-11e4-8f59-cac952942bf0.png
|
||||
|
||||
+-------+-------+
|
||||
| Old | New |
|
||||
+-------+-------+
|
||||
| |old| | |new| |
|
||||
+-------+-------+
|
||||
|
||||
0.11.0 - 2014-08-21
|
||||
-------------------
|
||||
|
||||
* Safe printf implementation with a POSIX extension for positional arguments:
|
||||
|
||||
.. code:: c++
|
||||
|
||||
fmt::printf("Elapsed time: %.2f seconds", 1.23);
|
||||
fmt::printf("%1$s, %3$d %2$s", weekday, month, day);
|
||||
|
||||
* Arguments of ``char`` type can now be formatted as integers
|
||||
(Issue `#55 <https://github.com/cppformat/cppformat/issues/55>`_):
|
||||
|
||||
.. code:: c++
|
||||
|
||||
fmt::format("0x{0:02X}", 'a');
|
||||
|
||||
* Deprecated parts of the API removed.
|
||||
|
||||
* The library is now built and tested on MinGW with Appveyor in addition to
|
||||
existing test platforms Linux/GCC, OS X/Clang, Windows/MSVC.
|
||||
|
||||
0.10.0 - 2014-07-01
|
||||
-------------------
|
||||
|
||||
**Improved API**
|
||||
|
||||
* All formatting methods are now implemented as variadic functions instead
|
||||
of using ``operator<<`` for feeding arbitrary arguments into a temporary
|
||||
formatter object. This works both with C++11 where variadic templates are
|
||||
used and with older standards where variadic functions are emulated by
|
||||
providing lightweight wrapper functions defined with the ``FMT_VARIADIC``
|
||||
macro. You can use this macro for defining your own portable variadic
|
||||
functions:
|
||||
|
||||
.. code:: c++
|
||||
|
||||
void report_error(const char *format, const fmt::ArgList &args) {
|
||||
fmt::print("Error: {}");
|
||||
fmt::print(format, args);
|
||||
}
|
||||
FMT_VARIADIC(void, report_error, const char *)
|
||||
|
||||
report_error("file not found: {}", path);
|
||||
|
||||
Apart from a more natural syntax, this also improves performance as there
|
||||
is no need to construct temporary formatter objects and control arguments'
|
||||
lifetimes. Because the wrapper functions are very ligthweight, this doesn't
|
||||
cause code bloat even in pre-C++11 mode.
|
||||
|
||||
* Simplified common case of formatting an ``std::string``. Now it requires a
|
||||
single function call:
|
||||
|
||||
.. code:: c++
|
||||
|
||||
std::string s = format("The answer is {}.", 42);
|
||||
|
||||
Previously it required 2 function calls:
|
||||
|
||||
.. code:: c++
|
||||
|
||||
std::string s = str(Format("The answer is {}.") << 42);
|
||||
|
||||
Instead of unsafe ``c_str`` function, ``fmt::Writer`` should be used directly
|
||||
to bypass creation of ``std::string``:
|
||||
|
||||
.. code:: c++
|
||||
|
||||
fmt::Writer w;
|
||||
w.write("The answer is {}.", 42);
|
||||
w.c_str(); // returns a C string
|
||||
|
||||
This doesn't do dynamic memory allocation for small strings and is less error
|
||||
prone as the lifetime of the string is the same as for ``std::string::c_str``
|
||||
which is well understood (hopefully).
|
||||
|
||||
* Improved consistency in naming functions that are a part of the public API.
|
||||
Now all public functions are lowercase following the standard library
|
||||
conventions. Previously it was a combination of lowercase and
|
||||
CapitalizedWords.
|
||||
Issue `#50 <https://github.com/cppformat/cppformat/issues/50>`_.
|
||||
|
||||
* Old functions are marked as deprecated and will be removed in the next
|
||||
release.
|
||||
|
||||
**Other Changes**
|
||||
|
||||
* Experimental support for printf format specifications (work in progress):
|
||||
|
||||
.. code:: c++
|
||||
|
||||
fmt::printf("The answer is %d.", 42);
|
||||
std::string s = fmt::sprintf("Look, a %s!", "string");
|
||||
|
||||
* Support for hexadecimal floating point format specifiers ``a`` and ``A``:
|
||||
|
||||
.. code:: c++
|
||||
|
||||
print("{:a}", -42.0); // Prints -0x1.5p+5
|
||||
print("{:A}", -42.0); // Prints -0X1.5P+5
|
||||
|
||||
* CMake option ``FMT_SHARED`` that specifies whether to build format as a
|
||||
shared library (off by default).
|
||||
|
||||
0.9.0 - 2014-05-13
|
||||
------------------
|
||||
|
||||
* More efficient implementation of variadic formatting functions.
|
||||
|
||||
* ``Writer::Format`` now has a variadic overload:
|
||||
|
||||
.. code:: c++
|
||||
|
||||
Writer out;
|
||||
out.Format("Look, I'm {}!", "variadic");
|
||||
|
||||
* For efficiency and consistency with other overloads, variadic overload of
|
||||
the ``Format`` function now returns ``Writer`` instead of ``std::string``.
|
||||
Use the ``str`` function to convert it to ``std::string``:
|
||||
|
||||
.. code:: c++
|
||||
|
||||
std::string s = str(Format("Look, I'm {}!", "variadic"));
|
||||
|
||||
* Replaced formatter actions with output sinks: ``NoAction`` -> ``NullSink``,
|
||||
``Write`` -> ``FileSink``, ``ColorWriter`` -> ``ANSITerminalSink``.
|
||||
This improves naming consistency and shouldn't affect client code unless
|
||||
these classes are used directly which should be rarely needed.
|
||||
|
||||
* Added ``ThrowSystemError`` function that formats a message and throws
|
||||
``SystemError`` containing the formatted message and system-specific error
|
||||
description. For example, the following code
|
||||
|
||||
.. code:: c++
|
||||
|
||||
FILE *f = fopen(filename, "r");
|
||||
if (!f)
|
||||
ThrowSystemError(errno, "Failed to open file '{}'") << filename;
|
||||
|
||||
will throw ``SystemError`` exception with description
|
||||
"Failed to open file '<filename>': No such file or directory" if file
|
||||
doesn't exist.
|
||||
|
||||
* Support for AppVeyor continuous integration platform.
|
||||
|
||||
* ``Format`` now throws ``SystemError`` in case of I/O errors.
|
||||
|
||||
* Improve test infrastructure. Print functions are now tested by redirecting
|
||||
the output to a pipe.
|
||||
|
||||
0.8.0 - 2014-04-14
|
||||
------------------
|
||||
|
||||
* Initial release
|
||||
23
dep/cppformat/LICENSE.rst
Normal file
23
dep/cppformat/LICENSE.rst
Normal file
@@ -0,0 +1,23 @@
|
||||
Copyright (c) 2012 - 2015, Victor Zverovich
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
409
dep/cppformat/README.rst
Normal file
409
dep/cppformat/README.rst
Normal file
@@ -0,0 +1,409 @@
|
||||
C++ Format
|
||||
==========
|
||||
|
||||
.. image:: https://travis-ci.org/cppformat/cppformat.png?branch=master
|
||||
:target: https://travis-ci.org/cppformat/cppformat
|
||||
|
||||
.. image:: https://ci.appveyor.com/api/projects/status/qk0bhyhqp1ekpat8
|
||||
:target: https://ci.appveyor.com/project/vitaut/cppformat
|
||||
|
||||
.. image:: https://webapi.biicode.com/v1/badges/vitaut/vitaut/cppformat/master?dummy
|
||||
:target: https://www.biicode.com/vitaut/cppformat
|
||||
|
||||
.. image:: https://badges.gitter.im/Join%20Chat.svg
|
||||
:alt: Join the chat at https://gitter.im/cppformat/cppformat
|
||||
:target: https://gitter.im/cppformat/cppformat?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge
|
||||
|
||||
C++ Format is an open-source formatting library for C++.
|
||||
It can be used as a safe alternative to printf or as a fast
|
||||
alternative to IOStreams.
|
||||
|
||||
`Documentation <http://cppformat.github.io/latest/>`_
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
* Two APIs: faster concatenation-based write API and slower (but still
|
||||
very fast) replacement-based format API with positional arguments for
|
||||
localization.
|
||||
* Write API similar to the one used by IOStreams but stateless allowing
|
||||
faster implementation.
|
||||
* Format API with `format string syntax
|
||||
<http://cppformat.github.io/latest/syntax.html>`_
|
||||
similar to the one used by `str.format
|
||||
<http://docs.python.org/2/library/stdtypes.html#str.format>`_ in Python.
|
||||
* Safe `printf implementation
|
||||
<http://cppformat.github.io/latest/reference.html#printf-formatting-functions>`_
|
||||
including the POSIX extension for positional arguments.
|
||||
* Support for user-defined types.
|
||||
* High speed: performance of the format API is close to that of
|
||||
glibc's `printf <http://en.cppreference.com/w/cpp/io/c/fprintf>`_
|
||||
and better than performance of IOStreams. See `Speed tests`_ and
|
||||
`Fast integer to string conversion in C++
|
||||
<http://zverovich.net/2013/09/07/integer-to-string-conversion-in-cplusplus.html>`_.
|
||||
* Small code size both in terms of source code (format consists of a single
|
||||
header file and a single source file) and compiled code.
|
||||
See `Compile time and code bloat`_.
|
||||
* Reliability: the library has an extensive set of `unit tests
|
||||
<https://github.com/cppformat/cppformat/tree/master/test>`_.
|
||||
* Safety: the library is fully type safe, errors in format strings are
|
||||
reported using exceptions, automatic memory management prevents buffer
|
||||
overflow errors.
|
||||
* Ease of use: small self-contained code base, no external dependencies,
|
||||
permissive BSD `license
|
||||
<https://github.com/cppformat/cppformat/blob/master/LICENSE.rst>`_
|
||||
* `Portability <http://cppformat.github.io#portability>`_ with consistent output
|
||||
across platforms and support for older compilers.
|
||||
* Clean warning-free codebase even on high warning levels
|
||||
(-Wall -Wextra -pedantic).
|
||||
* Support for wide strings.
|
||||
* Optional header-only configuration enabled with the ``FMT_HEADER_ONLY`` macro.
|
||||
|
||||
See the `documentation <http://cppformat.github.io/latest/>`_ for more details.
|
||||
|
||||
Examples
|
||||
--------
|
||||
|
||||
This prints ``Hello, world!`` to stdout:
|
||||
|
||||
.. code:: c++
|
||||
|
||||
fmt::print("Hello, {}!", "world"); // uses Python-like format string syntax
|
||||
fmt::printf("Hello, %s!", "world"); // uses printf format string syntax
|
||||
|
||||
Arguments can be accessed by position and arguments' indices can be repeated:
|
||||
|
||||
.. code:: c++
|
||||
|
||||
std::string s = fmt::format("{0}{1}{0}", "abra", "cad");
|
||||
// s == "abracadabra"
|
||||
|
||||
C++ Format can be used as a safe portable replacement for ``itoa``:
|
||||
|
||||
.. code:: c++
|
||||
|
||||
fmt::MemoryWriter w;
|
||||
w << 42; // replaces itoa(42, buffer, 10)
|
||||
w << fmt::hex(42); // replaces itoa(42, buffer, 16)
|
||||
// access the string using w.str() or w.c_str()
|
||||
|
||||
An object of any user-defined type for which there is an overloaded
|
||||
:code:`std::ostream` insertion operator (``operator<<``) can be formatted:
|
||||
|
||||
.. code:: c++
|
||||
|
||||
class Date {
|
||||
int year_, month_, day_;
|
||||
public:
|
||||
Date(int year, int month, int day) : year_(year), month_(month), day_(day) {}
|
||||
|
||||
friend std::ostream &operator<<(std::ostream &os, const Date &d) {
|
||||
return os << d.year_ << '-' << d.month_ << '-' << d.day_;
|
||||
}
|
||||
};
|
||||
|
||||
std::string s = fmt::format("The date is {}", Date(2012, 12, 9));
|
||||
// s == "The date is 2012-12-9"
|
||||
|
||||
You can use the `FMT_VARIADIC
|
||||
<http://cppformat.github.io/latest/reference.html#utilities>`_
|
||||
macro to create your own functions similar to `format
|
||||
<http://cppformat.github.io/latest/reference.html#format>`_ and
|
||||
`print <http://cppformat.github.io/latest/reference.html#print>`_
|
||||
which take arbitrary arguments:
|
||||
|
||||
.. code:: c++
|
||||
|
||||
// Prints formatted error message.
|
||||
void report_error(const char *format, fmt::ArgList args) {
|
||||
fmt::print("Error: ");
|
||||
fmt::print(format, args);
|
||||
}
|
||||
FMT_VARIADIC(void, report_error, const char *)
|
||||
|
||||
report_error("file not found: {}", path);
|
||||
|
||||
Note that you only need to define one function that takes ``fmt::ArgList``
|
||||
argument. ``FMT_VARIADIC`` automatically defines necessary wrappers that
|
||||
accept variable number of arguments.
|
||||
|
||||
Projects using this library
|
||||
---------------------------
|
||||
|
||||
* `0 A.D. <http://play0ad.com/>`_: A free, open-source, cross-platform real-time strategy game
|
||||
|
||||
* `AMPL/MP <https://github.com/ampl/mp>`_:
|
||||
An open-source library for mathematical programming
|
||||
|
||||
* `HarpyWar/pvpgn <https://github.com/HarpyWar/pvpgn>`_:
|
||||
Player vs Player Gaming Network with tweaks
|
||||
|
||||
* `KBEngine <http://www.kbengine.org/>`_: An open-source MMOG server engine
|
||||
|
||||
* `Lifeline <https://github.com/peter-clark/lifeline>`_: A 2D game
|
||||
|
||||
* `PenUltima Online (POL) <http://www.polserver.com/>`_:
|
||||
An MMO server, compatible with most Ultima Online clients
|
||||
|
||||
* `quasardb <https://www.quasardb.net/>`_: A distributed, high-performance, associative database
|
||||
|
||||
* `readpe <https://bitbucket.org/sys_dev/readpe>`_: Read Portable Executable
|
||||
|
||||
* `Saddy <https://code.google.com/p/saddy/>`_:
|
||||
Small crossplatform 2D graphic engine
|
||||
|
||||
* `Salesforce Analytics Cloud <http://www.salesforce.com/analytics-cloud/overview/>`_:
|
||||
Business intelligence software
|
||||
|
||||
* `spdlog <https://github.com/gabime/spdlog>`_: Super fast C++ logging library
|
||||
|
||||
* `TrinityCore <https://github.com/TrinityCore/TrinityCore>`_: Open-source MMORPG framework
|
||||
|
||||
`More... <https://github.com/search?q=cppformat&type=Code>`_
|
||||
|
||||
If you are aware of other projects using this library, please let me know
|
||||
by `email <mailto:victor.zverovich@gmail.com>`_ or by submitting an
|
||||
`issue <https://github.com/cppformat/cppformat/issues>`_.
|
||||
|
||||
Motivation
|
||||
----------
|
||||
|
||||
So why yet another formatting library?
|
||||
|
||||
There are plenty of methods for doing this task, from standard ones like
|
||||
the printf family of function and IOStreams to Boost Format library and
|
||||
FastFormat. The reason for creating a new library is that every existing
|
||||
solution that I found either had serious issues or didn't provide
|
||||
all the features I needed.
|
||||
|
||||
Printf
|
||||
~~~~~~
|
||||
|
||||
The good thing about printf is that it is pretty fast and readily available
|
||||
being a part of the C standard library. The main drawback is that it
|
||||
doesn't support user-defined types. Printf also has safety issues although
|
||||
they are mostly solved with `__attribute__ ((format (printf, ...))
|
||||
<http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html>`_ in GCC.
|
||||
There is a POSIX extension that adds positional arguments required for
|
||||
`i18n <http://en.wikipedia.org/wiki/Internationalization_and_localization>`_
|
||||
to printf but it is not a part of C99 and may not be available on some
|
||||
platforms.
|
||||
|
||||
IOStreams
|
||||
~~~~~~~~~
|
||||
|
||||
The main issue with IOStreams is best illustrated with an example:
|
||||
|
||||
.. code:: c++
|
||||
|
||||
std::cout << std::setprecision(2) << std::fixed << 1.23456 << "\n";
|
||||
|
||||
which is a lot of typing compared to printf:
|
||||
|
||||
.. code:: c++
|
||||
|
||||
printf("%.2f\n", 1.23456);
|
||||
|
||||
Matthew Wilson, the author of FastFormat, referred to this situation with
|
||||
IOStreams as "chevron hell". IOStreams doesn't support positional arguments
|
||||
by design.
|
||||
|
||||
The good part is that IOStreams supports user-defined types and is safe
|
||||
although error reporting is awkward.
|
||||
|
||||
Boost Format library
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
This is a very powerful library which supports both printf-like format
|
||||
strings and positional arguments. The main its drawback is performance.
|
||||
According to various benchmarks it is much slower than other methods
|
||||
considered here. Boost Format also has excessive build times and severe
|
||||
code bloat issues (see `Benchmarks`_).
|
||||
|
||||
FastFormat
|
||||
~~~~~~~~~~
|
||||
|
||||
This is an interesting library which is fast, safe and has positional
|
||||
arguments. However it has significant limitations, citing its author:
|
||||
|
||||
Three features that have no hope of being accommodated within the
|
||||
current design are:
|
||||
|
||||
* Leading zeros (or any other non-space padding)
|
||||
* Octal/hexadecimal encoding
|
||||
* Runtime width/alignment specification
|
||||
|
||||
It is also quite big and has a heavy dependency, STLSoft, which might be
|
||||
too restrictive for using it in some projects.
|
||||
|
||||
Loki SafeFormat
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
SafeFormat is a formatting library which uses printf-like format strings
|
||||
and is type safe. It doesn't support user-defined types or positional
|
||||
arguments. It makes unconventional use of ``operator()`` for passing
|
||||
format arguments.
|
||||
|
||||
Tinyformat
|
||||
~~~~~~~~~~
|
||||
|
||||
This library supports printf-like format strings and is very small and
|
||||
fast. Unfortunately it doesn't support positional arguments and wrapping
|
||||
it in C++98 is somewhat difficult. Also its performance and code compactness
|
||||
are limited by IOStreams.
|
||||
|
||||
Boost Spirit.Karma
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
This is not really a formatting library but I decided to include it here
|
||||
for completeness. As IOStreams it suffers from the problem of mixing
|
||||
verbatim text with arguments. The library is pretty fast, but slower
|
||||
on integer formatting than ``fmt::Writer`` on Karma's own benchmark,
|
||||
see `Fast integer to string conversion in C++
|
||||
<http://zverovich.net/2013/09/07/integer-to-string-conversion-in-cplusplus.html>`_.
|
||||
|
||||
Benchmarks
|
||||
----------
|
||||
|
||||
Speed tests
|
||||
~~~~~~~~~~~
|
||||
|
||||
The following speed tests results were generated by building
|
||||
``tinyformat_test.cpp`` on Ubuntu GNU/Linux 14.04.1 with
|
||||
``g++-4.8.2 -O3 -DSPEED_TEST -DHAVE_FORMAT``, and taking the best of three
|
||||
runs. In the test, the format string ``"%0.10f:%04d:%+g:%s:%p:%c:%%\n"`` or
|
||||
equivalent is filled 2000000 times with output sent to ``/dev/null``; for
|
||||
further details see the `source
|
||||
<https://github.com/cppformat/format-benchmark/blob/master/tinyformat_test.cpp>`_.
|
||||
|
||||
================= ============= ===========
|
||||
Library Method Run Time, s
|
||||
================= ============= ===========
|
||||
EGLIBC 2.19 printf 1.30
|
||||
libstdc++ 4.8.2 std::ostream 1.85
|
||||
C++ Format 1.0 fmt::print 1.42
|
||||
tinyformat 2.0.1 tfm::printf 2.25
|
||||
Boost Format 1.54 boost::format 9.94
|
||||
================= ============= ===========
|
||||
|
||||
As you can see ``boost::format`` is much slower than the alternative methods; this
|
||||
is confirmed by `other tests <http://accu.org/index.php/journals/1539>`_.
|
||||
Tinyformat is quite good coming close to IOStreams. Unfortunately tinyformat
|
||||
cannot be faster than the IOStreams because it uses them internally.
|
||||
Performance of cppformat is close to that of printf, being `faster than printf on integer
|
||||
formatting <http://zverovich.net/2013/09/07/integer-to-string-conversion-in-cplusplus.html>`_,
|
||||
but slower on floating-point formatting which dominates this benchmark.
|
||||
|
||||
Compile time and code bloat
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The script `bloat-test.py
|
||||
<https://github.com/cppformat/format-benchmark/blob/master/bloat-test.py>`_
|
||||
from `format-benchmark <https://github.com/cppformat/format-benchmark>`_
|
||||
tests compile time and code bloat for nontrivial projects.
|
||||
It generates 100 translation units and uses ``printf()`` or its alternative
|
||||
five times in each to simulate a medium sized project. The resulting
|
||||
executable size and compile time (g++-4.8.1, Ubuntu GNU/Linux 13.10,
|
||||
best of three) is shown in the following tables.
|
||||
|
||||
**Optimized build (-O3)**
|
||||
|
||||
============ =============== ==================== ==================
|
||||
Method Compile Time, s Executable size, KiB Stripped size, KiB
|
||||
============ =============== ==================== ==================
|
||||
printf 2.6 41 30
|
||||
IOStreams 19.4 92 70
|
||||
C++ Format 46.8 46 34
|
||||
tinyformat 64.6 418 386
|
||||
Boost Format 222.8 990 923
|
||||
============ =============== ==================== ==================
|
||||
|
||||
As you can see, C++ Format has two times less overhead in terms of resulting
|
||||
code size compared to IOStreams and comes pretty close to ``printf``.
|
||||
Boost Format has by far the largest overheads.
|
||||
|
||||
**Non-optimized build**
|
||||
|
||||
============ =============== ==================== ==================
|
||||
Method Compile Time, s Executable size, KiB Stripped size, KiB
|
||||
============ =============== ==================== ==================
|
||||
printf 2.1 41 30
|
||||
IOStreams 19.7 86 62
|
||||
C++ Format 47.9 108 86
|
||||
tinyformat 27.7 234 190
|
||||
Boost Format 122.6 884 763
|
||||
============ =============== ==================== ==================
|
||||
|
||||
``libc``, ``libstdc++`` and ``libformat`` are all linked as shared
|
||||
libraries to compare formatting function overhead only. Boost Format
|
||||
and tinyformat are header-only libraries so they don't provide any
|
||||
linkage options.
|
||||
|
||||
Running the tests
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
Please refer to `Building the library`__ for the instructions on how to build
|
||||
the library and run the unit tests.
|
||||
|
||||
__ http://cppformat.github.io/latest/usage.html#building-the-library
|
||||
|
||||
Benchmarks reside in a separate repository,
|
||||
`format-benchmarks <https://github.com/cppformat/format-benchmark>`_,
|
||||
so to run the benchmarks you first need to clone this repository and
|
||||
generate Makefiles with CMake::
|
||||
|
||||
$ git clone --recursive https://github.com/cppformat/format-benchmark.git
|
||||
$ cd format-benchmark
|
||||
$ cmake .
|
||||
|
||||
Then you can run the speed test::
|
||||
|
||||
$ make speed-test
|
||||
|
||||
or the bloat test::
|
||||
|
||||
$ make bloat-test
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
C++ Format is distributed under the BSD `license
|
||||
<https://github.com/cppformat/cppformat/blob/master/LICENSE.rst>`_.
|
||||
|
||||
The `Format String Syntax
|
||||
<http://cppformat.github.io/latest/syntax.html>`_
|
||||
section in the documentation is based on the one from Python `string module
|
||||
documentation <http://docs.python.org/3/library/string.html#module-string>`_
|
||||
adapted for the current library. For this reason the documentation is
|
||||
distributed under the Python Software Foundation license available in
|
||||
`doc/python-license.txt
|
||||
<https://raw.github.com/cppformat/cppformat/master/doc/python-license.txt>`_.
|
||||
It only applies if you distribute the documentation of C++ Format.
|
||||
|
||||
Links
|
||||
-----
|
||||
|
||||
`API changes/compatibility report <http://upstream-tracker.org/versions/cppformat.html>`_
|
||||
|
||||
Acknowledgments
|
||||
---------------
|
||||
|
||||
The benchmark section of this readme file and the performance tests are taken
|
||||
from the excellent `tinyformat <https://github.com/c42f/tinyformat>`_ library
|
||||
written by Chris Foster. Boost Format library is acknowledged transitively
|
||||
since it had some influence on tinyformat.
|
||||
Some ideas used in the implementation are borrowed from `Loki
|
||||
<http://loki-lib.sourceforge.net/>`_ SafeFormat and `Diagnostic API
|
||||
<http://clang.llvm.org/doxygen/classclang_1_1Diagnostic.html>`_ in
|
||||
`Clang <http://clang.llvm.org/>`_.
|
||||
Format string syntax and the documentation are based on Python's `str.format
|
||||
<http://docs.python.org/2/library/stdtypes.html#str.format>`_.
|
||||
Thanks `Doug Turnbull <https://github.com/softwaredoug>`_ for his valuable
|
||||
comments and contribution to the design of the type-safe API and
|
||||
`Gregory Czajkowski <https://github.com/gcflymoto>`_ for implementing binary
|
||||
formatting. Thanks `Ruslan Baratov <https://github.com/ruslo>`_ for comprehensive
|
||||
`comparison of integer formatting algorithms <https://github.com/ruslo/int-dec-format-tests>`_
|
||||
and useful comments regarding performance, `Boris Kaul <https://github.com/localvoid>`_ for
|
||||
`C++ counting digits benchmark <https://github.com/localvoid/cxx-benchmark-count-digits>`_.
|
||||
Thanks to `CarterLi <https://github.com/CarterLi>`_ for contributing various
|
||||
improvements to the code.
|
||||
1317
dep/cppformat/format.cc
Normal file
1317
dep/cppformat/format.cc
Normal file
File diff suppressed because it is too large
Load Diff
2992
dep/cppformat/format.h
Normal file
2992
dep/cppformat/format.h
Normal file
File diff suppressed because it is too large
Load Diff
253
dep/cppformat/posix.cc
Normal file
253
dep/cppformat/posix.cc
Normal file
@@ -0,0 +1,253 @@
|
||||
/*
|
||||
A C++ interface to POSIX functions.
|
||||
|
||||
Copyright (c) 2014 - 2015, Victor Zverovich
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
// Disable bogus MSVC warnings.
|
||||
#ifndef _CRT_SECURE_NO_WARNINGS
|
||||
# define _CRT_SECURE_NO_WARNINGS
|
||||
#endif
|
||||
|
||||
#include "posix.h"
|
||||
|
||||
#include <limits.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#ifndef _WIN32
|
||||
# include <unistd.h>
|
||||
#else
|
||||
# include <windows.h>
|
||||
# include <io.h>
|
||||
|
||||
# define O_CREAT _O_CREAT
|
||||
# define O_TRUNC _O_TRUNC
|
||||
|
||||
# ifndef S_IRUSR
|
||||
# define S_IRUSR _S_IREAD
|
||||
# endif
|
||||
|
||||
# ifndef S_IWUSR
|
||||
# define S_IWUSR _S_IWRITE
|
||||
# endif
|
||||
|
||||
# ifdef __MINGW32__
|
||||
# define _SH_DENYNO 0x40
|
||||
# undef fileno
|
||||
# endif
|
||||
|
||||
#endif // _WIN32
|
||||
|
||||
namespace {
|
||||
#ifdef _WIN32
|
||||
// Return type of read and write functions.
|
||||
typedef int RWResult;
|
||||
|
||||
// On Windows the count argument to read and write is unsigned, so convert
|
||||
// it from size_t preventing integer overflow.
|
||||
inline unsigned convert_rwcount(std::size_t count) {
|
||||
return count <= UINT_MAX ? static_cast<unsigned>(count) : UINT_MAX;
|
||||
}
|
||||
#else
|
||||
// Return type of read and write functions.
|
||||
typedef ssize_t RWResult;
|
||||
|
||||
inline std::size_t convert_rwcount(std::size_t count) { return count; }
|
||||
#endif
|
||||
}
|
||||
|
||||
fmt::BufferedFile::~BufferedFile() FMT_NOEXCEPT {
|
||||
if (file_ && FMT_SYSTEM(fclose(file_)) != 0)
|
||||
fmt::report_system_error(errno, "cannot close file");
|
||||
}
|
||||
|
||||
fmt::BufferedFile::BufferedFile(
|
||||
fmt::CStringRef filename, fmt::CStringRef mode) {
|
||||
FMT_RETRY_VAL(file_, FMT_SYSTEM(fopen(filename.c_str(), mode.c_str())), 0);
|
||||
if (!file_)
|
||||
throw SystemError(errno, "cannot open file {}", filename);
|
||||
}
|
||||
|
||||
void fmt::BufferedFile::close() {
|
||||
if (!file_)
|
||||
return;
|
||||
int result = FMT_SYSTEM(fclose(file_));
|
||||
file_ = 0;
|
||||
if (result != 0)
|
||||
throw SystemError(errno, "cannot close file");
|
||||
}
|
||||
|
||||
// A macro used to prevent expansion of fileno on broken versions of MinGW.
|
||||
#define FMT_ARGS
|
||||
|
||||
int fmt::BufferedFile::fileno() const {
|
||||
int fd = FMT_POSIX_CALL(fileno FMT_ARGS(file_));
|
||||
if (fd == -1)
|
||||
throw SystemError(errno, "cannot get file descriptor");
|
||||
return fd;
|
||||
}
|
||||
|
||||
fmt::File::File(fmt::CStringRef path, int oflag) {
|
||||
int mode = S_IRUSR | S_IWUSR;
|
||||
#if defined(_WIN32) && !defined(__MINGW32__)
|
||||
fd_ = -1;
|
||||
FMT_POSIX_CALL(sopen_s(&fd_, path.c_str(), oflag, _SH_DENYNO, mode));
|
||||
#else
|
||||
FMT_RETRY(fd_, FMT_POSIX_CALL(open(path.c_str(), oflag, mode)));
|
||||
#endif
|
||||
if (fd_ == -1)
|
||||
throw SystemError(errno, "cannot open file {}", path);
|
||||
}
|
||||
|
||||
fmt::File::~File() FMT_NOEXCEPT {
|
||||
// Don't retry close in case of EINTR!
|
||||
// See http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
|
||||
if (fd_ != -1 && FMT_POSIX_CALL(close(fd_)) != 0)
|
||||
fmt::report_system_error(errno, "cannot close file");
|
||||
}
|
||||
|
||||
void fmt::File::close() {
|
||||
if (fd_ == -1)
|
||||
return;
|
||||
// Don't retry close in case of EINTR!
|
||||
// See http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
|
||||
int result = FMT_POSIX_CALL(close(fd_));
|
||||
fd_ = -1;
|
||||
if (result != 0)
|
||||
throw SystemError(errno, "cannot close file");
|
||||
}
|
||||
|
||||
fmt::LongLong fmt::File::size() const {
|
||||
#ifdef _WIN32
|
||||
// Use GetFileSize instead of GetFileSizeEx for the case when _WIN32_WINNT
|
||||
// is less than 0x0500 as is the case with some default MinGW builds.
|
||||
// Both functions support large file sizes.
|
||||
DWORD size_upper = 0;
|
||||
HANDLE handle = reinterpret_cast<HANDLE>(_get_osfhandle(fd_));
|
||||
DWORD size_lower = FMT_SYSTEM(GetFileSize(handle, &size_upper));
|
||||
if (size_lower == INVALID_FILE_SIZE) {
|
||||
DWORD error = GetLastError();
|
||||
if (error != NO_ERROR)
|
||||
throw WindowsError(GetLastError(), "cannot get file size");
|
||||
}
|
||||
fmt::ULongLong long_size = size_upper;
|
||||
return (long_size << sizeof(DWORD) * CHAR_BIT) | size_lower;
|
||||
#else
|
||||
typedef struct stat Stat;
|
||||
Stat file_stat = Stat();
|
||||
if (FMT_POSIX_CALL(fstat(fd_, &file_stat)) == -1)
|
||||
throw SystemError(errno, "cannot get file attributes");
|
||||
FMT_STATIC_ASSERT(sizeof(fmt::LongLong) >= sizeof(file_stat.st_size),
|
||||
"return type of File::size is not large enough");
|
||||
return file_stat.st_size;
|
||||
#endif
|
||||
}
|
||||
|
||||
std::size_t fmt::File::read(void *buffer, std::size_t count) {
|
||||
RWResult result = 0;
|
||||
FMT_RETRY(result, FMT_POSIX_CALL(read(fd_, buffer, convert_rwcount(count))));
|
||||
if (result < 0)
|
||||
throw SystemError(errno, "cannot read from file");
|
||||
return result;
|
||||
}
|
||||
|
||||
std::size_t fmt::File::write(const void *buffer, std::size_t count) {
|
||||
RWResult result = 0;
|
||||
FMT_RETRY(result, FMT_POSIX_CALL(write(fd_, buffer, convert_rwcount(count))));
|
||||
if (result < 0)
|
||||
throw SystemError(errno, "cannot write to file");
|
||||
return result;
|
||||
}
|
||||
|
||||
fmt::File fmt::File::dup(int fd) {
|
||||
// Don't retry as dup doesn't return EINTR.
|
||||
// http://pubs.opengroup.org/onlinepubs/009695399/functions/dup.html
|
||||
int new_fd = FMT_POSIX_CALL(dup(fd));
|
||||
if (new_fd == -1)
|
||||
throw SystemError(errno, "cannot duplicate file descriptor {}", fd);
|
||||
return File(new_fd);
|
||||
}
|
||||
|
||||
void fmt::File::dup2(int fd) {
|
||||
int result = 0;
|
||||
FMT_RETRY(result, FMT_POSIX_CALL(dup2(fd_, fd)));
|
||||
if (result == -1) {
|
||||
throw SystemError(errno,
|
||||
"cannot duplicate file descriptor {} to {}", fd_, fd);
|
||||
}
|
||||
}
|
||||
|
||||
void fmt::File::dup2(int fd, ErrorCode &ec) FMT_NOEXCEPT {
|
||||
int result = 0;
|
||||
FMT_RETRY(result, FMT_POSIX_CALL(dup2(fd_, fd)));
|
||||
if (result == -1)
|
||||
ec = ErrorCode(errno);
|
||||
}
|
||||
|
||||
void fmt::File::pipe(File &read_end, File &write_end) {
|
||||
// Close the descriptors first to make sure that assignments don't throw
|
||||
// and there are no leaks.
|
||||
read_end.close();
|
||||
write_end.close();
|
||||
int fds[2] = {};
|
||||
#ifdef _WIN32
|
||||
// Make the default pipe capacity same as on Linux 2.6.11+.
|
||||
enum { DEFAULT_CAPACITY = 65536 };
|
||||
int result = FMT_POSIX_CALL(pipe(fds, DEFAULT_CAPACITY, _O_BINARY));
|
||||
#else
|
||||
// Don't retry as the pipe function doesn't return EINTR.
|
||||
// http://pubs.opengroup.org/onlinepubs/009696799/functions/pipe.html
|
||||
int result = FMT_POSIX_CALL(pipe(fds));
|
||||
#endif
|
||||
if (result != 0)
|
||||
throw SystemError(errno, "cannot create pipe");
|
||||
// The following assignments don't throw because read_fd and write_fd
|
||||
// are closed.
|
||||
read_end = File(fds[0]);
|
||||
write_end = File(fds[1]);
|
||||
}
|
||||
|
||||
fmt::BufferedFile fmt::File::fdopen(const char *mode) {
|
||||
// Don't retry as fdopen doesn't return EINTR.
|
||||
FILE *f = FMT_POSIX_CALL(fdopen(fd_, mode));
|
||||
if (!f)
|
||||
throw SystemError(errno, "cannot associate stream with file descriptor");
|
||||
BufferedFile file(f);
|
||||
fd_ = -1;
|
||||
return file;
|
||||
}
|
||||
|
||||
long fmt::getpagesize() {
|
||||
#ifdef _WIN32
|
||||
SYSTEM_INFO si;
|
||||
GetSystemInfo(&si);
|
||||
return si.dwPageSize;
|
||||
#else
|
||||
long size = FMT_POSIX_CALL(sysconf(_SC_PAGESIZE));
|
||||
if (size < 0)
|
||||
throw SystemError(errno, "cannot get memory page size");
|
||||
return size;
|
||||
#endif
|
||||
}
|
||||
340
dep/cppformat/posix.h
Normal file
340
dep/cppformat/posix.h
Normal file
@@ -0,0 +1,340 @@
|
||||
/*
|
||||
A C++ interface to POSIX functions.
|
||||
|
||||
Copyright (c) 2014 - 2015, Victor Zverovich
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef FMT_POSIX_H_
|
||||
#define FMT_POSIX_H_
|
||||
|
||||
#ifdef __MINGW32__
|
||||
// Workaround MinGW bug https://sourceforge.net/p/mingw/bugs/2024/.
|
||||
# undef __STRICT_ANSI__
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h> // for O_RDONLY
|
||||
#include <stdio.h>
|
||||
|
||||
#include <cstddef>
|
||||
|
||||
#include "format.h"
|
||||
|
||||
#ifndef FMT_POSIX
|
||||
# if defined(_WIN32) && !defined(__MINGW32__)
|
||||
// Fix warnings about deprecated symbols.
|
||||
# define FMT_POSIX(call) _##call
|
||||
# else
|
||||
# define FMT_POSIX(call) call
|
||||
# endif
|
||||
#endif
|
||||
|
||||
// Calls to system functions are wrapped in FMT_SYSTEM for testability.
|
||||
#ifdef FMT_SYSTEM
|
||||
# define FMT_POSIX_CALL(call) FMT_SYSTEM(call)
|
||||
#else
|
||||
# define FMT_SYSTEM(call) call
|
||||
# ifdef _WIN32
|
||||
// Fix warnings about deprecated symbols.
|
||||
# define FMT_POSIX_CALL(call) ::_##call
|
||||
# else
|
||||
# define FMT_POSIX_CALL(call) ::call
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if FMT_GCC_VERSION >= 407
|
||||
# define FMT_UNUSED __attribute__((unused))
|
||||
#else
|
||||
# define FMT_UNUSED
|
||||
#endif
|
||||
|
||||
#if FMT_USE_STATIC_ASSERT || FMT_HAS_CPP_ATTRIBUTE(cxx_static_assert) || \
|
||||
(FMT_GCC_VERSION >= 403 && FMT_HAS_GXX_CXX11) || _MSC_VER >= 1600
|
||||
# define FMT_STATIC_ASSERT(cond, message) static_assert(cond, message)
|
||||
#else
|
||||
# define FMT_CONCAT_(a, b) FMT_CONCAT(a, b)
|
||||
# define FMT_STATIC_ASSERT(cond, message) \
|
||||
typedef int FMT_CONCAT_(Assert, __LINE__)[(cond) ? 1 : -1] FMT_UNUSED
|
||||
#endif
|
||||
|
||||
// Retries the expression while it evaluates to error_result and errno
|
||||
// equals to EINTR.
|
||||
#ifndef _WIN32
|
||||
# define FMT_RETRY_VAL(result, expression, error_result) \
|
||||
do { \
|
||||
result = (expression); \
|
||||
} while (result == error_result && errno == EINTR)
|
||||
#else
|
||||
# define FMT_RETRY_VAL(result, expression, error_result) result = (expression)
|
||||
#endif
|
||||
|
||||
#define FMT_RETRY(result, expression) FMT_RETRY_VAL(result, expression, -1)
|
||||
|
||||
namespace fmt {
|
||||
|
||||
// An error code.
|
||||
class ErrorCode {
|
||||
private:
|
||||
int value_;
|
||||
|
||||
public:
|
||||
explicit ErrorCode(int value = 0) FMT_NOEXCEPT : value_(value) {}
|
||||
|
||||
int get() const FMT_NOEXCEPT { return value_; }
|
||||
};
|
||||
|
||||
// A buffered file.
|
||||
class BufferedFile {
|
||||
private:
|
||||
FILE *file_;
|
||||
|
||||
friend class File;
|
||||
|
||||
explicit BufferedFile(FILE *f) : file_(f) {}
|
||||
|
||||
public:
|
||||
// Constructs a BufferedFile object which doesn't represent any file.
|
||||
BufferedFile() FMT_NOEXCEPT : file_(0) {}
|
||||
|
||||
// Destroys the object closing the file it represents if any.
|
||||
~BufferedFile() FMT_NOEXCEPT;
|
||||
|
||||
#if !FMT_USE_RVALUE_REFERENCES
|
||||
// Emulate a move constructor and a move assignment operator if rvalue
|
||||
// references are not supported.
|
||||
|
||||
private:
|
||||
// A proxy object to emulate a move constructor.
|
||||
// It is private to make it impossible call operator Proxy directly.
|
||||
struct Proxy {
|
||||
FILE *file;
|
||||
};
|
||||
|
||||
public:
|
||||
// A "move constructor" for moving from a temporary.
|
||||
BufferedFile(Proxy p) FMT_NOEXCEPT : file_(p.file) {}
|
||||
|
||||
// A "move constructor" for for moving from an lvalue.
|
||||
BufferedFile(BufferedFile &f) FMT_NOEXCEPT : file_(f.file_) {
|
||||
f.file_ = 0;
|
||||
}
|
||||
|
||||
// A "move assignment operator" for moving from a temporary.
|
||||
BufferedFile &operator=(Proxy p) {
|
||||
close();
|
||||
file_ = p.file;
|
||||
return *this;
|
||||
}
|
||||
|
||||
// A "move assignment operator" for moving from an lvalue.
|
||||
BufferedFile &operator=(BufferedFile &other) {
|
||||
close();
|
||||
file_ = other.file_;
|
||||
other.file_ = 0;
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Returns a proxy object for moving from a temporary:
|
||||
// BufferedFile file = BufferedFile(...);
|
||||
operator Proxy() FMT_NOEXCEPT {
|
||||
Proxy p = {file_};
|
||||
file_ = 0;
|
||||
return p;
|
||||
}
|
||||
|
||||
#else
|
||||
private:
|
||||
FMT_DISALLOW_COPY_AND_ASSIGN(BufferedFile);
|
||||
|
||||
public:
|
||||
BufferedFile(BufferedFile &&other) FMT_NOEXCEPT : file_(other.file_) {
|
||||
other.file_ = 0;
|
||||
}
|
||||
|
||||
BufferedFile& operator=(BufferedFile &&other) {
|
||||
close();
|
||||
file_ = other.file_;
|
||||
other.file_ = 0;
|
||||
return *this;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Opens a file.
|
||||
BufferedFile(CStringRef filename, CStringRef mode);
|
||||
|
||||
// Closes the file.
|
||||
void close();
|
||||
|
||||
// Returns the pointer to a FILE object representing this file.
|
||||
FILE *get() const FMT_NOEXCEPT { return file_; }
|
||||
|
||||
// We place parentheses around fileno to workaround a bug in some versions
|
||||
// of MinGW that define fileno as a macro.
|
||||
int (fileno)() const;
|
||||
|
||||
void print(CStringRef format_str, const ArgList &args) {
|
||||
fmt::print(file_, format_str, args);
|
||||
}
|
||||
FMT_VARIADIC(void, print, CStringRef)
|
||||
};
|
||||
|
||||
// A file. Closed file is represented by a File object with descriptor -1.
|
||||
// Methods that are not declared with FMT_NOEXCEPT may throw
|
||||
// fmt::SystemError in case of failure. Note that some errors such as
|
||||
// closing the file multiple times will cause a crash on Windows rather
|
||||
// than an exception. You can get standard behavior by overriding the
|
||||
// invalid parameter handler with _set_invalid_parameter_handler.
|
||||
class File {
|
||||
private:
|
||||
int fd_; // File descriptor.
|
||||
|
||||
// Constructs a File object with a given descriptor.
|
||||
explicit File(int fd) : fd_(fd) {}
|
||||
|
||||
public:
|
||||
// Possible values for the oflag argument to the constructor.
|
||||
enum {
|
||||
RDONLY = FMT_POSIX(O_RDONLY), // Open for reading only.
|
||||
WRONLY = FMT_POSIX(O_WRONLY), // Open for writing only.
|
||||
RDWR = FMT_POSIX(O_RDWR) // Open for reading and writing.
|
||||
};
|
||||
|
||||
// Constructs a File object which doesn't represent any file.
|
||||
File() FMT_NOEXCEPT : fd_(-1) {}
|
||||
|
||||
// Opens a file and constructs a File object representing this file.
|
||||
File(CStringRef path, int oflag);
|
||||
|
||||
#if !FMT_USE_RVALUE_REFERENCES
|
||||
// Emulate a move constructor and a move assignment operator if rvalue
|
||||
// references are not supported.
|
||||
|
||||
private:
|
||||
// A proxy object to emulate a move constructor.
|
||||
// It is private to make it impossible call operator Proxy directly.
|
||||
struct Proxy {
|
||||
int fd;
|
||||
};
|
||||
|
||||
public:
|
||||
// A "move constructor" for moving from a temporary.
|
||||
File(Proxy p) FMT_NOEXCEPT : fd_(p.fd) {}
|
||||
|
||||
// A "move constructor" for for moving from an lvalue.
|
||||
File(File &other) FMT_NOEXCEPT : fd_(other.fd_) {
|
||||
other.fd_ = -1;
|
||||
}
|
||||
|
||||
// A "move assignment operator" for moving from a temporary.
|
||||
File &operator=(Proxy p) {
|
||||
close();
|
||||
fd_ = p.fd;
|
||||
return *this;
|
||||
}
|
||||
|
||||
// A "move assignment operator" for moving from an lvalue.
|
||||
File &operator=(File &other) {
|
||||
close();
|
||||
fd_ = other.fd_;
|
||||
other.fd_ = -1;
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Returns a proxy object for moving from a temporary:
|
||||
// File file = File(...);
|
||||
operator Proxy() FMT_NOEXCEPT {
|
||||
Proxy p = {fd_};
|
||||
fd_ = -1;
|
||||
return p;
|
||||
}
|
||||
|
||||
#else
|
||||
private:
|
||||
FMT_DISALLOW_COPY_AND_ASSIGN(File);
|
||||
|
||||
public:
|
||||
File(File &&other) FMT_NOEXCEPT : fd_(other.fd_) {
|
||||
other.fd_ = -1;
|
||||
}
|
||||
|
||||
File& operator=(File &&other) {
|
||||
close();
|
||||
fd_ = other.fd_;
|
||||
other.fd_ = -1;
|
||||
return *this;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Destroys the object closing the file it represents if any.
|
||||
~File() FMT_NOEXCEPT;
|
||||
|
||||
// Returns the file descriptor.
|
||||
int descriptor() const FMT_NOEXCEPT { return fd_; }
|
||||
|
||||
// Closes the file.
|
||||
void close();
|
||||
|
||||
// Returns the file size.
|
||||
LongLong size() const;
|
||||
|
||||
// Attempts to read count bytes from the file into the specified buffer.
|
||||
std::size_t read(void *buffer, std::size_t count);
|
||||
|
||||
// Attempts to write count bytes from the specified buffer to the file.
|
||||
std::size_t write(const void *buffer, std::size_t count);
|
||||
|
||||
// Duplicates a file descriptor with the dup function and returns
|
||||
// the duplicate as a file object.
|
||||
static File dup(int fd);
|
||||
|
||||
// Makes fd be the copy of this file descriptor, closing fd first if
|
||||
// necessary.
|
||||
void dup2(int fd);
|
||||
|
||||
// Makes fd be the copy of this file descriptor, closing fd first if
|
||||
// necessary.
|
||||
void dup2(int fd, ErrorCode &ec) FMT_NOEXCEPT;
|
||||
|
||||
// Creates a pipe setting up read_end and write_end file objects for reading
|
||||
// and writing respectively.
|
||||
static void pipe(File &read_end, File &write_end);
|
||||
|
||||
// Creates a BufferedFile object associated with this file and detaches
|
||||
// this File object from the file.
|
||||
BufferedFile fdopen(const char *mode);
|
||||
};
|
||||
|
||||
// Returns the memory page size.
|
||||
long getpagesize();
|
||||
} // namespace fmt
|
||||
|
||||
#if !FMT_USE_RVALUE_REFERENCES
|
||||
namespace std {
|
||||
// For compatibility with C++98.
|
||||
inline fmt::BufferedFile &move(fmt::BufferedFile &f) { return f; }
|
||||
inline fmt::File &move(fmt::File &f) { return f; }
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // FMT_POSIX_H_
|
||||
23
dep/process/License.txt
Normal file
23
dep/process/License.txt
Normal file
@@ -0,0 +1,23 @@
|
||||
Boost Software License - Version 1.0 - August 17th, 2003
|
||||
|
||||
Permission is hereby granted, free of charge, to any person or organization
|
||||
obtaining a copy of the software and accompanying documentation covered by
|
||||
this license (the "Software") to use, reproduce, display, distribute,
|
||||
execute, and transmit the Software, and to prepare derivative works of the
|
||||
Software, and to permit third-parties to whom the Software is furnished to
|
||||
do so, all subject to the following:
|
||||
|
||||
The copyright notices in the Software and this entire statement, including
|
||||
the above license grant, this restriction and the following disclaimer,
|
||||
must be included in all copies of the Software, in whole or in part, and
|
||||
all derivative works of the Software, unless such copies or derivative
|
||||
works are solely in the form of machine-executable object code generated by
|
||||
a source language processor.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
6
dep/process/Readme.txt
Normal file
6
dep/process/Readme.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
Boost.Process (Not part of the official boost libraries yet)
|
||||
================================================================
|
||||
Its used to start child processes within the application.
|
||||
|
||||
Website: http://www.highscore.de/boost/process0.5/
|
||||
Downloaded from: http://www.highscore.de/boost/process0.5/process.zip
|
||||
22
dep/process/boost/process.hpp
Normal file
22
dep/process/boost/process.hpp
Normal file
@@ -0,0 +1,22 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011 Jeff Flinn, Boris Schaeling
|
||||
// Copyright (c) 2012 Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
/**
|
||||
* \file boost/process.hpp
|
||||
*
|
||||
* Convenience header which includes all public Boost.Process header files.
|
||||
*/
|
||||
|
||||
#ifndef BOOST_PROCESS_HPP
|
||||
#define BOOST_PROCESS_HPP
|
||||
|
||||
#include <boost/process/all.hpp>
|
||||
|
||||
#endif
|
||||
30
dep/process/boost/process/all.hpp
Normal file
30
dep/process/boost/process/all.hpp
Normal file
@@ -0,0 +1,30 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
/**
|
||||
* \file boost/process/all.hpp
|
||||
*
|
||||
* Convenience header which includes all public Boost.Process header files.
|
||||
*/
|
||||
|
||||
#ifndef BOOST_PROCESS_ALL_HPP
|
||||
#define BOOST_PROCESS_ALL_HPP
|
||||
|
||||
#include <boost/process/child.hpp>
|
||||
#include <boost/process/create_pipe.hpp>
|
||||
#include <boost/process/execute.hpp>
|
||||
#include <boost/process/executor.hpp>
|
||||
#include <boost/process/initializers.hpp>
|
||||
#include <boost/process/pipe.hpp>
|
||||
#include <boost/process/search_path.hpp>
|
||||
#include <boost/process/shell_path.hpp>
|
||||
#include <boost/process/terminate.hpp>
|
||||
#include <boost/process/wait_for_exit.hpp>
|
||||
|
||||
#endif
|
||||
74
dep/process/boost/process/child.hpp
Normal file
74
dep/process/boost/process/child.hpp
Normal file
@@ -0,0 +1,74 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
/**
|
||||
* \file boost/process/child.hpp
|
||||
*
|
||||
* Defines a child process class.
|
||||
*/
|
||||
|
||||
#ifndef BOOST_PROCESS_CHILD_HPP
|
||||
#define BOOST_PROCESS_CHILD_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
|
||||
#include BOOST_PROCESS_PLATFORM_PROMOTE_PATH(child)
|
||||
BOOST_PROCESS_PLATFORM_PROMOTE_NAMESPACE(child)
|
||||
|
||||
#if defined(BOOST_PROCESS_DOXYGEN)
|
||||
namespace boost { namespace process {
|
||||
|
||||
/**
|
||||
* Represents a child process.
|
||||
*
|
||||
* On Windows child is movable but non-copyable. The destructor
|
||||
* automatically closes handles to the child process.
|
||||
*/
|
||||
struct child
|
||||
{
|
||||
/**
|
||||
* Process information.
|
||||
*
|
||||
* \remark <em>Windows only.</em>
|
||||
*/
|
||||
PROCESS_INFORMATION proc_info;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* \remark <em>Windows only.<em/>
|
||||
*/
|
||||
explicit child(const PROCESS_INFORMATION &pi) : proc_info(pi) {}
|
||||
|
||||
/**
|
||||
* Returns the process handle.
|
||||
*
|
||||
* \remark <em>Windows only.</em>
|
||||
*/
|
||||
HANDLE process_handle() const { return proc_info.hProcess; }
|
||||
|
||||
/**
|
||||
* Process identifier.
|
||||
*
|
||||
* \remark <em>POSIX only.</em>
|
||||
*/
|
||||
pid_t pid;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* \remark <em>POSIX only.</em>
|
||||
*/
|
||||
explicit child(pid_t p) : pid(p) {}
|
||||
};
|
||||
|
||||
}}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
82
dep/process/boost/process/config.hpp
Normal file
82
dep/process/boost/process/config.hpp
Normal file
@@ -0,0 +1,82 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
/**
|
||||
* \file boost/process/config.hpp
|
||||
*
|
||||
* Defines various macros.
|
||||
*/
|
||||
|
||||
#ifndef BOOST_PROCESS_CONFIG_HPP
|
||||
#define BOOST_PROCESS_CONFIG_HPP
|
||||
|
||||
#include <boost/config.hpp>
|
||||
#include <boost/system/config.hpp>
|
||||
#include <boost/system/error_code.hpp>
|
||||
#include <boost/system/system_error.hpp>
|
||||
|
||||
#if defined(BOOST_POSIX_API)
|
||||
# include <errno.h>
|
||||
# define BOOST_PROCESS_LAST_ERROR errno
|
||||
# define BOOST_PROCESS_PLATFORM posix
|
||||
#elif defined(BOOST_WINDOWS_API)
|
||||
# include <Windows.h>
|
||||
# define BOOST_PROCESS_LAST_ERROR GetLastError()
|
||||
# define BOOST_PROCESS_PLATFORM windows
|
||||
#endif
|
||||
|
||||
/** \cond */
|
||||
#define BOOST_PROCESS_PLATFORM_PROMOTE_PATH(COMPONENT) \
|
||||
<boost/process/BOOST_PROCESS_PLATFORM/COMPONENT.hpp>
|
||||
#define BOOST_PROCESS_PLATFORM_PROMOTE_NAMESPACE(COMPONENT) \
|
||||
namespace boost { namespace process { using BOOST_PROCESS_PLATFORM::COMPONENT; }}
|
||||
#define BOOST_PROCESS_PLATFORM_PROMOTE_INITIALIZERS_NAMESPACE \
|
||||
namespace boost { namespace process { namespace initializers { \
|
||||
using namespace boost::process::BOOST_PROCESS_PLATFORM::initializers; }}}
|
||||
/** \endcond */
|
||||
|
||||
#if defined(BOOST_PROCESS_DOXYGEN)
|
||||
/**
|
||||
* \def BOOST_POSIX_API
|
||||
*
|
||||
* This macro is defined on POSIX.
|
||||
*/
|
||||
#define BOOST_POSIX_API
|
||||
/**
|
||||
* \def BOOST_WINDOWS_API
|
||||
*
|
||||
* This macro is defined on Windows.
|
||||
*/
|
||||
#define BOOST_WINDOWS_API
|
||||
#endif
|
||||
|
||||
/**
|
||||
* \def BOOST_PROCESS_THROW(EX)
|
||||
*
|
||||
* Defines how exceptions are thrown. Set this macro for example
|
||||
* to \c BOOST_THROW_EXCEPTION if you like to use Boost.Exception.
|
||||
*/
|
||||
#define BOOST_PROCESS_THROW(EX) throw EX
|
||||
|
||||
/** \cond */
|
||||
#define BOOST_PROCESS_SOURCE_LOCATION \
|
||||
"in file '" __FILE__ "', line " BOOST_STRINGIZE(__LINE__) ": "
|
||||
|
||||
#define BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR(what) \
|
||||
BOOST_PROCESS_THROW(boost::system::system_error( \
|
||||
boost::system::error_code(BOOST_PROCESS_LAST_ERROR, \
|
||||
boost::system::system_category()), \
|
||||
BOOST_PROCESS_SOURCE_LOCATION what))
|
||||
|
||||
#define BOOST_PROCESS_RETURN_LAST_SYSTEM_ERROR(ec) \
|
||||
ec = boost::system::error_code(BOOST_PROCESS_LAST_ERROR, \
|
||||
boost::system::system_category())
|
||||
/** \endcond */
|
||||
|
||||
#endif
|
||||
48
dep/process/boost/process/create_pipe.hpp
Normal file
48
dep/process/boost/process/create_pipe.hpp
Normal file
@@ -0,0 +1,48 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
/**
|
||||
* \file boost/process/create_pipe.hpp
|
||||
*
|
||||
* Defines a function to create a pipe.
|
||||
*/
|
||||
|
||||
#ifndef BOOST_PROCESS_CREATE_PIPE_HPP
|
||||
#define BOOST_PROCESS_CREATE_PIPE_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
|
||||
#include BOOST_PROCESS_PLATFORM_PROMOTE_PATH(create_pipe)
|
||||
BOOST_PROCESS_PLATFORM_PROMOTE_NAMESPACE(create_pipe)
|
||||
|
||||
#if defined(BOOST_PROCESS_DOXYGEN)
|
||||
namespace boost { namespace process {
|
||||
|
||||
/**
|
||||
* Creates an anonymous pipe.
|
||||
*
|
||||
* \note On Windows anonymous pipes don't support
|
||||
* asynchronous I/O.
|
||||
*
|
||||
* \throws boost::system::system_error in case of an error
|
||||
*/
|
||||
pipe create_pipe();
|
||||
|
||||
/**
|
||||
* Creates an anonymous pipe.
|
||||
*
|
||||
* \note On Windows anonymous pipes don't support
|
||||
* asynchronous I/O.
|
||||
*/
|
||||
pipe create_pipe(boost::system::error_code &ec);
|
||||
|
||||
}}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
38
dep/process/boost/process/execute.hpp
Normal file
38
dep/process/boost/process/execute.hpp
Normal file
@@ -0,0 +1,38 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
/**
|
||||
* \file boost/process/execute.hpp
|
||||
*
|
||||
* Defines a function to execute a program.
|
||||
*/
|
||||
|
||||
#ifndef BOOST_PROCESS_EXECUTE_HPP
|
||||
#define BOOST_PROCESS_EXECUTE_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
|
||||
#include BOOST_PROCESS_PLATFORM_PROMOTE_PATH(execute)
|
||||
BOOST_PROCESS_PLATFORM_PROMOTE_NAMESPACE(execute)
|
||||
|
||||
#if defined(BOOST_PROCESS_DOXYGEN)
|
||||
namespace boost { namespace process {
|
||||
|
||||
/**
|
||||
* Starts a program.
|
||||
*
|
||||
* \tparam initializers define what and how the program is started
|
||||
*/
|
||||
template <class Initializer, class... Initializers>
|
||||
child execute(const Initializer &initializer, const Initializers... &initializers);
|
||||
|
||||
}}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
176
dep/process/boost/process/executor.hpp
Normal file
176
dep/process/boost/process/executor.hpp
Normal file
@@ -0,0 +1,176 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
/**
|
||||
* \file boost/process/executor.hpp
|
||||
*
|
||||
* Defines an executor which can create child processes.
|
||||
*/
|
||||
|
||||
#ifndef BOOST_PROCESS_EXECUTOR_HPP
|
||||
#define BOOST_PROCESS_EXECUTOR_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
|
||||
#include BOOST_PROCESS_PLATFORM_PROMOTE_PATH(executor)
|
||||
BOOST_PROCESS_PLATFORM_PROMOTE_NAMESPACE(executor)
|
||||
|
||||
#if defined(BOOST_PROCESS_DOXYGEN)
|
||||
namespace boost { namespace process {
|
||||
|
||||
/**
|
||||
* Starts a program.
|
||||
*
|
||||
* boost::process::executor is a functor which calls the system functions
|
||||
* to start a program. Before system functions are called it iterates
|
||||
* over initializers and calls a member function passing a reference
|
||||
* to itself as a parameter. Initializers get then a chance to setup
|
||||
* the executor. If system functions fail boost::process::executor again
|
||||
* iterates over initializers and calls another member function passing a
|
||||
* reference to itself as a parameter. This gives initializers a
|
||||
* chance to handle the error.
|
||||
*
|
||||
* \note Library users shouldn't need to use boost::process::executor.
|
||||
* It is recommended to call boost::process::execute which uses
|
||||
* boost::pocess::executor internally.
|
||||
*/
|
||||
struct executor
|
||||
{
|
||||
/**
|
||||
* Default constructor.
|
||||
*/
|
||||
executor();
|
||||
|
||||
/**
|
||||
* Starts a program.
|
||||
*
|
||||
* \tparam initializers define what and how the program is started
|
||||
*/
|
||||
template <class Initializer, class... Initializers>
|
||||
child operator()(const Initializer &initializer, const Initializers... &initializers);
|
||||
|
||||
///\defgroup WindowsOnly Windows only.
|
||||
///@{
|
||||
|
||||
/**
|
||||
* Program name.
|
||||
*
|
||||
* \remark <em>Windows only.</em>
|
||||
*/
|
||||
LPCTSTR exe;
|
||||
|
||||
/**
|
||||
* Command line.
|
||||
*
|
||||
* \remark <em>Windows only.</em>
|
||||
*/
|
||||
LPTSTR cmd_line;
|
||||
|
||||
/**
|
||||
* Process attributes.
|
||||
*
|
||||
* \remark <em>Windows only.</em>
|
||||
*/
|
||||
LPSECURITY_ATTRIBUTES proc_attrs;
|
||||
|
||||
/**
|
||||
* Thread attributes.
|
||||
*
|
||||
* \remark <em>Windows only.</em>
|
||||
*/
|
||||
LPSECURITY_ATTRIBUTES thread_attrs;
|
||||
|
||||
/**
|
||||
* Flag to inherit handles.
|
||||
*
|
||||
* \remark <em>Windows only.</em>
|
||||
*/
|
||||
BOOL inherit_handles;
|
||||
|
||||
/**
|
||||
* Creation flags.
|
||||
*
|
||||
* \remark <em>Windows only.</em>
|
||||
*/
|
||||
DWORD creation_flags;
|
||||
|
||||
/**
|
||||
* Environment variables.
|
||||
*
|
||||
* \remark <em>Windows only.</em>
|
||||
*/
|
||||
LPVOID env;
|
||||
|
||||
/**
|
||||
* Work directory.
|
||||
*
|
||||
* \remark <em>Windows only.</em>
|
||||
*/
|
||||
LPCTSTR work_dir;
|
||||
|
||||
/**
|
||||
* Startupinfo structure.
|
||||
*
|
||||
* \remark <em>Windows only.</em>
|
||||
*/
|
||||
STARTUPINFO startup_info;
|
||||
|
||||
/**
|
||||
* Startupinfoex structure.
|
||||
*
|
||||
* If this member variable is available, \c startup_info is a reference
|
||||
* to \c StartupInfo in STARTUPINFOEX.
|
||||
*
|
||||
* \remark <em>Windows Vista, Windows Server 2008 or better.</em>
|
||||
*/
|
||||
STARTUPINFOEX startup_info_ex;
|
||||
|
||||
/**
|
||||
* Process information.
|
||||
*
|
||||
* \c proc_info contains the result after a child process
|
||||
* could be started successfully.
|
||||
*
|
||||
* \remark <em>Windows only.</em>
|
||||
*/
|
||||
PROCESS_INFORMATION proc_info;
|
||||
|
||||
///@}
|
||||
|
||||
///\defgroup POSIXOnly POSIX only.
|
||||
///@{
|
||||
|
||||
/**
|
||||
* Program name.
|
||||
*
|
||||
* \remark <em>POSIX only.</em>
|
||||
*/
|
||||
const char *exe;
|
||||
|
||||
/**
|
||||
* Command line arguments.
|
||||
*
|
||||
* \remark <em>POSIX only.</em>
|
||||
*/
|
||||
char **cmd_line;
|
||||
|
||||
/**
|
||||
* Environment variables.
|
||||
*
|
||||
* \remark <em>POSIX only.</em>
|
||||
*/
|
||||
char **env;
|
||||
|
||||
///@}
|
||||
};
|
||||
|
||||
}}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
497
dep/process/boost/process/initializers.hpp
Normal file
497
dep/process/boost/process/initializers.hpp
Normal file
@@ -0,0 +1,497 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
/**
|
||||
* \file boost/process/initializers.hpp
|
||||
*
|
||||
* Defines initializers.
|
||||
*/
|
||||
|
||||
#ifndef BOOST_PROCESS_INITIALIZERS_HPP
|
||||
#define BOOST_PROCESS_INITIALIZERS_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
|
||||
#include BOOST_PROCESS_PLATFORM_PROMOTE_PATH(initializers)
|
||||
BOOST_PROCESS_PLATFORM_PROMOTE_INITIALIZERS_NAMESPACE
|
||||
|
||||
#if defined(BOOST_PROCESS_DOXYGEN)
|
||||
namespace boost { namespace process { namespace initializers {
|
||||
|
||||
/**
|
||||
* Binds the standard error stream.
|
||||
*/
|
||||
class bind_stderr : public initializer_base
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
explicit bind_stderr(const boost::iostreams::file_descriptor_sink &sink);
|
||||
};
|
||||
|
||||
/**
|
||||
* Binds the standard input stream.
|
||||
*/
|
||||
class bind_stdin : public initializer_base
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
explicit bind_stdin(const boost::iostreams::file_descriptor_source &source);
|
||||
};
|
||||
|
||||
/**
|
||||
* Binds the standard output stream.
|
||||
*/
|
||||
class bind_stdout : public initializer_base
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
explicit bind_stdout(const boost::iostreams::file_descriptor_sink &sink);
|
||||
};
|
||||
|
||||
/**
|
||||
* Binds a file descriptor.
|
||||
*
|
||||
* \remark <em>POSIX only.</em>
|
||||
*/
|
||||
class bind_fd : public initializer_base
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
bind_fd(int id, const boost::iostreams::file_descriptor &fd);
|
||||
};
|
||||
|
||||
/**
|
||||
* Closes a file descriptor.
|
||||
*
|
||||
* \remark <em>POSIX only.</em>
|
||||
*/
|
||||
class close_fd : public initializer_base
|
||||
{
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
explicit close_fd(int fd);
|
||||
};
|
||||
|
||||
/**
|
||||
* Closes file descriptors.
|
||||
*
|
||||
* \remark <em>POSIX only.</em>
|
||||
*/
|
||||
class close_fds : public initializer_base
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* \c range_type must be an <tt>int</tt>-range.
|
||||
*/
|
||||
explicit close_fds(const range_type &fds);
|
||||
};
|
||||
|
||||
/**
|
||||
* Closes all file descriptors a predicate returns
|
||||
* true for.
|
||||
*
|
||||
* This initializer doesn't close file descriptors
|
||||
* immediately. Instead it sets the \c FD_CLOEXEC
|
||||
* flag. File descriptors are closed when \c execve
|
||||
* is called and the call succeeds.
|
||||
*
|
||||
* \remark <em>POSIX only.</em>
|
||||
*/
|
||||
class close_fds_if : public initializer_base
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* \c predicate_type must be a function or functor with
|
||||
* this signature: <tt>bool(int)</tt>
|
||||
*/
|
||||
explicit close_fds_if(const predicate_type &pred);
|
||||
};
|
||||
|
||||
/**
|
||||
* Closes the standard error stream.
|
||||
*/
|
||||
class close_stderr : public initializer_base
|
||||
{
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
close_stderr();
|
||||
};
|
||||
|
||||
/**
|
||||
* Closes the standard input stream.
|
||||
*/
|
||||
class close_stdin : public initializer_base
|
||||
{
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
close_stdin();
|
||||
};
|
||||
|
||||
/**
|
||||
* Closes the standard output stream.
|
||||
*/
|
||||
class close_stdout : public initializer_base
|
||||
{
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
close_stdout();
|
||||
};
|
||||
|
||||
/**
|
||||
* Hides the console.
|
||||
*/
|
||||
class hide_console : public initializer_base
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
hide_console();
|
||||
};
|
||||
|
||||
/**
|
||||
* Inherits environment variables.
|
||||
*/
|
||||
class inherit_env : public initializer_base
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
inherit_env();
|
||||
};
|
||||
|
||||
/**
|
||||
* Notifies an I/O service object of fork-related events.
|
||||
*
|
||||
* \see boost::asio::io_service::notify_fork
|
||||
*
|
||||
* \remark <em>POSIX only.</em>
|
||||
*/
|
||||
class notify_io_service : public initializer_base
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
explicit notify_io_service(boost::asio::io_service &io_service);
|
||||
};
|
||||
|
||||
/**
|
||||
* Generic initializer to execute any code if \c execve
|
||||
* failed.
|
||||
*
|
||||
* \remark <em>POSIX only.</em>
|
||||
*/
|
||||
class on_exec_error : public initializer_base
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* \c handler_type must be a function or functor with
|
||||
* this signature: <tt>void(executor&)</tt>
|
||||
*/
|
||||
explicit on_exec_error(handler_type handler);
|
||||
};
|
||||
|
||||
/**
|
||||
* Generic initializer to execute any code before \c execve
|
||||
* is called.
|
||||
*
|
||||
* \remark <em>POSIX only.</em>
|
||||
*/
|
||||
class on_exec_setup : public initializer_base
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* \c handler_type must be a function or functor with
|
||||
* this signature: <tt>void(executor&)</tt>
|
||||
*/
|
||||
explicit on_exec_setup(handler_type handler);
|
||||
};
|
||||
|
||||
/**
|
||||
* Generic initializer to execute any code if \c fork
|
||||
* failed.
|
||||
*
|
||||
* \remark <em>POSIX only.</em>
|
||||
*/
|
||||
class on_fork_error : public initializer_base
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* \c handler_type must be a function or functor with
|
||||
* this signature: <tt>void(executor&)</tt>
|
||||
*/
|
||||
explicit on_fork_error(handler_type handler);
|
||||
};
|
||||
|
||||
/**
|
||||
* Generic initializer to execute any code before \c fork
|
||||
* is called.
|
||||
*
|
||||
* \remark <em>POSIX only.</em>
|
||||
*/
|
||||
class on_fork_setup : public initializer_base
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* \c handler_type must be a function or functor with
|
||||
* this signature: <tt>void(executor&)</tt>
|
||||
*/
|
||||
explicit on_fork_setup(handler_type handler);
|
||||
};
|
||||
|
||||
/**
|
||||
* Generic initializer to execute any code in the parent
|
||||
* process after \c fork has been called successfully.
|
||||
*
|
||||
* \remark <em>POSIX only.</em>
|
||||
*/
|
||||
class on_fork_success : public initializer_base
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* \c handler_type must be a function or functor with
|
||||
* this signature: <tt>void(executor&)</tt>
|
||||
*/
|
||||
explicit on_fork_success(handler_type handler);
|
||||
};
|
||||
|
||||
/**
|
||||
* Generic initializer to execute any code if \c CreateProcess
|
||||
* failed.
|
||||
*
|
||||
* \remark <em>Windows only.</em>
|
||||
*/
|
||||
class on_CreateProcess_error : public initializer_base
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* \c handler_type must be a function or functor with
|
||||
* this signature: <tt>void(executor&)</tt>
|
||||
*/
|
||||
explicit on_CreateProcess_error(handler_type handler);
|
||||
};
|
||||
|
||||
/**
|
||||
* Generic initializer to execute any code before \c CreateProcess
|
||||
* is called.
|
||||
*
|
||||
* \remark <em>Windows only.</em>
|
||||
*/
|
||||
class on_CreateProcess_setup : public initializer_base
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* \c handler_type must be a function or functor with
|
||||
* this signature: <tt>void(executor&)</tt>
|
||||
*/
|
||||
explicit on_CreateProcess_setup(handler_type handler);
|
||||
};
|
||||
|
||||
/**
|
||||
* Generic initializer to execute any code after \c CreateProcess
|
||||
* has been called successfully.
|
||||
*
|
||||
* \remark <em>Windows only.</em>
|
||||
*/
|
||||
class on_CreateProcess_success : public initializer_base
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* \c handler_type must be a function or functor with
|
||||
* this signature: <tt>void(executor&)</tt>
|
||||
*/
|
||||
explicit on_CreateProcess_success(handler_type handler);
|
||||
};
|
||||
|
||||
/**
|
||||
* Specifies the executable to start.
|
||||
*
|
||||
* This initializer must always be used. The only exception is
|
||||
* if you use \c set_args or a generic initializer which
|
||||
* specifies the executable.
|
||||
*/
|
||||
class run_exe : public initializer_base
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* On Windows \c string_type must be <tt>const char*</tt>,
|
||||
* <tt>std::string</tt> or <tt>boost::filesystem::path</tt>.
|
||||
* If Unicode is used, \c string_type must be
|
||||
* <tt>const wchar_t*</tt>, <tt>std::wstring</tt> or
|
||||
* <tt>boost::filesystem::path</tt>.
|
||||
*
|
||||
* On POSIX \c string_type must be <tt>const char*</tt>,
|
||||
* <tt>std::string</tt> or <tt>boost::filesystem::path</tt>.
|
||||
*/
|
||||
explicit run_exe(const string_type &s);
|
||||
};
|
||||
|
||||
/**
|
||||
* Sets the command line arguments.
|
||||
*
|
||||
* The first argument specifies the executable to start unless
|
||||
* \c run_exe is used.
|
||||
*
|
||||
* Use \c set_cmd_line if you don't want to pass a collection of
|
||||
* command line arguments but set the command line as one string.
|
||||
*/
|
||||
class set_args : public initializer_base
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* On Windows \c range_type must be a <tt>std::string</tt>-range.
|
||||
* If Unicode is used, \c range_type must be a
|
||||
* <tt>std::wstring</tt>-range.
|
||||
*
|
||||
* On POSIX \c range_type must be a <tt>std::string</tt>-range.
|
||||
*/
|
||||
explicit set_args(const range_type &r);
|
||||
};
|
||||
|
||||
/**
|
||||
* Sets the command line.
|
||||
*
|
||||
* Use \c set_args if you don't want to set the command line as
|
||||
* one string but pass a collection of command line arguments.
|
||||
*/
|
||||
class set_cmd_line : public initializer_base
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* On Windows \c string_type must be <tt>const char*</tt>,
|
||||
* <tt>std::string</tt> or <tt>boost::filesystem::path</tt>.
|
||||
* If Unicode is used, \c string_type must be
|
||||
* <tt>const wchar_t*</tt>, <tt>std::wstring</tt> or
|
||||
* <tt>boost::filesystem::path</tt>.
|
||||
*
|
||||
* On POSIX \c string_type must be <tt>const char*</tt>,
|
||||
* <tt>std::string</tt> or <tt>boost::filesystem::path</tt>.
|
||||
*/
|
||||
explicit set_cmd_line(const string_type &s);
|
||||
};
|
||||
|
||||
/**
|
||||
* Sets the environment.
|
||||
*/
|
||||
class set_env : public initializer_base
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* On Windows \c range_type must be a <tt>std::string</tt>-range.
|
||||
* If Unicode is used, \c range_type must be a
|
||||
* <tt>std::wstring</tt>-range.
|
||||
*
|
||||
* On POSIX \c range_type must be a <tt>std::string</tt>-range.
|
||||
*/
|
||||
explicit set_env(const range_type &r);
|
||||
};
|
||||
|
||||
/**
|
||||
* Sets an error if a child process can't be created.
|
||||
*/
|
||||
class set_on_error : public initializer_base
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
explicit set_on_error(boost::system::error_code &ec);
|
||||
};
|
||||
|
||||
/**
|
||||
* Sets the flag \c wShowWindow in \c STARTUPINFO.
|
||||
*
|
||||
* \remark <em>Windows only.</em>
|
||||
*/
|
||||
class show_window : public initializer_base
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
explicit show_window(WORD flags);
|
||||
};
|
||||
|
||||
/**
|
||||
* Sets the work directory.
|
||||
*/
|
||||
class start_in_dir : public initializer_base
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* On Windows \c string_type must be <tt>const char*</tt>,
|
||||
* <tt>std::string</tt> or <tt>boost::filesystem::path</tt>.
|
||||
* If Unicode is used, \c string_type must be
|
||||
* <tt>const wchar_t*</tt>, <tt>std::wstring</tt> or
|
||||
* <tt>boost::filesystem::path</tt>.
|
||||
*
|
||||
* On POSIX \c string_type must be <tt>const char*</tt>,
|
||||
* <tt>std::string</tt> or <tt>boost::filesystem::path</tt>.
|
||||
*/
|
||||
explicit start_in_dir(const string_type &s);
|
||||
};
|
||||
|
||||
/**
|
||||
* Throws an error if a child process can't be created.
|
||||
*
|
||||
* The type of the error thrown is \c boost::system::system_error.
|
||||
*/
|
||||
class throw_on_error : public initializer_base
|
||||
{
|
||||
public:
|
||||
};
|
||||
|
||||
}}}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
104
dep/process/boost/process/mitigate.hpp
Normal file
104
dep/process/boost/process/mitigate.hpp
Normal file
@@ -0,0 +1,104 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
/**
|
||||
* \file boost/process/mitigate.hpp
|
||||
*
|
||||
* Helpers to mitigate platform differences.
|
||||
*/
|
||||
|
||||
#ifndef BOOST_PROCESS_MITIGATE_HPP
|
||||
#define BOOST_PROCESS_MITIGATE_HPP
|
||||
|
||||
#include <boost/asio.hpp>
|
||||
#if defined(BOOST_POSIX_API)
|
||||
# include <sys/wait.h>
|
||||
#endif
|
||||
|
||||
namespace boost { namespace process {
|
||||
|
||||
#if defined(BOOST_WINDOWS_API)
|
||||
typedef boost::asio::windows::stream_handle pipe_end;
|
||||
#elif defined(BOOST_POSIX_API)
|
||||
typedef boost::asio::posix::stream_descriptor pipe_end;
|
||||
#endif
|
||||
|
||||
inline const char *zero_device()
|
||||
{
|
||||
#if defined(BOOST_WINDOWS_API)
|
||||
return "NUL";
|
||||
#elif defined(BOOST_POSIX_API)
|
||||
return "/dev/zero";
|
||||
#endif
|
||||
}
|
||||
|
||||
inline const char *null_device()
|
||||
{
|
||||
#if defined(BOOST_WINDOWS_API)
|
||||
return "NUL";
|
||||
#elif defined(BOOST_POSIX_API)
|
||||
return "/dev/null";
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(BOOST_WINDOWS_API)
|
||||
# define BOOST_PROCESS_EXITSTATUS(a) static_cast<int>(a)
|
||||
#elif defined(BOOST_POSIX_API)
|
||||
# define BOOST_PROCESS_EXITSTATUS WEXITSTATUS
|
||||
#endif
|
||||
|
||||
#if defined(BOOST_PROCESS_DOXYGEN)
|
||||
/**
|
||||
* Type definition for the end of a pipe.
|
||||
*
|
||||
* On Windows the type is based on boost::asio::windows::stream_handle. On
|
||||
* POSIX it is based on boost::asio::posix::stream_descriptor.
|
||||
*
|
||||
* You can use this type definition for asynchronous I/O with streams of
|
||||
* child processes.
|
||||
*/
|
||||
typedef boost_asio_type pipe_end;
|
||||
|
||||
/**
|
||||
* Gets the name of the zero device.
|
||||
*
|
||||
* You can use zero_device to initialize a
|
||||
* boost::iostreams::file_descriptor_source to read
|
||||
* null characters from.
|
||||
*
|
||||
* \returns NUL on Windows and /dev/zero on POSIX.
|
||||
*/
|
||||
const char *zero_device();
|
||||
|
||||
/**
|
||||
* Gets the name of the null device.
|
||||
*
|
||||
* You can use null_device to initialize a
|
||||
* boost::iostreams::file_descriptor_sink which discards
|
||||
* data written to it.
|
||||
*
|
||||
* \returns NUL on Windows and /dev/null on POSIX.
|
||||
*/
|
||||
const char *null_device();
|
||||
|
||||
/**
|
||||
* \def BOOST_PROCESS_EXITSTATUS
|
||||
*
|
||||
* On Windows \c BOOST_PROCESS_EXITSTATUS is a static cast to \c int.
|
||||
* On POSIX it is set to \c WEXITSTATUS.
|
||||
*
|
||||
* You can use \c BOOST_PROCESS_EXITSTATUS for the return value of
|
||||
* boost::process::wait_for_exit to get the exit status of a process.
|
||||
*/
|
||||
#define BOOST_PROCESS_EXITSTATUS
|
||||
#endif
|
||||
|
||||
}}
|
||||
|
||||
#endif
|
||||
64
dep/process/boost/process/pipe.hpp
Normal file
64
dep/process/boost/process/pipe.hpp
Normal file
@@ -0,0 +1,64 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
/**
|
||||
* \file boost/process/pipe.hpp
|
||||
*
|
||||
* Defines a pipe.
|
||||
*/
|
||||
|
||||
#ifndef BOOST_PROCESS_PIPE_HPP
|
||||
#define BOOST_PROCESS_PIPE_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
|
||||
#include BOOST_PROCESS_PLATFORM_PROMOTE_PATH(pipe)
|
||||
BOOST_PROCESS_PLATFORM_PROMOTE_NAMESPACE(pipe)
|
||||
BOOST_PROCESS_PLATFORM_PROMOTE_NAMESPACE(make_pipe)
|
||||
|
||||
#if defined(BOOST_PROCESS_DOXYGEN)
|
||||
namespace boost { namespace process {
|
||||
|
||||
/**
|
||||
* Represents a pipe.
|
||||
*/
|
||||
struct pipe
|
||||
{
|
||||
/**
|
||||
* Read-end.
|
||||
*/
|
||||
pipe_end_type source;
|
||||
|
||||
/**
|
||||
* Write-end.
|
||||
*/
|
||||
pipe_end_type sink;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
pipe(pipe_end_type source, pipe_end_type sink);
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns a pipe instance.
|
||||
*
|
||||
* This is a helper function to instantiate boost::process::pipe.
|
||||
*
|
||||
* \note boost::process::make_pipe does not create a pipe.
|
||||
* You must pass existing pipe ends to this function.
|
||||
* If you want to create an anonymous pipe, call
|
||||
* boost::process::create_pipe.
|
||||
*/
|
||||
pipe make_pipe(pipe_end_type source, pipe_end_type sink);
|
||||
|
||||
}}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
26
dep/process/boost/process/posix/child.hpp
Normal file
26
dep/process/boost/process/posix/child.hpp
Normal file
@@ -0,0 +1,26 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_CHILD_HPP
|
||||
#define BOOST_PROCESS_POSIX_CHILD_HPP
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
namespace boost { namespace process { namespace posix {
|
||||
|
||||
struct child
|
||||
{
|
||||
pid_t pid;
|
||||
|
||||
explicit child(pid_t p) : pid(p) {}
|
||||
};
|
||||
|
||||
}}}
|
||||
|
||||
#endif
|
||||
40
dep/process/boost/process/posix/create_pipe.hpp
Normal file
40
dep/process/boost/process/posix/create_pipe.hpp
Normal file
@@ -0,0 +1,40 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_CREATE_PIPE_HPP
|
||||
#define BOOST_PROCESS_POSIX_CREATE_PIPE_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
#include <boost/process/posix/pipe.hpp>
|
||||
#include <boost/system/error_code.hpp>
|
||||
#include <unistd.h>
|
||||
|
||||
namespace boost { namespace process { namespace posix {
|
||||
|
||||
inline pipe create_pipe()
|
||||
{
|
||||
int fds[2];
|
||||
if (::pipe(fds) == -1)
|
||||
BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("pipe(2) failed");
|
||||
return pipe(fds[0], fds[1]);
|
||||
}
|
||||
|
||||
inline pipe create_pipe(boost::system::error_code &ec)
|
||||
{
|
||||
int fds[2];
|
||||
if (::pipe(fds) == -1)
|
||||
BOOST_PROCESS_RETURN_LAST_SYSTEM_ERROR(ec);
|
||||
else
|
||||
ec.clear();
|
||||
return pipe(fds[0], fds[1]);
|
||||
}
|
||||
|
||||
}}}
|
||||
|
||||
#endif
|
||||
82
dep/process/boost/process/posix/execute.hpp
Normal file
82
dep/process/boost/process/posix/execute.hpp
Normal file
@@ -0,0 +1,82 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_EXECUTE_HPP
|
||||
#define BOOST_PROCESS_POSIX_EXECUTE_HPP
|
||||
|
||||
#include <boost/process/posix/executor.hpp>
|
||||
#include <boost/process/posix/child.hpp>
|
||||
#include <boost/fusion/tuple/make_tuple.hpp>
|
||||
#include <boost/ref.hpp>
|
||||
|
||||
namespace boost { namespace process { namespace posix {
|
||||
|
||||
template <class I0>
|
||||
child execute(const I0 &i0)
|
||||
{
|
||||
return executor()(boost::fusion::make_tuple(boost::cref(i0)));
|
||||
}
|
||||
|
||||
template <class I0, class I1>
|
||||
child execute(const I0 &i0, const I1 &i1)
|
||||
{
|
||||
return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1)));
|
||||
}
|
||||
|
||||
template <class I0, class I1, class I2>
|
||||
child execute(const I0 &i0, const I1 &i1, const I2 &i2)
|
||||
{
|
||||
return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2)));
|
||||
}
|
||||
|
||||
template <class I0, class I1, class I2, class I3>
|
||||
child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3)
|
||||
{
|
||||
return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3)));
|
||||
}
|
||||
|
||||
template <class I0, class I1, class I2, class I3, class I4>
|
||||
child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4)
|
||||
{
|
||||
return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4)));
|
||||
}
|
||||
|
||||
template <class I0, class I1, class I2, class I3, class I4, class I5>
|
||||
child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5)
|
||||
{
|
||||
return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5)));
|
||||
}
|
||||
|
||||
template <class I0, class I1, class I2, class I3, class I4, class I5, class I6>
|
||||
child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5, const I6 &i6)
|
||||
{
|
||||
return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5), boost::cref(i6)));
|
||||
}
|
||||
|
||||
template <class I0, class I1, class I2, class I3, class I4, class I5, class I6, class I7>
|
||||
child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5, const I6 &i6, const I7 &i7)
|
||||
{
|
||||
return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5), boost::cref(i6), boost::cref(i7)));
|
||||
}
|
||||
|
||||
template <class I0, class I1, class I2, class I3, class I4, class I5, class I6, class I7, class I8>
|
||||
child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5, const I6 &i6, const I7 &i7, const I8 &i8)
|
||||
{
|
||||
return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5), boost::cref(i6), boost::cref(i7), boost::cref(i8)));
|
||||
}
|
||||
|
||||
template <class I0, class I1, class I2, class I3, class I4, class I5, class I6, class I7, class I8, class I9>
|
||||
child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5, const I6 &i6, const I7 &i7, const I8 &i8, const I9 &i9)
|
||||
{
|
||||
return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5), boost::cref(i6), boost::cref(i7), boost::cref(i8), boost::cref(i9)));
|
||||
}
|
||||
|
||||
}}}
|
||||
|
||||
#endif
|
||||
120
dep/process/boost/process/posix/executor.hpp
Normal file
120
dep/process/boost/process/posix/executor.hpp
Normal file
@@ -0,0 +1,120 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_EXECUTOR_HPP
|
||||
#define BOOST_PROCESS_POSIX_EXECUTOR_HPP
|
||||
|
||||
#include <boost/process/posix/child.hpp>
|
||||
#include <boost/fusion/algorithm/iteration/for_each.hpp>
|
||||
#include <cstdlib>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
||||
namespace boost { namespace process { namespace posix {
|
||||
|
||||
struct executor
|
||||
{
|
||||
executor() : exe(0), cmd_line(0), env(0) {}
|
||||
|
||||
struct call_on_fork_setup
|
||||
{
|
||||
executor &e_;
|
||||
|
||||
call_on_fork_setup(executor &e) : e_(e) {}
|
||||
|
||||
template <class Arg>
|
||||
void operator()(const Arg &arg) const
|
||||
{
|
||||
arg.on_fork_setup(e_);
|
||||
}
|
||||
};
|
||||
|
||||
struct call_on_fork_error
|
||||
{
|
||||
executor &e_;
|
||||
|
||||
call_on_fork_error(executor &e) : e_(e) {}
|
||||
|
||||
template <class Arg>
|
||||
void operator()(Arg &arg) const
|
||||
{
|
||||
arg.on_fork_error(e_);
|
||||
}
|
||||
};
|
||||
|
||||
struct call_on_fork_success
|
||||
{
|
||||
executor &e_;
|
||||
|
||||
call_on_fork_success(executor &e) : e_(e) {}
|
||||
|
||||
template <class Arg>
|
||||
void operator()(Arg &arg) const
|
||||
{
|
||||
arg.on_fork_success(e_);
|
||||
}
|
||||
};
|
||||
|
||||
struct call_on_exec_setup
|
||||
{
|
||||
executor &e_;
|
||||
|
||||
call_on_exec_setup(executor &e) : e_(e) {}
|
||||
|
||||
template <class Arg>
|
||||
void operator()(Arg &arg) const
|
||||
{
|
||||
arg.on_exec_setup(e_);
|
||||
}
|
||||
};
|
||||
|
||||
struct call_on_exec_error
|
||||
{
|
||||
executor &e_;
|
||||
|
||||
call_on_exec_error(executor &e) : e_(e) {}
|
||||
|
||||
template <class Arg>
|
||||
void operator()(Arg &arg) const
|
||||
{
|
||||
arg.on_exec_error(e_);
|
||||
}
|
||||
};
|
||||
|
||||
template <class InitializerSequence>
|
||||
child operator()(const InitializerSequence &seq)
|
||||
{
|
||||
boost::fusion::for_each(seq, call_on_fork_setup(*this));
|
||||
|
||||
pid_t pid = ::fork();
|
||||
if (pid == -1)
|
||||
{
|
||||
boost::fusion::for_each(seq, call_on_fork_error(*this));
|
||||
}
|
||||
else if (pid == 0)
|
||||
{
|
||||
boost::fusion::for_each(seq, call_on_exec_setup(*this));
|
||||
::execve(exe, cmd_line, env);
|
||||
boost::fusion::for_each(seq, call_on_exec_error(*this));
|
||||
_exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
boost::fusion::for_each(seq, call_on_fork_success(*this));
|
||||
|
||||
return child(pid);
|
||||
}
|
||||
|
||||
const char *exe;
|
||||
char **cmd_line;
|
||||
char **env;
|
||||
};
|
||||
|
||||
}}}
|
||||
|
||||
#endif
|
||||
39
dep/process/boost/process/posix/initializers.hpp
Normal file
39
dep/process/boost/process/posix/initializers.hpp
Normal file
@@ -0,0 +1,39 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_HPP
|
||||
#define BOOST_PROCESS_POSIX_INITIALIZERS_HPP
|
||||
|
||||
#include <boost/process/posix/initializers/bind_fd.hpp>
|
||||
#include <boost/process/posix/initializers/bind_stderr.hpp>
|
||||
#include <boost/process/posix/initializers/bind_stdin.hpp>
|
||||
#include <boost/process/posix/initializers/bind_stdout.hpp>
|
||||
#include <boost/process/posix/initializers/close_fd.hpp>
|
||||
#include <boost/process/posix/initializers/close_fds.hpp>
|
||||
#include <boost/process/posix/initializers/close_fds_if.hpp>
|
||||
#include <boost/process/posix/initializers/close_stderr.hpp>
|
||||
#include <boost/process/posix/initializers/close_stdin.hpp>
|
||||
#include <boost/process/posix/initializers/close_stdout.hpp>
|
||||
#include <boost/process/posix/initializers/hide_console.hpp>
|
||||
#include <boost/process/posix/initializers/inherit_env.hpp>
|
||||
#include <boost/process/posix/initializers/notify_io_service.hpp>
|
||||
#include <boost/process/posix/initializers/on_exec_error.hpp>
|
||||
#include <boost/process/posix/initializers/on_exec_setup.hpp>
|
||||
#include <boost/process/posix/initializers/on_fork_error.hpp>
|
||||
#include <boost/process/posix/initializers/on_fork_setup.hpp>
|
||||
#include <boost/process/posix/initializers/on_fork_success.hpp>
|
||||
#include <boost/process/posix/initializers/run_exe.hpp>
|
||||
#include <boost/process/posix/initializers/set_args.hpp>
|
||||
#include <boost/process/posix/initializers/set_cmd_line.hpp>
|
||||
#include <boost/process/posix/initializers/set_env.hpp>
|
||||
#include <boost/process/posix/initializers/set_on_error.hpp>
|
||||
#include <boost/process/posix/initializers/start_in_dir.hpp>
|
||||
#include <boost/process/posix/initializers/throw_on_error.hpp>
|
||||
|
||||
#endif
|
||||
43
dep/process/boost/process/posix/initializers/bind_fd.hpp
Normal file
43
dep/process/boost/process/posix/initializers/bind_fd.hpp
Normal file
@@ -0,0 +1,43 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_BIND_FD_HPP
|
||||
#define BOOST_PROCESS_POSIX_INITIALIZERS_BIND_FD_HPP
|
||||
|
||||
#include <boost/process/posix/initializers/initializer_base.hpp>
|
||||
#include <unistd.h>
|
||||
|
||||
namespace boost { namespace process { namespace posix { namespace initializers {
|
||||
|
||||
template <class FileDescriptor>
|
||||
class bind_fd_ : public initializer_base
|
||||
{
|
||||
public:
|
||||
bind_fd_(int id, const FileDescriptor &fd) : id_(id), fd_(fd) {}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_exec_setup(PosixExecutor&) const
|
||||
{
|
||||
::dup2(fd_.handle(), id_);
|
||||
}
|
||||
|
||||
private:
|
||||
int id_;
|
||||
FileDescriptor fd_;
|
||||
};
|
||||
|
||||
template <class FileDescriptor>
|
||||
bind_fd_<FileDescriptor> bind_fd(int id, const FileDescriptor &fd)
|
||||
{
|
||||
return bind_fd_<FileDescriptor>(id, fd);
|
||||
}
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
37
dep/process/boost/process/posix/initializers/bind_stderr.hpp
Normal file
37
dep/process/boost/process/posix/initializers/bind_stderr.hpp
Normal file
@@ -0,0 +1,37 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_BIND_STDERR_HPP
|
||||
#define BOOST_PROCESS_POSIX_INITIALIZERS_BIND_STDERR_HPP
|
||||
|
||||
#include <boost/process/posix/initializers/initializer_base.hpp>
|
||||
#include <boost/iostreams/device/file_descriptor.hpp>
|
||||
#include <unistd.h>
|
||||
|
||||
namespace boost { namespace process { namespace posix { namespace initializers {
|
||||
|
||||
class bind_stderr : public initializer_base
|
||||
{
|
||||
public:
|
||||
explicit bind_stderr(const boost::iostreams::file_descriptor_sink &sink)
|
||||
: sink_(sink) {}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_exec_setup(PosixExecutor&) const
|
||||
{
|
||||
::dup2(sink_.handle(), STDERR_FILENO);
|
||||
}
|
||||
|
||||
private:
|
||||
boost::iostreams::file_descriptor_sink sink_;
|
||||
};
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
37
dep/process/boost/process/posix/initializers/bind_stdin.hpp
Normal file
37
dep/process/boost/process/posix/initializers/bind_stdin.hpp
Normal file
@@ -0,0 +1,37 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_BIND_STDIN_HPP
|
||||
#define BOOST_PROCESS_POSIX_INITIALIZERS_BIND_STDIN_HPP
|
||||
|
||||
#include <boost/process/posix/initializers/initializer_base.hpp>
|
||||
#include <boost/iostreams/device/file_descriptor.hpp>
|
||||
#include <unistd.h>
|
||||
|
||||
namespace boost { namespace process { namespace posix { namespace initializers {
|
||||
|
||||
class bind_stdin : public initializer_base
|
||||
{
|
||||
public:
|
||||
explicit bind_stdin(const boost::iostreams::file_descriptor_source &source)
|
||||
: source_(source) {}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_exec_setup(PosixExecutor&) const
|
||||
{
|
||||
::dup2(source_.handle(), STDIN_FILENO);
|
||||
}
|
||||
|
||||
private:
|
||||
boost::iostreams::file_descriptor_source source_;
|
||||
};
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
37
dep/process/boost/process/posix/initializers/bind_stdout.hpp
Normal file
37
dep/process/boost/process/posix/initializers/bind_stdout.hpp
Normal file
@@ -0,0 +1,37 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_BIND_STDOUT_HPP
|
||||
#define BOOST_PROCESS_POSIX_INITIALIZERS_BIND_STDOUT_HPP
|
||||
|
||||
#include <boost/process/posix/initializers/initializer_base.hpp>
|
||||
#include <boost/iostreams/device/file_descriptor.hpp>
|
||||
#include <unistd.h>
|
||||
|
||||
namespace boost { namespace process { namespace posix { namespace initializers {
|
||||
|
||||
class bind_stdout : public initializer_base
|
||||
{
|
||||
public:
|
||||
explicit bind_stdout(const boost::iostreams::file_descriptor_sink &sink)
|
||||
: sink_(sink) {}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_exec_setup(PosixExecutor&) const
|
||||
{
|
||||
::dup2(sink_.handle(), STDOUT_FILENO);
|
||||
}
|
||||
|
||||
private:
|
||||
boost::iostreams::file_descriptor_sink sink_;
|
||||
};
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
35
dep/process/boost/process/posix/initializers/close_fd.hpp
Normal file
35
dep/process/boost/process/posix/initializers/close_fd.hpp
Normal file
@@ -0,0 +1,35 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_CLOSE_FD_HPP
|
||||
#define BOOST_PROCESS_POSIX_INITIALIZERS_CLOSE_FD_HPP
|
||||
|
||||
#include <boost/process/posix/initializers/initializer_base.hpp>
|
||||
#include <unistd.h>
|
||||
|
||||
namespace boost { namespace process { namespace posix { namespace initializers {
|
||||
|
||||
class close_fd : public initializer_base
|
||||
{
|
||||
public:
|
||||
explicit close_fd(int fd) : fd_(fd) {}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_exec_setup(PosixExecutor&) const
|
||||
{
|
||||
::close(fd_);
|
||||
}
|
||||
|
||||
private:
|
||||
int fd_;
|
||||
};
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
43
dep/process/boost/process/posix/initializers/close_fds.hpp
Normal file
43
dep/process/boost/process/posix/initializers/close_fds.hpp
Normal file
@@ -0,0 +1,43 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_CLOSE_FDS_HPP
|
||||
#define BOOST_PROCESS_POSIX_INITIALIZERS_CLOSE_FDS_HPP
|
||||
|
||||
#include <boost/process/posix/initializers/initializer_base.hpp>
|
||||
#include <boost/range/algorithm/for_each.hpp>
|
||||
#include <unistd.h>
|
||||
|
||||
namespace boost { namespace process { namespace posix { namespace initializers {
|
||||
|
||||
template <class Range>
|
||||
class close_fds_ : public initializer_base
|
||||
{
|
||||
public:
|
||||
explicit close_fds_(const Range &fds) : fds_(fds) {}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_exec_setup(PosixExecutor&) const
|
||||
{
|
||||
boost::for_each(fds_, ::close);
|
||||
}
|
||||
|
||||
private:
|
||||
Range fds_;
|
||||
};
|
||||
|
||||
template <class Range>
|
||||
close_fds_<Range> close_fds(const Range &fds)
|
||||
{
|
||||
return close_fds_<Range>(fds);
|
||||
}
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,80 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_CLOSE_FDS_IF_HPP
|
||||
#define BOOST_PROCESS_POSIX_INITIALIZERS_CLOSE_FDS_IF_HPP
|
||||
|
||||
#include <boost/process/posix/initializers/initializer_base.hpp>
|
||||
#include <boost/iterator/counting_iterator.hpp>
|
||||
#include <boost/range/counting_range.hpp>
|
||||
#include <boost/range/adaptor/filtered.hpp>
|
||||
#include <boost/range/algorithm/for_each.hpp>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_MAX_FD
|
||||
# define BOOST_PROCESS_POSIX_MAX_FD 32
|
||||
#endif
|
||||
|
||||
namespace boost { namespace process { namespace posix { namespace initializers {
|
||||
|
||||
template <class Predicate>
|
||||
class close_fds_if_ : public initializer_base
|
||||
{
|
||||
private:
|
||||
static void close(int fd)
|
||||
{
|
||||
::fcntl(fd, F_SETFD, FD_CLOEXEC);
|
||||
}
|
||||
|
||||
public:
|
||||
explicit close_fds_if_(const Predicate &pred) : pred_(pred) {}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_exec_setup(PosixExecutor&) const
|
||||
{
|
||||
boost::for_each(
|
||||
boost::adaptors::filter(
|
||||
boost::counting_range(0, upper_bound()),
|
||||
pred_
|
||||
),
|
||||
close
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
static int upper_bound()
|
||||
{
|
||||
int up;
|
||||
#if defined(F_MAXFD)
|
||||
do
|
||||
{
|
||||
up = ::fcntl(0, F_MAXFD);
|
||||
} while (up == -1 && errno == EINTR);
|
||||
if (up == -1)
|
||||
#endif
|
||||
up = ::sysconf(_SC_OPEN_MAX);
|
||||
if (up == -1)
|
||||
up = BOOST_PROCESS_POSIX_MAX_FD;
|
||||
return up;
|
||||
}
|
||||
|
||||
Predicate pred_;
|
||||
};
|
||||
|
||||
template <class Predicate>
|
||||
close_fds_if_<Predicate> close_fds_if(const Predicate &pred)
|
||||
{
|
||||
return close_fds_if_<Predicate>(pred);
|
||||
}
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,30 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_CLOSE_STDERR_HPP
|
||||
#define BOOST_PROCESS_POSIX_INITIALIZERS_CLOSE_STDERR_HPP
|
||||
|
||||
#include <boost/process/posix/initializers/initializer_base.hpp>
|
||||
#include <unistd.h>
|
||||
|
||||
namespace boost { namespace process { namespace posix { namespace initializers {
|
||||
|
||||
class close_stderr : public initializer_base
|
||||
{
|
||||
public:
|
||||
template <class PosixExecutor>
|
||||
void on_exec_setup(PosixExecutor&) const
|
||||
{
|
||||
::close(STDERR_FILENO);
|
||||
}
|
||||
};
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
30
dep/process/boost/process/posix/initializers/close_stdin.hpp
Normal file
30
dep/process/boost/process/posix/initializers/close_stdin.hpp
Normal file
@@ -0,0 +1,30 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_CLOSE_STDIN_HPP
|
||||
#define BOOST_PROCESS_POSIX_INITIALIZERS_CLOSE_STDIN_HPP
|
||||
|
||||
#include <boost/process/posix/initializers/initializer_base.hpp>
|
||||
#include <unistd.h>
|
||||
|
||||
namespace boost { namespace process { namespace posix { namespace initializers {
|
||||
|
||||
class close_stdin : public initializer_base
|
||||
{
|
||||
public:
|
||||
template <class PosixExecutor>
|
||||
void on_exec_setup(PosixExecutor&) const
|
||||
{
|
||||
::close(STDIN_FILENO);
|
||||
}
|
||||
};
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,30 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_CLOSE_STDOUT_HPP
|
||||
#define BOOST_PROCESS_POSIX_INITIALIZERS_CLOSE_STDOUT_HPP
|
||||
|
||||
#include <boost/process/posix/initializers/initializer_base.hpp>
|
||||
#include <unistd.h>
|
||||
|
||||
namespace boost { namespace process { namespace posix { namespace initializers {
|
||||
|
||||
class close_stdout : public initializer_base
|
||||
{
|
||||
public:
|
||||
template <class PosixExecutor>
|
||||
void on_exec_setup(PosixExecutor&) const
|
||||
{
|
||||
::close(STDOUT_FILENO);
|
||||
}
|
||||
};
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,24 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_HIDE_CONSOLE_HPP
|
||||
#define BOOST_PROCESS_POSIX_INITIALIZERS_HIDE_CONSOLE_HPP
|
||||
|
||||
#include <boost/process/posix/initializers/initializer_base.hpp>
|
||||
|
||||
namespace boost { namespace process { namespace posix { namespace initializers {
|
||||
|
||||
class hide_console : public initializer_base
|
||||
{
|
||||
public:
|
||||
};
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
36
dep/process/boost/process/posix/initializers/inherit_env.hpp
Normal file
36
dep/process/boost/process/posix/initializers/inherit_env.hpp
Normal file
@@ -0,0 +1,36 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_INHERIT_ENV_HPP
|
||||
#define BOOST_PROCESS_POSIX_INITIALIZERS_INHERIT_ENV_HPP
|
||||
|
||||
#include <boost/process/posix/initializers/initializer_base.hpp>
|
||||
// From <https://svn.boost.org/trac/boost/changeset/67768>
|
||||
#if defined(__APPLE__) && defined(__DYNAMIC__)
|
||||
extern "C" { extern char ***_NSGetEnviron(void); }
|
||||
# define environ (*_NSGetEnviron())
|
||||
#else
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
namespace boost { namespace process { namespace posix { namespace initializers {
|
||||
|
||||
class inherit_env : public initializer_base
|
||||
{
|
||||
public:
|
||||
template <class PosixExecutor>
|
||||
void on_fork_setup(PosixExecutor &e) const
|
||||
{
|
||||
e.env = environ;
|
||||
}
|
||||
};
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,35 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_INITIALIZER_BASE_HPP
|
||||
#define BOOST_PROCESS_POSIX_INITIALIZERS_INITIALIZER_BASE_HPP
|
||||
|
||||
namespace boost { namespace process { namespace posix { namespace initializers {
|
||||
|
||||
struct initializer_base
|
||||
{
|
||||
template <class PosixExecutor>
|
||||
void on_fork_setup(PosixExecutor&) const {}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_fork_error(PosixExecutor&) const {}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_fork_success(PosixExecutor&) const {}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_exec_setup(PosixExecutor&) const {}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_exec_error(PosixExecutor&) const {}
|
||||
};
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,55 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_NOTIFY_IO_SERVICE_HPP
|
||||
#define BOOST_PROCESS_POSIX_INITIALIZERS_NOTIFY_IO_SERVICE_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
#include <boost/process/posix/initializers/initializer_base.hpp>
|
||||
|
||||
namespace boost { namespace process { namespace posix { namespace initializers {
|
||||
|
||||
template <class IOService>
|
||||
class notify_io_service_ : public initializer_base
|
||||
{
|
||||
public:
|
||||
explicit notify_io_service_(IOService &io_service) :
|
||||
io_service_(io_service) {}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_fork_setup(PosixExecutor&) const
|
||||
{
|
||||
io_service_.notify_fork(IOService::fork_prepare);
|
||||
}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_fork_success(PosixExecutor&) const
|
||||
{
|
||||
io_service_.notify_fork(IOService::fork_parent);
|
||||
}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_exec_setup(PosixExecutor&) const
|
||||
{
|
||||
io_service_.notify_fork(IOService::fork_child);
|
||||
}
|
||||
|
||||
private:
|
||||
IOService &io_service_;
|
||||
};
|
||||
|
||||
template <class IOService>
|
||||
notify_io_service_<IOService> notify_io_service(IOService &io_service)
|
||||
{
|
||||
return notify_io_service_<IOService>(io_service);
|
||||
}
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,42 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_ON_EXEC_ERROR_HPP
|
||||
#define BOOST_PROCESS_POSIX_INITIALIZERS_ON_EXEC_ERROR_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
#include <boost/process/posix/initializers/initializer_base.hpp>
|
||||
|
||||
namespace boost { namespace process { namespace posix { namespace initializers {
|
||||
|
||||
template <class Handler>
|
||||
class on_exec_error_ : public initializer_base
|
||||
{
|
||||
public:
|
||||
explicit on_exec_error_(Handler handler) : handler_(handler) {}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_exec_error(PosixExecutor &e) const
|
||||
{
|
||||
handler_(e);
|
||||
}
|
||||
|
||||
private:
|
||||
Handler handler_;
|
||||
};
|
||||
|
||||
template <class Handler>
|
||||
on_exec_error_<Handler> on_exec_error(Handler handler)
|
||||
{
|
||||
return on_exec_error_<Handler>(handler);
|
||||
}
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,42 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_ON_EXEC_SETUP_HPP
|
||||
#define BOOST_PROCESS_POSIX_INITIALIZERS_ON_EXEC_SETUP_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
#include <boost/process/posix/initializers/initializer_base.hpp>
|
||||
|
||||
namespace boost { namespace process { namespace posix { namespace initializers {
|
||||
|
||||
template <class Handler>
|
||||
class on_exec_setup_ : public initializer_base
|
||||
{
|
||||
public:
|
||||
explicit on_exec_setup_(Handler handler) : handler_(handler) {}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_exec_setup(PosixExecutor &e) const
|
||||
{
|
||||
handler_(e);
|
||||
}
|
||||
|
||||
private:
|
||||
Handler handler_;
|
||||
};
|
||||
|
||||
template <class Handler>
|
||||
on_exec_setup_<Handler> on_exec_setup(Handler handler)
|
||||
{
|
||||
return on_exec_setup_<Handler>(handler);
|
||||
}
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,42 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_ON_FORK_ERROR_HPP
|
||||
#define BOOST_PROCESS_POSIX_INITIALIZERS_ON_FORK_ERROR_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
#include <boost/process/posix/initializers/initializer_base.hpp>
|
||||
|
||||
namespace boost { namespace process { namespace posix { namespace initializers {
|
||||
|
||||
template <class Handler>
|
||||
class on_fork_error_ : public initializer_base
|
||||
{
|
||||
public:
|
||||
explicit on_fork_error_(Handler handler) : handler_(handler) {}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_fork_error(PosixExecutor &e) const
|
||||
{
|
||||
handler_(e);
|
||||
}
|
||||
|
||||
private:
|
||||
Handler handler_;
|
||||
};
|
||||
|
||||
template <class Handler>
|
||||
on_fork_error_<Handler> on_fork_error(Handler handler)
|
||||
{
|
||||
return on_fork_error_<Handler>(handler);
|
||||
}
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,42 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_ON_FORK_SETUP_HPP
|
||||
#define BOOST_PROCESS_POSIX_INITIALIZERS_ON_FORK_SETUP_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
#include <boost/process/posix/initializers/initializer_base.hpp>
|
||||
|
||||
namespace boost { namespace process { namespace posix { namespace initializers {
|
||||
|
||||
template <class Handler>
|
||||
class on_fork_setup_ : public initializer_base
|
||||
{
|
||||
public:
|
||||
explicit on_fork_setup_(Handler handler) : handler_(handler) {}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_fork_setup(PosixExecutor &e) const
|
||||
{
|
||||
handler_(e);
|
||||
}
|
||||
|
||||
private:
|
||||
Handler handler_;
|
||||
};
|
||||
|
||||
template <class Handler>
|
||||
on_fork_setup_<Handler> on_fork_setup(Handler handler)
|
||||
{
|
||||
return on_fork_setup_<Handler>(handler);
|
||||
}
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,42 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_ON_FORK_SUCCESS_HPP
|
||||
#define BOOST_PROCESS_POSIX_INITIALIZERS_ON_FORK_SUCCESS_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
#include <boost/process/posix/initializers/initializer_base.hpp>
|
||||
|
||||
namespace boost { namespace process { namespace posix { namespace initializers {
|
||||
|
||||
template <class Handler>
|
||||
class on_fork_success_ : public initializer_base
|
||||
{
|
||||
public:
|
||||
explicit on_fork_success_(Handler handler) : handler_(handler) {}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_fork_success(PosixExecutor &e) const
|
||||
{
|
||||
handler_(e);
|
||||
}
|
||||
|
||||
private:
|
||||
Handler handler_;
|
||||
};
|
||||
|
||||
template <class Handler>
|
||||
on_fork_success_<Handler> on_fork_success(Handler handler)
|
||||
{
|
||||
return on_fork_success_<Handler>(handler);
|
||||
}
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
59
dep/process/boost/process/posix/initializers/run_exe.hpp
Normal file
59
dep/process/boost/process/posix/initializers/run_exe.hpp
Normal file
@@ -0,0 +1,59 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_RUN_EXE_HPP
|
||||
#define BOOST_PROCESS_POSIX_INITIALIZERS_RUN_EXE_HPP
|
||||
|
||||
#include <boost/process/posix/initializers/initializer_base.hpp>
|
||||
#include <boost/filesystem.hpp>
|
||||
#include <boost/shared_array.hpp>
|
||||
#include <string>
|
||||
|
||||
namespace boost { namespace process { namespace posix { namespace initializers {
|
||||
|
||||
class run_exe_ : public initializer_base
|
||||
{
|
||||
public:
|
||||
explicit run_exe_(const std::string &s) : s_(s), cmd_line_(new char*[2])
|
||||
{
|
||||
cmd_line_[0] = const_cast<char*>(s_.c_str());
|
||||
cmd_line_[1] = 0;
|
||||
}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_exec_setup(PosixExecutor &e) const
|
||||
{
|
||||
e.exe = s_.c_str();
|
||||
if (!e.cmd_line)
|
||||
e.cmd_line = cmd_line_.get();
|
||||
}
|
||||
|
||||
private:
|
||||
std::string s_;
|
||||
boost::shared_array<char*> cmd_line_;
|
||||
};
|
||||
|
||||
inline run_exe_ run_exe(const char *s)
|
||||
{
|
||||
return run_exe_(s);
|
||||
}
|
||||
|
||||
inline run_exe_ run_exe(const std::string &s)
|
||||
{
|
||||
return run_exe_(s);
|
||||
}
|
||||
|
||||
inline run_exe_ run_exe(const boost::filesystem::path &p)
|
||||
{
|
||||
return run_exe_(p.string());
|
||||
}
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
57
dep/process/boost/process/posix/initializers/set_args.hpp
Normal file
57
dep/process/boost/process/posix/initializers/set_args.hpp
Normal file
@@ -0,0 +1,57 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_SET_ARGS_HPP
|
||||
#define BOOST_PROCESS_POSIX_INITIALIZERS_SET_ARGS_HPP
|
||||
|
||||
#include <boost/process/posix/initializers/initializer_base.hpp>
|
||||
#include <boost/range/algorithm/transform.hpp>
|
||||
#include <boost/shared_array.hpp>
|
||||
#include <string>
|
||||
|
||||
namespace boost { namespace process { namespace posix { namespace initializers {
|
||||
|
||||
template <class Range>
|
||||
class set_args_ : public initializer_base
|
||||
{
|
||||
private:
|
||||
static char *c_str(const std::string &s)
|
||||
{
|
||||
return const_cast<char*>(s.c_str());
|
||||
}
|
||||
|
||||
public:
|
||||
explicit set_args_(const Range &args)
|
||||
{
|
||||
args_.reset(new char*[args.size() + 1]);
|
||||
boost::transform(args, args_.get(), c_str);
|
||||
args_[args.size()] = 0;
|
||||
}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_exec_setup(PosixExecutor &e) const
|
||||
{
|
||||
e.cmd_line = args_.get();
|
||||
if (!e.exe && *args_[0])
|
||||
e.exe = args_[0];
|
||||
}
|
||||
|
||||
private:
|
||||
boost::shared_array<char*> args_;
|
||||
};
|
||||
|
||||
template <class Range>
|
||||
set_args_<Range> set_args(const Range &range)
|
||||
{
|
||||
return set_args_<Range>(range);
|
||||
}
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,54 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_SET_CMD_LINE_HPP
|
||||
#define BOOST_PROCESS_POSIX_INITIALIZERS_SET_CMD_LINE_HPP
|
||||
|
||||
#include <boost/process/posix/initializers/initializer_base.hpp>
|
||||
#include <boost/tokenizer.hpp>
|
||||
#include <boost/shared_array.hpp>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace boost { namespace process { namespace posix { namespace initializers {
|
||||
|
||||
class set_cmd_line : public initializer_base
|
||||
{
|
||||
private:
|
||||
static char *c_str(const std::string &s)
|
||||
{
|
||||
return const_cast<char*>(s.c_str());
|
||||
}
|
||||
|
||||
public:
|
||||
explicit set_cmd_line(const std::string &s)
|
||||
{
|
||||
typedef boost::tokenizer<boost::escaped_list_separator<char> > tokenizer;
|
||||
boost::escaped_list_separator<char> sep('\\', ' ', '\"');
|
||||
tokenizer tok(s, sep);
|
||||
args_.assign(tok.begin(), tok.end());
|
||||
cmd_line_.reset(new char*[args_.size() + 1]);
|
||||
boost::transform(args_, cmd_line_.get(), c_str);
|
||||
cmd_line_[args_.size()] = 0;
|
||||
}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_exec_setup(PosixExecutor &e) const
|
||||
{
|
||||
e.cmd_line = cmd_line_.get();
|
||||
}
|
||||
|
||||
private:
|
||||
std::vector<std::string> args_;
|
||||
boost::shared_array<char*> cmd_line_;
|
||||
};
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
54
dep/process/boost/process/posix/initializers/set_env.hpp
Normal file
54
dep/process/boost/process/posix/initializers/set_env.hpp
Normal file
@@ -0,0 +1,54 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_SET_ENV_HPP
|
||||
#define BOOST_PROCESS_POSIX_INITIALIZERS_SET_ENV_HPP
|
||||
|
||||
#include <boost/process/posix/initializers/initializer_base.hpp>
|
||||
#include <boost/range/algorithm/transform.hpp>
|
||||
#include <boost/shared_array.hpp>
|
||||
#include <string>
|
||||
|
||||
namespace boost { namespace process { namespace posix { namespace initializers {
|
||||
|
||||
template <class Range>
|
||||
class set_env_ : public initializer_base
|
||||
{
|
||||
private:
|
||||
static char *get_ptr(const std::string &s)
|
||||
{
|
||||
return const_cast<char*>(s.c_str());
|
||||
}
|
||||
|
||||
public:
|
||||
explicit set_env_(const Range &envs) : env_(new char*[envs.size() + 1])
|
||||
{
|
||||
boost::transform(envs, env_.get(), get_ptr);
|
||||
env_[envs.size()] = 0;
|
||||
}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_fork_setup(PosixExecutor &e) const
|
||||
{
|
||||
e.env = env_.get();
|
||||
}
|
||||
|
||||
private:
|
||||
boost::shared_array<char*> env_;
|
||||
};
|
||||
|
||||
template <class Range>
|
||||
set_env_<Range> set_env(const Range &envs)
|
||||
{
|
||||
return set_env_<Range>(envs);
|
||||
}
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,95 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_SET_ON_ERROR_HPP
|
||||
#define BOOST_PROCESS_POSIX_INITIALIZERS_SET_ON_ERROR_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
#include <boost/process/posix/initializers/initializer_base.hpp>
|
||||
#include <boost/system/error_code.hpp>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
|
||||
namespace boost { namespace process { namespace posix { namespace initializers {
|
||||
|
||||
class set_on_error : public initializer_base
|
||||
{
|
||||
public:
|
||||
explicit set_on_error(boost::system::error_code &ec) : ec_(ec) {}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_fork_setup(PosixExecutor&) const
|
||||
{
|
||||
if (::pipe(fds_) == -1)
|
||||
BOOST_PROCESS_RETURN_LAST_SYSTEM_ERROR(ec_);
|
||||
if (::fcntl(fds_[1], F_SETFD, FD_CLOEXEC) == -1)
|
||||
{
|
||||
BOOST_PROCESS_RETURN_LAST_SYSTEM_ERROR(ec_);
|
||||
::close(fds_[0]);
|
||||
::close(fds_[1]);
|
||||
}
|
||||
}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_fork_error(PosixExecutor&) const
|
||||
{
|
||||
if (!ec_)
|
||||
{
|
||||
BOOST_PROCESS_RETURN_LAST_SYSTEM_ERROR(ec_);
|
||||
::close(fds_[0]);
|
||||
::close(fds_[1]);
|
||||
}
|
||||
}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_fork_success(PosixExecutor&) const
|
||||
{
|
||||
if (!ec_)
|
||||
{
|
||||
::close(fds_[1]);
|
||||
int code;
|
||||
if (::read(fds_[0], &code, sizeof(int)) > 0)
|
||||
{
|
||||
ec_ = boost::system::error_code(code,
|
||||
boost::system::system_category());
|
||||
}
|
||||
::close(fds_[0]);
|
||||
}
|
||||
}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_exec_setup(PosixExecutor&) const
|
||||
{
|
||||
if (!ec_)
|
||||
{
|
||||
::close(fds_[0]);
|
||||
}
|
||||
}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_exec_error(PosixExecutor&) const
|
||||
{
|
||||
if (!ec_)
|
||||
{
|
||||
int e = errno;
|
||||
while (::write(fds_[1], &e, sizeof(int)) == -1 && errno == EINTR)
|
||||
;
|
||||
::close(fds_[1]);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
boost::system::error_code &ec_;
|
||||
mutable int fds_[2];
|
||||
};
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,36 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_START_IN_DIR_HPP
|
||||
#define BOOST_PROCESS_POSIX_INITIALIZERS_START_IN_DIR_HPP
|
||||
|
||||
#include <boost/process/posix/initializers/initializer_base.hpp>
|
||||
#include <string>
|
||||
#include <unistd.h>
|
||||
|
||||
namespace boost { namespace process { namespace posix { namespace initializers {
|
||||
|
||||
class start_in_dir : public initializer_base
|
||||
{
|
||||
public:
|
||||
explicit start_in_dir(const std::string &s) : s_(s) {}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_exec_setup(PosixExecutor&) const
|
||||
{
|
||||
::chdir(s_.c_str());
|
||||
}
|
||||
|
||||
private:
|
||||
std::string s_;
|
||||
};
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,90 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_INITIALIZERS_THROW_ON_ERROR_HPP
|
||||
#define BOOST_PROCESS_POSIX_INITIALIZERS_THROW_ON_ERROR_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
#include <boost/process/posix/initializers/initializer_base.hpp>
|
||||
#include <boost/system/error_code.hpp>
|
||||
#include <boost/system/system_error.hpp>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
|
||||
namespace boost { namespace process { namespace posix { namespace initializers {
|
||||
|
||||
class throw_on_error : public initializer_base
|
||||
{
|
||||
public:
|
||||
template <class PosixExecutor>
|
||||
void on_fork_setup(PosixExecutor&) const
|
||||
{
|
||||
if (::pipe(fds_) == -1)
|
||||
BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("pipe(2) failed");
|
||||
if (::fcntl(fds_[1], F_SETFD, FD_CLOEXEC) == -1)
|
||||
{
|
||||
int e = errno;
|
||||
::close(fds_[0]);
|
||||
::close(fds_[1]);
|
||||
BOOST_PROCESS_THROW(boost::system::system_error(
|
||||
boost::system::error_code(e, boost::system::system_category()),
|
||||
BOOST_PROCESS_SOURCE_LOCATION "fcntl(2) failed"));
|
||||
}
|
||||
}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_fork_error(PosixExecutor&) const
|
||||
{
|
||||
int e = errno;
|
||||
::close(fds_[0]);
|
||||
::close(fds_[1]);
|
||||
BOOST_PROCESS_THROW(boost::system::system_error(
|
||||
boost::system::error_code(e, boost::system::system_category()),
|
||||
BOOST_PROCESS_SOURCE_LOCATION "fork(2) failed"));
|
||||
}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_fork_success(PosixExecutor&) const
|
||||
{
|
||||
::close(fds_[1]);
|
||||
int code;
|
||||
if (::read(fds_[0], &code, sizeof(int)) > 0)
|
||||
{
|
||||
::close(fds_[0]);
|
||||
BOOST_PROCESS_THROW(boost::system::system_error(
|
||||
boost::system::error_code(code,
|
||||
boost::system::system_category()),
|
||||
BOOST_PROCESS_SOURCE_LOCATION "execve(2) failed"));
|
||||
}
|
||||
::close(fds_[0]);
|
||||
}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_exec_setup(PosixExecutor&) const
|
||||
{
|
||||
::close(fds_[0]);
|
||||
}
|
||||
|
||||
template <class PosixExecutor>
|
||||
void on_exec_error(PosixExecutor&) const
|
||||
{
|
||||
int e = errno;
|
||||
while (::write(fds_[1], &e, sizeof(int)) == -1 && errno == EINTR)
|
||||
;
|
||||
::close(fds_[1]);
|
||||
}
|
||||
|
||||
private:
|
||||
mutable int fds_[2];
|
||||
};
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
30
dep/process/boost/process/posix/pipe.hpp
Normal file
30
dep/process/boost/process/posix/pipe.hpp
Normal file
@@ -0,0 +1,30 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_PIPE_HPP
|
||||
#define BOOST_PROCESS_POSIX_PIPE_HPP
|
||||
|
||||
namespace boost { namespace process { namespace posix {
|
||||
|
||||
struct pipe
|
||||
{
|
||||
int source;
|
||||
int sink;
|
||||
|
||||
pipe(int source, int sink) : source(source), sink(sink) {}
|
||||
};
|
||||
|
||||
inline pipe make_pipe(int source, int sink)
|
||||
{
|
||||
return pipe(source, sink);
|
||||
}
|
||||
|
||||
}}}
|
||||
|
||||
#endif
|
||||
53
dep/process/boost/process/posix/search_path.hpp
Normal file
53
dep/process/boost/process/posix/search_path.hpp
Normal file
@@ -0,0 +1,53 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_SEARCH_PATH_HPP
|
||||
#define BOOST_PROCESS_POSIX_SEARCH_PATH_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
#include <boost/filesystem.hpp>
|
||||
#include <boost/tokenizer.hpp>
|
||||
#include <string>
|
||||
#include <stdexcept>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
namespace boost { namespace process { namespace posix {
|
||||
|
||||
inline std::string search_path(const std::string &filename,
|
||||
std::string path = "")
|
||||
{
|
||||
if (path.empty())
|
||||
{
|
||||
path = ::getenv("PATH");
|
||||
if (path.empty())
|
||||
BOOST_PROCESS_THROW(std::runtime_error(
|
||||
"Environment variable PATH not found"));
|
||||
}
|
||||
|
||||
std::string result;
|
||||
typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
|
||||
boost::char_separator<char> sep(":");
|
||||
tokenizer tok(path, sep);
|
||||
for (tokenizer::iterator it = tok.begin(); it != tok.end(); ++it)
|
||||
{
|
||||
boost::filesystem::path p = *it;
|
||||
p /= filename;
|
||||
if (!::access(p.c_str(), X_OK))
|
||||
{
|
||||
result = p.string();
|
||||
break;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}}}
|
||||
|
||||
#endif
|
||||
32
dep/process/boost/process/posix/shell_path.hpp
Normal file
32
dep/process/boost/process/posix/shell_path.hpp
Normal file
@@ -0,0 +1,32 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_SHELL_PATH_HPP
|
||||
#define BOOST_PROCESS_POSIX_SHELL_PATH_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
#include <boost/system/error_code.hpp>
|
||||
#include <boost/filesystem/path.hpp>
|
||||
|
||||
namespace boost { namespace process { namespace posix {
|
||||
|
||||
inline boost::filesystem::path shell_path()
|
||||
{
|
||||
return "/bin/sh";
|
||||
}
|
||||
|
||||
inline boost::filesystem::path shell_path(boost::system::error_code &ec)
|
||||
{
|
||||
ec.clear();
|
||||
return "/bin/sh";
|
||||
}
|
||||
|
||||
}}}
|
||||
|
||||
#endif
|
||||
37
dep/process/boost/process/posix/terminate.hpp
Normal file
37
dep/process/boost/process/posix/terminate.hpp
Normal file
@@ -0,0 +1,37 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_TERMINATE_HPP
|
||||
#define BOOST_PROCESS_POSIX_TERMINATE_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
#include <boost/system/error_code.hpp>
|
||||
#include <signal.h>
|
||||
|
||||
namespace boost { namespace process { namespace posix {
|
||||
|
||||
template <class Process>
|
||||
void terminate(const Process &p)
|
||||
{
|
||||
if (::kill(p.pid, SIGKILL) == -1)
|
||||
BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("kill(2) failed");
|
||||
}
|
||||
|
||||
template <class Process>
|
||||
void terminate(const Process &p, boost::system::error_code &ec)
|
||||
{
|
||||
if (::kill(p.pid, SIGKILL) == -1)
|
||||
BOOST_PROCESS_RETURN_LAST_SYSTEM_ERROR(ec);
|
||||
else
|
||||
ec.clear();
|
||||
}
|
||||
|
||||
}}}
|
||||
|
||||
#endif
|
||||
52
dep/process/boost/process/posix/wait_for_exit.hpp
Normal file
52
dep/process/boost/process/posix/wait_for_exit.hpp
Normal file
@@ -0,0 +1,52 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_POSIX_WAIT_FOR_EXIT_HPP
|
||||
#define BOOST_PROCESS_POSIX_WAIT_FOR_EXIT_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
#include <boost/system/error_code.hpp>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
namespace boost { namespace process { namespace posix {
|
||||
|
||||
template <class Process>
|
||||
inline int wait_for_exit(const Process &p)
|
||||
{
|
||||
pid_t ret;
|
||||
int status;
|
||||
do
|
||||
{
|
||||
ret = ::waitpid(p.pid, &status, 0);
|
||||
} while ((ret == -1 && errno == EINTR) || (ret != -1 && !WIFEXITED(status)));
|
||||
if (ret == -1)
|
||||
BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("waitpid(2) failed");
|
||||
return status;
|
||||
}
|
||||
|
||||
template <class Process>
|
||||
inline int wait_for_exit(const Process &p, boost::system::error_code &ec)
|
||||
{
|
||||
pid_t ret;
|
||||
int status;
|
||||
do
|
||||
{
|
||||
ret = ::waitpid(p.pid, &status, 0);
|
||||
} while ((ret == -1 && errno == EINTR) || (ret != -1 && !WIFEXITED(status)));
|
||||
if (ret == -1)
|
||||
BOOST_PROCESS_RETURN_LAST_SYSTEM_ERROR(ec);
|
||||
else
|
||||
ec.clear();
|
||||
return status;
|
||||
}
|
||||
|
||||
}}}
|
||||
|
||||
#endif
|
||||
51
dep/process/boost/process/search_path.hpp
Normal file
51
dep/process/boost/process/search_path.hpp
Normal file
@@ -0,0 +1,51 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
/**
|
||||
* \file boost/process/search_path.hpp
|
||||
*
|
||||
* Defines a function to search for an executable in path.
|
||||
*/
|
||||
|
||||
#ifndef BOOST_PROCESS_SEARCH_PATH_HPP
|
||||
#define BOOST_PROCESS_SEARCH_PATH_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
|
||||
#include BOOST_PROCESS_PLATFORM_PROMOTE_PATH(search_path)
|
||||
BOOST_PROCESS_PLATFORM_PROMOTE_NAMESPACE(search_path)
|
||||
|
||||
#if defined(BOOST_PROCESS_DOXYGEN)
|
||||
namespace boost { namespace process {
|
||||
|
||||
/**
|
||||
* Searches for an executable in path.
|
||||
*
|
||||
* filename must be a basename including the file extension.
|
||||
* It must not include any directory separators (like a slash).
|
||||
* On Windows the file extension may be omitted. The function
|
||||
* will then try the various file extensions for executables on
|
||||
* Windows to find filename.
|
||||
*
|
||||
* path must be a set of directories. Directories must be
|
||||
* separated by colons on POSIX and by semicolons on Windows.
|
||||
* If path is empty, the environment variable PATH is used.
|
||||
*
|
||||
* \returns the absolute path to the executable filename or an
|
||||
* empty string if filename isn't found
|
||||
*
|
||||
* \throws std::runtime_error if path is empty and no environment
|
||||
* variable PATH exists
|
||||
*/
|
||||
string_type search_path(const string_type &filename, string_type path = "");
|
||||
|
||||
}}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
46
dep/process/boost/process/shell_path.hpp
Normal file
46
dep/process/boost/process/shell_path.hpp
Normal file
@@ -0,0 +1,46 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
/**
|
||||
* \file boost/process/shell_path.hpp
|
||||
*
|
||||
* Defines a function to return the absolute path to a shell executable.
|
||||
*/
|
||||
|
||||
#ifndef BOOST_PROCESS_SHELL_PATH_HPP
|
||||
#define BOOST_PROCESS_SHELL_PATH_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
|
||||
#include BOOST_PROCESS_PLATFORM_PROMOTE_PATH(shell_path)
|
||||
BOOST_PROCESS_PLATFORM_PROMOTE_NAMESPACE(shell_path)
|
||||
|
||||
#if defined(BOOST_PROCESS_DOXYGEN)
|
||||
namespace boost { namespace process {
|
||||
|
||||
/**
|
||||
* Returns the absolute path to a shell executable.
|
||||
*
|
||||
* \returns the path to cmd.exe on Windows and /bin/sh on POSIX.
|
||||
*
|
||||
* \throws boost::system::system_error in case of an error
|
||||
*/
|
||||
boost::filesystem::path shell_path();
|
||||
|
||||
/**
|
||||
* Returns the absolute path to a shell executable.
|
||||
*
|
||||
* \returns the path to cmd.exe on Windows and /bin/sh on POSIX.
|
||||
*/
|
||||
boost::filesystem::path shell_path(boost::system::error_code &ec);
|
||||
|
||||
}}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
52
dep/process/boost/process/terminate.hpp
Normal file
52
dep/process/boost/process/terminate.hpp
Normal file
@@ -0,0 +1,52 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
/**
|
||||
* \file boost/process/terminate.hpp
|
||||
*
|
||||
* Defines a function to terminate a process.
|
||||
*/
|
||||
|
||||
#ifndef BOOST_PROCESS_TERMINATE_HPP
|
||||
#define BOOST_PROCESS_TERMINATE_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
|
||||
#include BOOST_PROCESS_PLATFORM_PROMOTE_PATH(terminate)
|
||||
BOOST_PROCESS_PLATFORM_PROMOTE_NAMESPACE(terminate)
|
||||
|
||||
#if defined(BOOST_PROCESS_DOXYGEN)
|
||||
namespace boost { namespace process {
|
||||
|
||||
/**
|
||||
* Terminates a process.
|
||||
*
|
||||
* \warning Call this function only as a last resort. The process
|
||||
* is terminated immediately and forcefully and has no
|
||||
* chance to close or clean up resources properly.
|
||||
*
|
||||
* \throws boost::system::system_error in case of an error
|
||||
*/
|
||||
template <class Process>
|
||||
void terminate(const Process &p);
|
||||
|
||||
/**
|
||||
* Terminates a process.
|
||||
*
|
||||
* \warning Call this function only as a last resort. The process
|
||||
* is terminated immediately and forcefully and has no
|
||||
* chance to close or clean up resources properly.
|
||||
*/
|
||||
template <class Process>
|
||||
void terminate(const Process &p, boost::system::error_code &ec);
|
||||
|
||||
}}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
58
dep/process/boost/process/wait_for_exit.hpp
Normal file
58
dep/process/boost/process/wait_for_exit.hpp
Normal file
@@ -0,0 +1,58 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
/**
|
||||
* \file boost/process/wait_for_exit.hpp
|
||||
*
|
||||
* Defines a function to wait for a process to exit.
|
||||
*/
|
||||
|
||||
#ifndef BOOST_PROCESS_WAIT_FOR_EXIT_HPP
|
||||
#define BOOST_PROCESS_WAIT_FOR_EXIT_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
|
||||
#include BOOST_PROCESS_PLATFORM_PROMOTE_PATH(wait_for_exit)
|
||||
BOOST_PROCESS_PLATFORM_PROMOTE_NAMESPACE(wait_for_exit)
|
||||
|
||||
#if defined(BOOST_PROCESS_DOXYGEN)
|
||||
namespace boost { namespace process {
|
||||
|
||||
/**
|
||||
* Waits for a process to exit.
|
||||
*
|
||||
* On Window boost::process::wait_for_exit returns the exit code
|
||||
* of the process. On POSIX the exit status is returned. You must
|
||||
* use the macro \c WEXITSTATUS (defined in sys/wait.h) to fetch
|
||||
* the exit code from the exit status.
|
||||
*
|
||||
* \note This is a blocking function.
|
||||
*
|
||||
* \throws boost::system::system_error in case of an error
|
||||
*/
|
||||
template <class Process>
|
||||
int_type wait_for_exit(const Process &p);
|
||||
|
||||
/**
|
||||
* Waits for a process to exit.
|
||||
*
|
||||
* On Window boost::process::wait_for_exit returns the exit code
|
||||
* of the process. On POSIX the exit status is returned. You must
|
||||
* use the macro \c WEXITSTATUS (defined in sys/wait.h) to fetch
|
||||
* the exit code from the exit status.
|
||||
*
|
||||
* \note This is a blocking function.
|
||||
*/
|
||||
template <class Process>
|
||||
int_type wait_for_exit(const Process &p, boost::system::error_code &ec);
|
||||
|
||||
}}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
55
dep/process/boost/process/windows/child.hpp
Normal file
55
dep/process/boost/process/windows/child.hpp
Normal file
@@ -0,0 +1,55 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_CHILD_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_CHILD_HPP
|
||||
|
||||
#include <boost/move/move.hpp>
|
||||
#include <Windows.h>
|
||||
|
||||
namespace boost { namespace process { namespace windows {
|
||||
|
||||
class child
|
||||
{
|
||||
public:
|
||||
PROCESS_INFORMATION proc_info;
|
||||
|
||||
explicit child(const PROCESS_INFORMATION &pi) : proc_info(pi) {}
|
||||
|
||||
~child()
|
||||
{
|
||||
::CloseHandle(proc_info.hProcess);
|
||||
::CloseHandle(proc_info.hThread);
|
||||
}
|
||||
|
||||
child(BOOST_RV_REF(child) c) : proc_info(c.proc_info)
|
||||
{
|
||||
c.proc_info.hProcess = INVALID_HANDLE_VALUE;
|
||||
c.proc_info.hThread = INVALID_HANDLE_VALUE;
|
||||
}
|
||||
|
||||
child &operator=(BOOST_RV_REF(child) c)
|
||||
{
|
||||
::CloseHandle(proc_info.hProcess);
|
||||
::CloseHandle(proc_info.hThread);
|
||||
proc_info = c.proc_info;
|
||||
c.proc_info.hProcess = INVALID_HANDLE_VALUE;
|
||||
c.proc_info.hThread = INVALID_HANDLE_VALUE;
|
||||
return *this;
|
||||
}
|
||||
|
||||
HANDLE process_handle() const { return proc_info.hProcess; }
|
||||
|
||||
private:
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(child);
|
||||
};
|
||||
|
||||
}}}
|
||||
|
||||
#endif
|
||||
40
dep/process/boost/process/windows/create_pipe.hpp
Normal file
40
dep/process/boost/process/windows/create_pipe.hpp
Normal file
@@ -0,0 +1,40 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_CREATE_PIPE_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_CREATE_PIPE_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
#include <boost/process/windows/pipe.hpp>
|
||||
#include <boost/system/error_code.hpp>
|
||||
#include <Windows.h>
|
||||
|
||||
namespace boost { namespace process { namespace windows {
|
||||
|
||||
inline pipe create_pipe()
|
||||
{
|
||||
HANDLE handles[2];
|
||||
if (!::CreatePipe(&handles[0], &handles[1], NULL, 0))
|
||||
BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("CreatePipe() failed");
|
||||
return make_pipe(handles[0], handles[1]);
|
||||
}
|
||||
|
||||
inline pipe create_pipe(boost::system::error_code &ec)
|
||||
{
|
||||
HANDLE handles[2];
|
||||
if (!::CreatePipe(&handles[0], &handles[1], NULL, 0))
|
||||
BOOST_PROCESS_RETURN_LAST_SYSTEM_ERROR(ec);
|
||||
else
|
||||
ec.clear();
|
||||
return make_pipe(handles[0], handles[1]);
|
||||
}
|
||||
|
||||
}}}
|
||||
|
||||
#endif
|
||||
82
dep/process/boost/process/windows/execute.hpp
Normal file
82
dep/process/boost/process/windows/execute.hpp
Normal file
@@ -0,0 +1,82 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_EXECUTE_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_EXECUTE_HPP
|
||||
|
||||
#include <boost/process/windows/executor.hpp>
|
||||
#include <boost/process/windows/child.hpp>
|
||||
#include <boost/fusion/tuple/make_tuple.hpp>
|
||||
#include <boost/ref.hpp>
|
||||
|
||||
namespace boost { namespace process { namespace windows {
|
||||
|
||||
template <class I0>
|
||||
child execute(const I0 &i0)
|
||||
{
|
||||
return executor()(boost::fusion::make_tuple(boost::cref(i0)));
|
||||
}
|
||||
|
||||
template <class I0, class I1>
|
||||
child execute(const I0 &i0, const I1 &i1)
|
||||
{
|
||||
return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1)));
|
||||
}
|
||||
|
||||
template <class I0, class I1, class I2>
|
||||
child execute(const I0 &i0, const I1 &i1, const I2 &i2)
|
||||
{
|
||||
return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2)));
|
||||
}
|
||||
|
||||
template <class I0, class I1, class I2, class I3>
|
||||
child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3)
|
||||
{
|
||||
return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3)));
|
||||
}
|
||||
|
||||
template <class I0, class I1, class I2, class I3, class I4>
|
||||
child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4)
|
||||
{
|
||||
return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4)));
|
||||
}
|
||||
|
||||
template <class I0, class I1, class I2, class I3, class I4, class I5>
|
||||
child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5)
|
||||
{
|
||||
return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5)));
|
||||
}
|
||||
|
||||
template <class I0, class I1, class I2, class I3, class I4, class I5, class I6>
|
||||
child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5, const I6 &i6)
|
||||
{
|
||||
return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5), boost::cref(i6)));
|
||||
}
|
||||
|
||||
template <class I0, class I1, class I2, class I3, class I4, class I5, class I6, class I7>
|
||||
child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5, const I6 &i6, const I7 &i7)
|
||||
{
|
||||
return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5), boost::cref(i6), boost::cref(i7)));
|
||||
}
|
||||
|
||||
template <class I0, class I1, class I2, class I3, class I4, class I5, class I6, class I7, class I8>
|
||||
child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5, const I6 &i6, const I7 &i7, const I8 &i8)
|
||||
{
|
||||
return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5), boost::cref(i6), boost::cref(i7), boost::cref(i8)));
|
||||
}
|
||||
|
||||
template <class I0, class I1, class I2, class I3, class I4, class I5, class I6, class I7, class I8, class I9>
|
||||
child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5, const I6 &i6, const I7 &i7, const I8 &i8, const I9 &i9)
|
||||
{
|
||||
return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5), boost::cref(i6), boost::cref(i7), boost::cref(i8), boost::cref(i9)));
|
||||
}
|
||||
|
||||
}}}
|
||||
|
||||
#endif
|
||||
130
dep/process/boost/process/windows/executor.hpp
Normal file
130
dep/process/boost/process/windows/executor.hpp
Normal file
@@ -0,0 +1,130 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_EXECUTOR_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_EXECUTOR_HPP
|
||||
|
||||
#include <boost/process/windows/child.hpp>
|
||||
#include <boost/fusion/algorithm/iteration/for_each.hpp>
|
||||
#include <Windows.h>
|
||||
|
||||
namespace boost { namespace process { namespace windows {
|
||||
|
||||
struct executor
|
||||
{
|
||||
executor() : exe(0), cmd_line(0), proc_attrs(0), thread_attrs(0),
|
||||
inherit_handles(FALSE),
|
||||
#if (_WIN32_WINNT >= 0x0600)
|
||||
creation_flags(EXTENDED_STARTUPINFO_PRESENT),
|
||||
#else
|
||||
creation_flags(0),
|
||||
#endif
|
||||
env(0), work_dir(0)
|
||||
#if (_WIN32_WINNT >= 0x0600)
|
||||
,startup_info(startup_info_ex.StartupInfo)
|
||||
#endif
|
||||
{
|
||||
#if (_WIN32_WINNT >= 0x0600)
|
||||
ZeroMemory(&startup_info_ex, sizeof(STARTUPINFOEX));
|
||||
startup_info.cb = sizeof(STARTUPINFOEX);
|
||||
#else
|
||||
ZeroMemory(&startup_info, sizeof(STARTUPINFO));
|
||||
startup_info.cb = sizeof(STARTUPINFO);
|
||||
#endif
|
||||
startup_info.hStdInput = INVALID_HANDLE_VALUE;
|
||||
startup_info.hStdOutput = INVALID_HANDLE_VALUE;
|
||||
startup_info.hStdError = INVALID_HANDLE_VALUE;
|
||||
}
|
||||
|
||||
struct call_on_CreateProcess_setup
|
||||
{
|
||||
executor &e_;
|
||||
|
||||
call_on_CreateProcess_setup(executor &e) : e_(e) {}
|
||||
|
||||
template <class Arg>
|
||||
void operator()(Arg &arg) const
|
||||
{
|
||||
arg.on_CreateProcess_setup(e_);
|
||||
}
|
||||
};
|
||||
|
||||
struct call_on_CreateProcess_error
|
||||
{
|
||||
executor &e_;
|
||||
|
||||
call_on_CreateProcess_error(executor &e) : e_(e) {}
|
||||
|
||||
template <class Arg>
|
||||
void operator()(Arg &arg) const
|
||||
{
|
||||
arg.on_CreateProcess_error(e_);
|
||||
}
|
||||
};
|
||||
|
||||
struct call_on_CreateProcess_success
|
||||
{
|
||||
executor &e_;
|
||||
|
||||
call_on_CreateProcess_success(executor &e) : e_(e) {}
|
||||
|
||||
template <class Arg>
|
||||
void operator()(Arg &arg) const
|
||||
{
|
||||
arg.on_CreateProcess_success(e_);
|
||||
}
|
||||
};
|
||||
|
||||
template <class InitializerSequence>
|
||||
child operator()(const InitializerSequence &seq)
|
||||
{
|
||||
boost::fusion::for_each(seq, call_on_CreateProcess_setup(*this));
|
||||
|
||||
if (!::CreateProcess(
|
||||
exe,
|
||||
cmd_line,
|
||||
proc_attrs,
|
||||
thread_attrs,
|
||||
inherit_handles,
|
||||
creation_flags,
|
||||
env,
|
||||
work_dir,
|
||||
&startup_info,
|
||||
&proc_info))
|
||||
{
|
||||
boost::fusion::for_each(seq, call_on_CreateProcess_error(*this));
|
||||
}
|
||||
else
|
||||
{
|
||||
boost::fusion::for_each(seq, call_on_CreateProcess_success(*this));
|
||||
}
|
||||
|
||||
return child(proc_info);
|
||||
}
|
||||
|
||||
LPCTSTR exe;
|
||||
LPTSTR cmd_line;
|
||||
LPSECURITY_ATTRIBUTES proc_attrs;
|
||||
LPSECURITY_ATTRIBUTES thread_attrs;
|
||||
BOOL inherit_handles;
|
||||
DWORD creation_flags;
|
||||
LPVOID env;
|
||||
LPCTSTR work_dir;
|
||||
#if (_WIN32_WINNT >= 0x0600)
|
||||
STARTUPINFOEX startup_info_ex;
|
||||
STARTUPINFO &startup_info;
|
||||
#else
|
||||
STARTUPINFO startup_info;
|
||||
#endif
|
||||
PROCESS_INFORMATION proc_info;
|
||||
};
|
||||
|
||||
}}}
|
||||
|
||||
#endif
|
||||
33
dep/process/boost/process/windows/initializers.hpp
Normal file
33
dep/process/boost/process/windows/initializers.hpp
Normal file
@@ -0,0 +1,33 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_INITIALIZERS_HPP
|
||||
|
||||
#include <boost/process/windows/initializers/bind_stderr.hpp>
|
||||
#include <boost/process/windows/initializers/bind_stdin.hpp>
|
||||
#include <boost/process/windows/initializers/bind_stdout.hpp>
|
||||
#include <boost/process/windows/initializers/close_stderr.hpp>
|
||||
#include <boost/process/windows/initializers/close_stdin.hpp>
|
||||
#include <boost/process/windows/initializers/close_stdout.hpp>
|
||||
#include <boost/process/windows/initializers/hide_console.hpp>
|
||||
#include <boost/process/windows/initializers/inherit_env.hpp>
|
||||
#include <boost/process/windows/initializers/on_CreateProcess_error.hpp>
|
||||
#include <boost/process/windows/initializers/on_CreateProcess_setup.hpp>
|
||||
#include <boost/process/windows/initializers/on_CreateProcess_success.hpp>
|
||||
#include <boost/process/windows/initializers/run_exe.hpp>
|
||||
#include <boost/process/windows/initializers/set_args.hpp>
|
||||
#include <boost/process/windows/initializers/set_cmd_line.hpp>
|
||||
#include <boost/process/windows/initializers/set_env.hpp>
|
||||
#include <boost/process/windows/initializers/set_on_error.hpp>
|
||||
#include <boost/process/windows/initializers/show_window.hpp>
|
||||
#include <boost/process/windows/initializers/start_in_dir.hpp>
|
||||
#include <boost/process/windows/initializers/throw_on_error.hpp>
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,39 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_BIND_STDERR_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_INITIALIZERS_BIND_STDERR_HPP
|
||||
|
||||
#include <boost/process/windows/initializers/initializer_base.hpp>
|
||||
#include <boost/iostreams/device/file_descriptor.hpp>
|
||||
#include <Windows.h>
|
||||
|
||||
namespace boost { namespace process { namespace windows { namespace initializers {
|
||||
|
||||
class bind_stderr : public initializer_base
|
||||
{
|
||||
public:
|
||||
explicit bind_stderr(const boost::iostreams::file_descriptor_sink &sink) : sink_(sink) {}
|
||||
|
||||
template <class WindowsExecutor>
|
||||
void on_CreateProcess_setup(WindowsExecutor &e) const
|
||||
{
|
||||
::SetHandleInformation(sink_.handle(), HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);
|
||||
e.startup_info.hStdError = sink_.handle();
|
||||
e.startup_info.dwFlags |= STARTF_USESTDHANDLES;
|
||||
e.inherit_handles = true;
|
||||
}
|
||||
|
||||
private:
|
||||
boost::iostreams::file_descriptor_sink sink_;
|
||||
};
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,39 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_BIND_STDIN_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_INITIALIZERS_BIND_STDIN_HPP
|
||||
|
||||
#include <boost/process/windows/initializers/initializer_base.hpp>
|
||||
#include <boost/iostreams/device/file_descriptor.hpp>
|
||||
#include <Windows.h>
|
||||
|
||||
namespace boost { namespace process { namespace windows { namespace initializers {
|
||||
|
||||
class bind_stdin : public initializer_base
|
||||
{
|
||||
public:
|
||||
explicit bind_stdin(const boost::iostreams::file_descriptor_source &source) : source_(source) {}
|
||||
|
||||
template <class WindowsExecutor>
|
||||
void on_CreateProcess_setup(WindowsExecutor &e) const
|
||||
{
|
||||
::SetHandleInformation(source_.handle(), HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);
|
||||
e.startup_info.hStdInput = source_.handle();
|
||||
e.startup_info.dwFlags |= STARTF_USESTDHANDLES;
|
||||
e.inherit_handles = true;
|
||||
}
|
||||
|
||||
private:
|
||||
boost::iostreams::file_descriptor_source source_;
|
||||
};
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,39 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_BIND_STDOUT_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_INITIALIZERS_BIND_STDOUT_HPP
|
||||
|
||||
#include <boost/process/windows/initializers/initializer_base.hpp>
|
||||
#include <boost/iostreams/device/file_descriptor.hpp>
|
||||
#include <Windows.h>
|
||||
|
||||
namespace boost { namespace process { namespace windows { namespace initializers {
|
||||
|
||||
class bind_stdout : public initializer_base
|
||||
{
|
||||
public:
|
||||
explicit bind_stdout(const boost::iostreams::file_descriptor_sink &sink) : sink_(sink) {}
|
||||
|
||||
template <class WindowsExecutor>
|
||||
void on_CreateProcess_setup(WindowsExecutor &e) const
|
||||
{
|
||||
::SetHandleInformation(sink_.handle(), HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);
|
||||
e.startup_info.hStdOutput = sink_.handle();
|
||||
e.startup_info.dwFlags |= STARTF_USESTDHANDLES;
|
||||
e.inherit_handles = true;
|
||||
}
|
||||
|
||||
private:
|
||||
boost::iostreams::file_descriptor_sink sink_;
|
||||
};
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,31 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_CLOSE_STDERR_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_INITIALIZERS_CLOSE_STDERR_HPP
|
||||
|
||||
#include <boost/process/windows/initializers/initializer_base.hpp>
|
||||
#include <Windows.h>
|
||||
|
||||
namespace boost { namespace process { namespace windows { namespace initializers {
|
||||
|
||||
class close_stderr : public initializer_base
|
||||
{
|
||||
public:
|
||||
template <class WindowsExecutor>
|
||||
void on_CreateProcess_setup(WindowsExecutor &e) const
|
||||
{
|
||||
e.startup_info.hStdError = INVALID_HANDLE_VALUE;
|
||||
e.startup_info.dwFlags |= STARTF_USESTDHANDLES;
|
||||
}
|
||||
};
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,31 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_CLOSE_STDIN_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_INITIALIZERS_CLOSE_STDIN_HPP
|
||||
|
||||
#include <boost/process/windows/initializers/initializer_base.hpp>
|
||||
#include <Windows.h>
|
||||
|
||||
namespace boost { namespace process { namespace windows { namespace initializers {
|
||||
|
||||
class close_stdin : public initializer_base
|
||||
{
|
||||
public:
|
||||
template <class WindowsExecutor>
|
||||
void on_CreateProcess_setup(WindowsExecutor &e) const
|
||||
{
|
||||
e.startup_info.hStdInput = INVALID_HANDLE_VALUE;
|
||||
e.startup_info.dwFlags |= STARTF_USESTDHANDLES;
|
||||
}
|
||||
};
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,31 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_CLOSE_STDOUT_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_INITIALIZERS_CLOSE_STDOUT_HPP
|
||||
|
||||
#include <boost/process/windows/initializers/initializer_base.hpp>
|
||||
#include <Windows.h>
|
||||
|
||||
namespace boost { namespace process { namespace windows { namespace initializers {
|
||||
|
||||
class close_stdout : public initializer_base
|
||||
{
|
||||
public:
|
||||
template <class WindowsExecutor>
|
||||
void on_CreateProcess_setup(WindowsExecutor &e) const
|
||||
{
|
||||
e.startup_info.hStdOutput = INVALID_HANDLE_VALUE;
|
||||
e.startup_info.dwFlags |= STARTF_USESTDHANDLES;
|
||||
}
|
||||
};
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,31 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_HIDE_CONSOLE_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_INITIALIZERS_HIDE_CONSOLE_HPP
|
||||
|
||||
#include <boost/process/windows/initializers/initializer_base.hpp>
|
||||
#include <Windows.h>
|
||||
|
||||
namespace boost { namespace process { namespace windows { namespace initializers {
|
||||
|
||||
class hide_console : public initializer_base
|
||||
{
|
||||
public:
|
||||
template <class WindowsExecutor>
|
||||
void on_CreateProcess_setup(WindowsExecutor &e) const
|
||||
{
|
||||
e.startup_info.dwFlags |= STARTF_USESHOWWINDOW;
|
||||
e.startup_info.wShowWindow |= SW_HIDE;
|
||||
}
|
||||
};
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,24 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_INHERIT_ENV_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_INITIALIZERS_INHERIT_ENV_HPP
|
||||
|
||||
#include <boost/process/windows/initializers/initializer_base.hpp>
|
||||
|
||||
namespace boost { namespace process { namespace windows { namespace initializers {
|
||||
|
||||
class inherit_env : public initializer_base
|
||||
{
|
||||
public:
|
||||
};
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,29 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_INITIALIZER_BASE_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_INITIALIZERS_INITIALIZER_BASE_HPP
|
||||
|
||||
namespace boost { namespace process { namespace windows { namespace initializers {
|
||||
|
||||
struct initializer_base
|
||||
{
|
||||
template <class WindowsExecutor>
|
||||
void on_CreateProcess_setup(WindowsExecutor&) const {}
|
||||
|
||||
template <class WindowsExecutor>
|
||||
void on_CreateProcess_error(WindowsExecutor&) const {}
|
||||
|
||||
template <class WindowsExecutor>
|
||||
void on_CreateProcess_success(WindowsExecutor&) const {}
|
||||
};
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,42 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_ON_CREATEPROCESS_ERROR_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_INITIALIZERS_ON_CREATEPROCESS_ERROR_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
#include <boost/process/windows/initializers/initializer_base.hpp>
|
||||
|
||||
namespace boost { namespace process { namespace windows { namespace initializers {
|
||||
|
||||
template <class Handler>
|
||||
class on_CreateProcess_error_ : public initializer_base
|
||||
{
|
||||
public:
|
||||
explicit on_CreateProcess_error_(Handler handler) : handler_(handler) {}
|
||||
|
||||
template <class WindowsExecutor>
|
||||
void on_CreateProcess_error(WindowsExecutor &e) const
|
||||
{
|
||||
handler_(e);
|
||||
}
|
||||
|
||||
private:
|
||||
Handler handler_;
|
||||
};
|
||||
|
||||
template <class Handler>
|
||||
on_CreateProcess_error_<Handler> on_CreateProcess_error(Handler handler)
|
||||
{
|
||||
return on_CreateProcess_error_<Handler>(handler);
|
||||
}
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,42 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_ON_CREATEPROCESS_SETUP_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_INITIALIZERS_ON_CREATEPROCESS_SETUP_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
#include <boost/process/windows/initializers/initializer_base.hpp>
|
||||
|
||||
namespace boost { namespace process { namespace windows { namespace initializers {
|
||||
|
||||
template <class Handler>
|
||||
class on_CreateProcess_setup_ : public initializer_base
|
||||
{
|
||||
public:
|
||||
explicit on_CreateProcess_setup_(Handler handler) : handler_(handler) {}
|
||||
|
||||
template <class WindowsExecutor>
|
||||
void on_CreateProcess_setup(WindowsExecutor &e) const
|
||||
{
|
||||
handler_(e);
|
||||
}
|
||||
|
||||
private:
|
||||
Handler handler_;
|
||||
};
|
||||
|
||||
template <class Handler>
|
||||
on_CreateProcess_setup_<Handler> on_CreateProcess_setup(Handler handler)
|
||||
{
|
||||
return on_CreateProcess_setup_<Handler>(handler);
|
||||
}
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,42 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_ON_CREATEPROCESS_SUCCESS_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_INITIALIZERS_ON_CREATEPROCESS_SUCCESS_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
#include <boost/process/windows/initializers/initializer_base.hpp>
|
||||
|
||||
namespace boost { namespace process { namespace windows { namespace initializers {
|
||||
|
||||
template <class Handler>
|
||||
class on_CreateProcess_success_ : public initializer_base
|
||||
{
|
||||
public:
|
||||
explicit on_CreateProcess_success_(Handler handler) : handler_(handler) {}
|
||||
|
||||
template <class WindowsExecutor>
|
||||
void on_CreateProcess_sucess(WindowsExecutor &e) const
|
||||
{
|
||||
handler_(e);
|
||||
}
|
||||
|
||||
private:
|
||||
Handler handler_;
|
||||
};
|
||||
|
||||
template <class Handler>
|
||||
on_CreateProcess_success_<Handler> on_CreateProcess_success(Handler handler)
|
||||
{
|
||||
return on_CreateProcess_success_<Handler>(handler);
|
||||
}
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
69
dep/process/boost/process/windows/initializers/run_exe.hpp
Normal file
69
dep/process/boost/process/windows/initializers/run_exe.hpp
Normal file
@@ -0,0 +1,69 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_RUN_EXE_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_INITIALIZERS_RUN_EXE_HPP
|
||||
|
||||
#include <boost/process/windows/initializers/initializer_base.hpp>
|
||||
#include <boost/filesystem.hpp>
|
||||
#include <string>
|
||||
|
||||
namespace boost { namespace process { namespace windows { namespace initializers {
|
||||
|
||||
template <class String>
|
||||
class run_exe_ : public initializer_base
|
||||
{
|
||||
public:
|
||||
explicit run_exe_(const String &s) : s_(s) {}
|
||||
|
||||
template <class WindowsExecutor>
|
||||
void on_CreateProcess_setup(WindowsExecutor &e) const
|
||||
{
|
||||
e.exe = s_.c_str();
|
||||
}
|
||||
|
||||
private:
|
||||
String s_;
|
||||
};
|
||||
|
||||
#if defined(_UNICODE) || defined(UNICODE)
|
||||
inline run_exe_<std::wstring> run_exe(const wchar_t *ws)
|
||||
{
|
||||
return run_exe_<std::wstring>(ws);
|
||||
}
|
||||
|
||||
inline run_exe_<std::wstring> run_exe(const std::wstring &ws)
|
||||
{
|
||||
return run_exe_<std::wstring>(ws);
|
||||
}
|
||||
|
||||
inline run_exe_<std::wstring> run_exe(const boost::filesystem::path &p)
|
||||
{
|
||||
return run_exe_<std::wstring>(p.wstring());
|
||||
}
|
||||
#else
|
||||
inline run_exe_<std::string> run_exe(const char *s)
|
||||
{
|
||||
return run_exe_<std::string>(s);
|
||||
}
|
||||
|
||||
inline run_exe_<std::string> run_exe(const std::string &s)
|
||||
{
|
||||
return run_exe_<std::string>(s);
|
||||
}
|
||||
|
||||
inline run_exe_<std::string> run_exe(const boost::filesystem::path &p)
|
||||
{
|
||||
return run_exe_<std::string>(p.string());
|
||||
}
|
||||
#endif
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
87
dep/process/boost/process/windows/initializers/set_args.hpp
Normal file
87
dep/process/boost/process/windows/initializers/set_args.hpp
Normal file
@@ -0,0 +1,87 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_SET_ARGS_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_INITIALIZERS_SET_ARGS_HPP
|
||||
|
||||
#include <boost/process/windows/initializers/initializer_base.hpp>
|
||||
#include <boost/range/begin.hpp>
|
||||
#include <boost/range/end.hpp>
|
||||
#include <boost/range/algorithm/copy.hpp>
|
||||
#include <boost/algorithm/string/predicate.hpp>
|
||||
#include <boost/shared_array.hpp>
|
||||
#include <sstream>
|
||||
|
||||
namespace boost { namespace process { namespace windows { namespace initializers {
|
||||
|
||||
template <class Range>
|
||||
class set_args_ : public initializer_base
|
||||
{
|
||||
private:
|
||||
typedef typename Range::const_iterator ConstIterator;
|
||||
typedef typename Range::value_type String;
|
||||
typedef typename String::value_type Char;
|
||||
typedef std::basic_ostringstream<Char> OStringStream;
|
||||
|
||||
public:
|
||||
explicit set_args_(const Range &args)
|
||||
{
|
||||
ConstIterator it = boost::const_begin(args);
|
||||
ConstIterator end = boost::const_end(args);
|
||||
if (it != end)
|
||||
{
|
||||
exe_ = *it;
|
||||
OStringStream os;
|
||||
for (; it != end; ++it)
|
||||
{
|
||||
if (boost::algorithm::contains(*it,
|
||||
String(1, static_cast<Char>(' '))))
|
||||
{
|
||||
os << static_cast<Char>('"') << *it <<
|
||||
static_cast<Char>('"');
|
||||
}
|
||||
else
|
||||
{
|
||||
os << *it;
|
||||
}
|
||||
os << static_cast<Char>(' ');
|
||||
}
|
||||
String s = os.str();
|
||||
cmd_line_.reset(new Char[s.size() + 1]);
|
||||
boost::copy(s, cmd_line_.get());
|
||||
cmd_line_[s.size()] = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
cmd_line_.reset(new Char[1]());
|
||||
}
|
||||
}
|
||||
|
||||
template <class WindowsExecutor>
|
||||
void on_CreateProcess_setup(WindowsExecutor &e) const
|
||||
{
|
||||
e.cmd_line = cmd_line_.get();
|
||||
if (!e.exe && !exe_.empty())
|
||||
e.exe = exe_.c_str();
|
||||
}
|
||||
|
||||
private:
|
||||
boost::shared_array<Char> cmd_line_;
|
||||
String exe_;
|
||||
};
|
||||
|
||||
template <class Range>
|
||||
set_args_<Range> set_args(const Range &range)
|
||||
{
|
||||
return set_args_<Range>(range);
|
||||
}
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,68 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_SET_CMD_LINE_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_INITIALIZERS_SET_CMD_LINE_HPP
|
||||
|
||||
#include <boost/process/windows/initializers/initializer_base.hpp>
|
||||
#include <boost/range/algorithm/copy.hpp>
|
||||
#include <boost/shared_array.hpp>
|
||||
#include <memory>
|
||||
|
||||
namespace boost { namespace process { namespace windows { namespace initializers {
|
||||
|
||||
template <class String>
|
||||
class set_cmd_line_ : public initializer_base
|
||||
{
|
||||
private:
|
||||
typedef typename String::value_type Char;
|
||||
|
||||
public:
|
||||
explicit set_cmd_line_(const String &s)
|
||||
: cmd_line_(new Char[s.size() + 1])
|
||||
{
|
||||
boost::copy(s, cmd_line_.get());
|
||||
cmd_line_[s.size()] = 0;
|
||||
}
|
||||
|
||||
template <class WindowsExecutor>
|
||||
void on_CreateProcess_setup(WindowsExecutor &e) const
|
||||
{
|
||||
e.cmd_line = cmd_line_.get();
|
||||
}
|
||||
|
||||
private:
|
||||
boost::shared_array<Char> cmd_line_;
|
||||
};
|
||||
|
||||
#if defined(_UNICODE) || defined(UNICODE)
|
||||
inline set_cmd_line_<std::wstring> set_cmd_line(const wchar_t *ws)
|
||||
{
|
||||
return set_cmd_line_<std::wstring>(ws);
|
||||
}
|
||||
|
||||
inline set_cmd_line_<std::wstring> set_cmd_line(const std::wstring &ws)
|
||||
{
|
||||
return set_cmd_line_<std::wstring>(ws);
|
||||
}
|
||||
#else
|
||||
inline set_cmd_line_<std::string> set_cmd_line(const char *s)
|
||||
{
|
||||
return set_cmd_line_<std::string>(s);
|
||||
}
|
||||
|
||||
inline set_cmd_line_<std::string> set_cmd_line(const std::string &s)
|
||||
{
|
||||
return set_cmd_line_<std::string>(s);
|
||||
}
|
||||
#endif
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
88
dep/process/boost/process/windows/initializers/set_env.hpp
Normal file
88
dep/process/boost/process/windows/initializers/set_env.hpp
Normal file
@@ -0,0 +1,88 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_SET_ENV_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_INITIALIZERS_SET_ENV_HPP
|
||||
|
||||
#include <Windows.h>
|
||||
#include <boost/process/windows/initializers/initializer_base.hpp>
|
||||
#include <boost/range/numeric.hpp>
|
||||
#include <boost/range/algorithm/copy.hpp>
|
||||
#include <boost/range/algorithm/for_each.hpp>
|
||||
#include <boost/shared_array.hpp>
|
||||
#include <iterator>
|
||||
#include <cstddef>
|
||||
|
||||
namespace boost { namespace process { namespace windows { namespace initializers {
|
||||
|
||||
template <class Range, bool Unicode>
|
||||
class set_env_ : public initializer_base
|
||||
{
|
||||
private:
|
||||
typedef typename Range::value_type String;
|
||||
typedef typename String::value_type Char;
|
||||
|
||||
static std::size_t add_size(std::size_t size, const String &s)
|
||||
{
|
||||
return size + s.size() + 1u;
|
||||
}
|
||||
|
||||
struct copy
|
||||
{
|
||||
Char *it_;
|
||||
|
||||
copy(Char *it) : it_(it) {}
|
||||
|
||||
void operator()(const String &s)
|
||||
{
|
||||
it_ = boost::copy(s, it_);
|
||||
*it_ = 0;
|
||||
++it_;
|
||||
}
|
||||
};
|
||||
|
||||
public:
|
||||
set_env_(const Range &envs)
|
||||
: size_(boost::accumulate(envs, 0, add_size) + 1),
|
||||
env_(new Char[size_])
|
||||
{
|
||||
boost::for_each(envs, copy(env_.get()));
|
||||
env_[size_ - 1] = 0;
|
||||
}
|
||||
|
||||
template <class WindowsExecutor>
|
||||
void on_CreateProcess_setup(WindowsExecutor &e) const
|
||||
{
|
||||
e.env = env_.get();
|
||||
if (Unicode)
|
||||
e.creation_flags |= CREATE_UNICODE_ENVIRONMENT;
|
||||
}
|
||||
|
||||
private:
|
||||
std::size_t size_;
|
||||
boost::shared_array<Char> env_;
|
||||
};
|
||||
|
||||
#if defined(_UNICODE) || defined(UNICODE)
|
||||
template <class Range>
|
||||
set_env_<Range, true> set_env(const Range &envs)
|
||||
{
|
||||
return set_env_<Range, true>(envs);
|
||||
}
|
||||
#else
|
||||
template <class Range>
|
||||
set_env_<Range, false> set_env(const Range &envs)
|
||||
{
|
||||
return set_env_<Range, false>(envs);
|
||||
}
|
||||
#endif
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,36 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_SET_ON_ERROR_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_INITIALIZERS_SET_ON_ERROR_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
#include <boost/process/windows/initializers/initializer_base.hpp>
|
||||
#include <boost/system/error_code.hpp>
|
||||
|
||||
namespace boost { namespace process { namespace windows { namespace initializers {
|
||||
|
||||
class set_on_error : public initializer_base
|
||||
{
|
||||
public:
|
||||
explicit set_on_error(boost::system::error_code &ec) : ec_(ec) {}
|
||||
|
||||
template <class WindowsExecutor>
|
||||
void on_CreateProcess_error(WindowsExecutor&) const
|
||||
{
|
||||
BOOST_PROCESS_RETURN_LAST_SYSTEM_ERROR(ec_);
|
||||
}
|
||||
|
||||
private:
|
||||
boost::system::error_code &ec_;
|
||||
};
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,36 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_SHOW_WINDOW_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_INITIALIZERS_SHOW_WINDOW_HPP
|
||||
|
||||
#include <boost/process/windows/initializers/initializer_base.hpp>
|
||||
#include <Windows.h>
|
||||
|
||||
namespace boost { namespace process { namespace windows { namespace initializers {
|
||||
|
||||
class show_window : public initializer_base
|
||||
{
|
||||
public:
|
||||
explicit show_window(WORD flags) : flags_(flags) {}
|
||||
|
||||
template <class WindowsExecutor>
|
||||
void on_CreateProcess_setup(WindowsExecutor &e) const
|
||||
{
|
||||
e.startup_info.dwFlags |= STARTF_USESHOWWINDOW;
|
||||
e.startup_info.wShowWindow |= flags_;
|
||||
}
|
||||
|
||||
private:
|
||||
WORD flags_;
|
||||
};
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,69 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_START_IN_DIR_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_INITIALIZERS_START_IN_DIR_HPP
|
||||
|
||||
#include <boost/process/windows/initializers/initializer_base.hpp>
|
||||
#include <boost/filesystem/path.hpp>
|
||||
#include <string>
|
||||
|
||||
namespace boost { namespace process { namespace windows { namespace initializers {
|
||||
|
||||
template <class String>
|
||||
class start_in_dir_ : public initializer_base
|
||||
{
|
||||
public:
|
||||
explicit start_in_dir_(const String &s) : s_(s) {}
|
||||
|
||||
template <class WindowsExecutor>
|
||||
void on_CreateProcess_setup(WindowsExecutor &e) const
|
||||
{
|
||||
e.work_dir = s_.c_str();
|
||||
}
|
||||
|
||||
private:
|
||||
String s_;
|
||||
};
|
||||
|
||||
#if defined(_UNICODE) || defined(UNICODE)
|
||||
inline start_in_dir_<std::wstring> start_in_dir(const wchar_t *ws)
|
||||
{
|
||||
return start_in_dir_<std::wstring>(ws);
|
||||
}
|
||||
|
||||
inline start_in_dir_<std::wstring> start_in_dir(const std::wstring &ws)
|
||||
{
|
||||
return start_in_dir_<std::wstring>(ws);
|
||||
}
|
||||
|
||||
inline start_in_dir_<std::wstring> start_in_dir(const boost::filesystem::path &p)
|
||||
{
|
||||
return start_in_dir_<std::wstring>(p.wstring());
|
||||
}
|
||||
#else
|
||||
inline start_in_dir_<std::string> start_in_dir(const char *s)
|
||||
{
|
||||
return start_in_dir_<std::string>(s);
|
||||
}
|
||||
|
||||
inline start_in_dir_<std::string> start_in_dir(const std::string &s)
|
||||
{
|
||||
return start_in_dir_<std::string>(s);
|
||||
}
|
||||
|
||||
inline start_in_dir_<std::string> start_in_dir(const boost::filesystem::path &p)
|
||||
{
|
||||
return start_in_dir_<std::string>(p.string());
|
||||
}
|
||||
#endif
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,30 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_THROW_ON_ERROR_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_INITIALIZERS_THROW_ON_ERROR_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
#include <boost/process/windows/initializers/initializer_base.hpp>
|
||||
|
||||
namespace boost { namespace process { namespace windows { namespace initializers {
|
||||
|
||||
class throw_on_error : public initializer_base
|
||||
{
|
||||
public:
|
||||
template <class WindowsExecutor>
|
||||
void on_CreateProcess_error(WindowsExecutor&) const
|
||||
{
|
||||
BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("CreateProcess() failed");
|
||||
}
|
||||
};
|
||||
|
||||
}}}}
|
||||
|
||||
#endif
|
||||
32
dep/process/boost/process/windows/pipe.hpp
Normal file
32
dep/process/boost/process/windows/pipe.hpp
Normal file
@@ -0,0 +1,32 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_PIPE_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_PIPE_HPP
|
||||
|
||||
#include <Windows.h>
|
||||
|
||||
namespace boost { namespace process { namespace windows {
|
||||
|
||||
struct pipe
|
||||
{
|
||||
HANDLE source;
|
||||
HANDLE sink;
|
||||
|
||||
pipe(HANDLE source, HANDLE sink) : source(source), sink(sink) {}
|
||||
};
|
||||
|
||||
inline pipe make_pipe(HANDLE source, HANDLE sink)
|
||||
{
|
||||
return pipe(source, sink);
|
||||
}
|
||||
|
||||
}}}
|
||||
|
||||
#endif
|
||||
104
dep/process/boost/process/windows/search_path.hpp
Normal file
104
dep/process/boost/process/windows/search_path.hpp
Normal file
@@ -0,0 +1,104 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_SEARCH_PATH_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_SEARCH_PATH_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
#include <boost/filesystem.hpp>
|
||||
#include <boost/tokenizer.hpp>
|
||||
#include <boost/array.hpp>
|
||||
#include <boost/system/error_code.hpp>
|
||||
#include <string>
|
||||
#include <stdexcept>
|
||||
#include <stdlib.h>
|
||||
#include <Shellapi.h>
|
||||
|
||||
namespace boost { namespace process { namespace windows {
|
||||
|
||||
#if defined(_UNICODE) || defined(UNICODE)
|
||||
inline std::wstring search_path(const std::wstring &filename,
|
||||
std::wstring path = L"")
|
||||
{
|
||||
if (path.empty())
|
||||
{
|
||||
path = ::_wgetenv(L"PATH");
|
||||
if (path.empty())
|
||||
BOOST_PROCESS_THROW(std::runtime_error(
|
||||
"Environment variable PATH not found"));
|
||||
}
|
||||
|
||||
typedef boost::tokenizer<boost::char_separator<wchar_t>,
|
||||
std::wstring::const_iterator, std::wstring> tokenizer;
|
||||
boost::char_separator<wchar_t> sep(L";");
|
||||
tokenizer tok(path, sep);
|
||||
for (tokenizer::iterator it = tok.begin(); it != tok.end(); ++it)
|
||||
{
|
||||
boost::filesystem::path p = *it;
|
||||
p /= filename;
|
||||
boost::array<std::wstring, 4> extensions =
|
||||
{ L"", L".exe", L".com", L".bat" };
|
||||
for (boost::array<std::wstring, 4>::iterator it2 = extensions.begin();
|
||||
it2 != extensions.end(); ++it2)
|
||||
{
|
||||
boost::filesystem::path p2 = p;
|
||||
p2 += *it2;
|
||||
boost::system::error_code ec;
|
||||
bool file = boost::filesystem::is_regular_file(p2, ec);
|
||||
if (!ec && file &&
|
||||
SHGetFileInfoW(p2.c_str(), 0, 0, 0, SHGFI_EXETYPE))
|
||||
{
|
||||
return p2.wstring();
|
||||
}
|
||||
}
|
||||
}
|
||||
return L"";
|
||||
}
|
||||
#else
|
||||
inline std::string search_path(const std::string &filename,
|
||||
std::string path = "")
|
||||
{
|
||||
if (path.empty())
|
||||
{
|
||||
path = ::getenv("PATH");
|
||||
if (path.empty())
|
||||
BOOST_PROCESS_THROW(std::runtime_error(
|
||||
"Environment variable PATH not found"));
|
||||
}
|
||||
|
||||
typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
|
||||
boost::char_separator<char> sep(";");
|
||||
tokenizer tok(path, sep);
|
||||
for (tokenizer::iterator it = tok.begin(); it != tok.end(); ++it)
|
||||
{
|
||||
boost::filesystem::path p = *it;
|
||||
p /= filename;
|
||||
boost::array<std::string, 4> extensions =
|
||||
{ "", ".exe", ".com", ".bat" };
|
||||
for (boost::array<std::string, 4>::iterator it2 = extensions.begin();
|
||||
it2 != extensions.end(); ++it2)
|
||||
{
|
||||
boost::filesystem::path p2 = p;
|
||||
p2 += *it2;
|
||||
boost::system::error_code ec;
|
||||
bool file = boost::filesystem::is_regular_file(p2, ec);
|
||||
if (!ec && file &&
|
||||
SHGetFileInfoA(p2.string().c_str(), 0, 0, 0, SHGFI_EXETYPE))
|
||||
{
|
||||
return p2.string();
|
||||
}
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
#endif
|
||||
|
||||
}}}
|
||||
|
||||
#endif
|
||||
50
dep/process/boost/process/windows/shell_path.hpp
Normal file
50
dep/process/boost/process/windows/shell_path.hpp
Normal file
@@ -0,0 +1,50 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_SHELL_PATH_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_SHELL_PATH_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
#include <boost/system/error_code.hpp>
|
||||
#include <boost/filesystem/path.hpp>
|
||||
#include <Windows.h>
|
||||
|
||||
namespace boost { namespace process { namespace windows {
|
||||
|
||||
inline boost::filesystem::path shell_path()
|
||||
{
|
||||
TCHAR sysdir[MAX_PATH];
|
||||
UINT size = ::GetSystemDirectory(sysdir, sizeof(sysdir));
|
||||
if (!size)
|
||||
BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("GetSystemDirectory() failed");
|
||||
boost::filesystem::path p = sysdir;
|
||||
return p / "cmd.exe";
|
||||
}
|
||||
|
||||
inline boost::filesystem::path shell_path(boost::system::error_code &ec)
|
||||
{
|
||||
TCHAR sysdir[MAX_PATH];
|
||||
UINT size = ::GetSystemDirectory(sysdir, sizeof(sysdir));
|
||||
boost::filesystem::path p;
|
||||
if (!size)
|
||||
{
|
||||
BOOST_PROCESS_RETURN_LAST_SYSTEM_ERROR(ec);
|
||||
}
|
||||
else
|
||||
{
|
||||
ec.clear();
|
||||
p = sysdir;
|
||||
p /= "cmd.exe";
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
}}}
|
||||
|
||||
#endif
|
||||
38
dep/process/boost/process/windows/terminate.hpp
Normal file
38
dep/process/boost/process/windows/terminate.hpp
Normal file
@@ -0,0 +1,38 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_TERMINATE_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_TERMINATE_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
#include <boost/system/error_code.hpp>
|
||||
#include <cstdlib>
|
||||
#include <Windows.h>
|
||||
|
||||
namespace boost { namespace process { namespace windows {
|
||||
|
||||
template <class Process>
|
||||
void terminate(const Process &p)
|
||||
{
|
||||
if (!::TerminateProcess(p.process_handle(), EXIT_FAILURE))
|
||||
BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("TerminateProcess() failed");
|
||||
}
|
||||
|
||||
template <class Process>
|
||||
void terminate(const Process &p, boost::system::error_code &ec)
|
||||
{
|
||||
if (!::TerminateProcess(p.process_handle(), EXIT_FAILURE))
|
||||
BOOST_PROCESS_RETURN_LAST_SYSTEM_ERROR(ec);
|
||||
else
|
||||
ec.clear();
|
||||
}
|
||||
|
||||
}}}
|
||||
|
||||
#endif
|
||||
49
dep/process/boost/process/windows/wait_for_exit.hpp
Normal file
49
dep/process/boost/process/windows/wait_for_exit.hpp
Normal file
@@ -0,0 +1,49 @@
|
||||
// Copyright (c) 2006, 2007 Julio M. Merino Vidal
|
||||
// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
|
||||
// Copyright (c) 2009 Boris Schaeling
|
||||
// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
|
||||
// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_PROCESS_WINDOWS_WAIT_FOR_EXIT_HPP
|
||||
#define BOOST_PROCESS_WINDOWS_WAIT_FOR_EXIT_HPP
|
||||
|
||||
#include <boost/process/config.hpp>
|
||||
#include <boost/system/error_code.hpp>
|
||||
#include <Windows.h>
|
||||
|
||||
namespace boost { namespace process { namespace windows {
|
||||
|
||||
template <class Process>
|
||||
inline DWORD wait_for_exit(const Process &p)
|
||||
{
|
||||
if (::WaitForSingleObject(p.process_handle(), INFINITE) == WAIT_FAILED)
|
||||
BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("WaitForSingleObject() failed");
|
||||
|
||||
DWORD exit_code;
|
||||
if (!::GetExitCodeProcess(p.process_handle(), &exit_code))
|
||||
BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("GetExitCodeProcess() failed");
|
||||
|
||||
return exit_code;
|
||||
}
|
||||
|
||||
template <class Process>
|
||||
inline DWORD wait_for_exit(const Process &p, boost::system::error_code &ec)
|
||||
{
|
||||
DWORD exit_code = 1;
|
||||
|
||||
if (::WaitForSingleObject(p.process_handle(), INFINITE) == WAIT_FAILED)
|
||||
BOOST_PROCESS_RETURN_LAST_SYSTEM_ERROR(ec);
|
||||
else if (!::GetExitCodeProcess(p.process_handle(), &exit_code))
|
||||
BOOST_PROCESS_RETURN_LAST_SYSTEM_ERROR(ec);
|
||||
else
|
||||
ec.clear();
|
||||
|
||||
return exit_code;
|
||||
}
|
||||
|
||||
}}}
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user