Dep/Misc: More deps

This commit is contained in:
Aokromes
2015-07-19 15:03:13 +02:00
parent 652c612876
commit 87a427828a
90 changed files with 10305 additions and 0 deletions

View 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
View 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
View 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
View 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

File diff suppressed because it is too large Load Diff

2992
dep/cppformat/format.h Normal file

File diff suppressed because it is too large Load Diff

253
dep/cppformat/posix.cc Normal file
View 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
View 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
View 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
View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View File

@@ -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

View 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_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

View 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

View 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_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

View File

@@ -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

View 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

View 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_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

View 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_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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View 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

View 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

View 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_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

View 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

View File

@@ -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

View 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_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

View File

@@ -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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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_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

View 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_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

View 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_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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View 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

View 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

View File

@@ -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

View 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

View 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_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

View 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_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

View 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_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

View 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_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

View 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

View 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

View 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

View 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

View 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