Mercurial > hg > gpsynth
diff third_party/boost/process/self.hpp @ 0:add35537fdbb tip
Initial import
author | irh <ian.r.hobson@gmail.com> |
---|---|
date | Thu, 25 Aug 2011 11:05:55 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/third_party/boost/process/self.hpp Thu Aug 25 11:05:55 2011 +0100 @@ -0,0 +1,188 @@ +// +// Boost.Process +// ~~~~~~~~~~~~~ +// +// 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 +// +// 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/self.hpp + * + * Includes the declaration of the self class. + */ + +#ifndef BOOST_PROCESS_SELF_HPP +#define BOOST_PROCESS_SELF_HPP + +#include <boost/process/config.hpp> + +#if defined(BOOST_POSIX_API) +# include <boost/scoped_array.hpp> +# include <errno.h> +# include <unistd.h> +# include <limits.h> +# if defined(__APPLE__) +# include <crt_externs.h> +# endif +#elif defined(BOOST_WINDOWS_API) +# include <windows.h> +#else +# error "Unsupported platform." +#endif + +#include <boost/process/process.hpp> +#include <boost/process/environment.hpp> +#include <boost/noncopyable.hpp> +#include <boost/assert.hpp> +#include <string> + +#if defined(BOOST_POSIX_API) +extern "C" +{ + extern char **environ; +} +#endif + +namespace boost { +namespace process { + +/** + * The self class provides access to the process itself. + */ +class self : public process, public boost::noncopyable +{ +public: + /** + * Returns the self instance representing the caller's process. + */ + static self &get_instance() + { + static self *instance = 0; + if (!instance) + instance = new self; + return *instance; + } + + /** + * Returns the current environment. + * + * Returns the current process environment variables. Modifying the + * returned object has no effect on the current environment. + */ + static environment get_environment() + { + environment e; + +#if defined(BOOST_POSIX_API) +# if defined(__APPLE__) + char **env = *_NSGetEnviron(); +# else + char **env = environ; +# endif + + while (*env) + { + std::string s = *env; + std::string::size_type pos = s.find('='); + e.insert(environment::value_type(s.substr(0, pos), + s.substr(pos + 1))); + ++env; + } +#elif defined(BOOST_WINDOWS_API) +# ifdef GetEnvironmentStrings +# undef GetEnvironmentStrings +# endif + + char *ms_environ = GetEnvironmentStrings(); + if (!ms_environ) + BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR( + "GetEnvironmentStrings() failed"); + try + { + char *env = ms_environ; + while (*env) + { + std::string s = env; + std::string::size_type pos = s.find('='); + e.insert(environment::value_type(s.substr(0, pos), + s.substr(pos + 1))); + env += s.size() + 1; + } + } + catch (...) + { + FreeEnvironmentStringsA(ms_environ); + throw; + } + FreeEnvironmentStringsA(ms_environ); +#endif + + return e; + } + + /** + * Returns the current work directory. + */ + static std::string get_work_dir() + { +#if defined(BOOST_POSIX_API) +#if defined(PATH_MAX) + char buffer[PATH_MAX]; + char *cwd = buffer; + long size = PATH_MAX; +#elif defined(_PC_PATH_MAX) + errno = 0; + long size = pathconf("/", _PC_PATH_MAX); + if (size == -1 && errno) + BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("pathconf(2) failed"); + else if (size == -1) + size = BOOST_PROCESS_POSIX_PATH_MAX; + BOOST_ASSERT(size > 0); + boost::scoped_array<char> buffer(new char[size]); + char *cwd = buffer.get(); +#else + char buffer[BOOST_PROCESS_POSIX_PATH_MAX]; + char *cwd = buffer; + long size = BOOST_PROCESS_POSIX_PATH_MAX; +#endif + if (!getcwd(cwd, size)) + BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("getcwd(2) failed"); + BOOST_ASSERT(cwd[0] != '\0'); + return cwd; +#elif defined(BOOST_WINDOWS_API) + BOOST_ASSERT(MAX_PATH > 0); + char cwd[MAX_PATH]; + if (!GetCurrentDirectoryA(sizeof(cwd), cwd)) + BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR( + "GetCurrentDirectory() failed"); + BOOST_ASSERT(cwd[0] != '\0'); + return cwd; +#endif + } + +private: + /** + * Constructs a new self object. + * + * Creates a new self object that represents the current process. + */ + self() : +#if defined(BOOST_POSIX_API) + process(getpid()) +#elif defined(BOOST_WINDOWS_API) + process(GetCurrentProcessId()) +#endif + { + } +}; + +} +} + +#endif