Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r49413 - in sandbox/SOC/2006/process/trunk/boost/process: . detail
From: jmmv84_at_[hidden]
Date: 2008-10-20 19:52:25


Author: jmmv
Date: 2008-10-20 19:52:25 EDT (Mon, 20 Oct 2008)
New Revision: 49413
URL: http://svn.boost.org/trac/boost/changeset/49413

Log:
Avoid using getcwd(NULL, 0) because this is not portable.

Text files modified:
   sandbox/SOC/2006/process/trunk/boost/process/context.hpp | 12 ++++--------
   sandbox/SOC/2006/process/trunk/boost/process/detail/posix_ops.hpp | 35 +++++++++++++++++++++++++++++++++++
   2 files changed, 39 insertions(+), 8 deletions(-)

Modified: sandbox/SOC/2006/process/trunk/boost/process/context.hpp
==============================================================================
--- sandbox/SOC/2006/process/trunk/boost/process/context.hpp (original)
+++ sandbox/SOC/2006/process/trunk/boost/process/context.hpp 2008-10-20 19:52:25 EDT (Mon, 20 Oct 2008)
@@ -1,7 +1,7 @@
 //
 // Boost.Process
 //
-// Copyright (c) 2006 Julio M. Merino Vidal.
+// Copyright (c) 2006, 2008 Julio M. Merino Vidal.
 //
 // Distributed under the Boost Software License, Version 1.0.
 // (See accompanying file LICENSE_1_0.txt or copy at
@@ -24,6 +24,8 @@
 
 #if defined(BOOST_PROCESS_POSIX_API)
 # include <errno.h>
+#
+# include <boost/process/detail/posix_ops.hpp>
 #elif defined(BOOST_PROCESS_WIN32_API)
 # include <tchar.h>
 # include <windows.h>
@@ -82,13 +84,7 @@
 basic_work_directory_context< Path >::basic_work_directory_context(void)
 {
 #if defined(BOOST_PROCESS_POSIX_API)
- const char* buf = ::getcwd(NULL, 0);
- if (buf == NULL)
- boost::throw_exception
- (system_error
- ("boost::process::context::context",
- "getcwd(2) failed", errno));
- m_work_directory = buf;
+ m_work_directory = detail::get_work_directory< Path >();
 #elif defined(BOOST_PROCESS_WIN32_API)
     DWORD length = ::GetCurrentDirectory(0, NULL);
     TCHAR* buf = new TCHAR[length * sizeof(TCHAR)];

Modified: sandbox/SOC/2006/process/trunk/boost/process/detail/posix_ops.hpp
==============================================================================
--- sandbox/SOC/2006/process/trunk/boost/process/detail/posix_ops.hpp (original)
+++ sandbox/SOC/2006/process/trunk/boost/process/detail/posix_ops.hpp 2008-10-20 19:52:25 EDT (Mon, 20 Oct 2008)
@@ -132,6 +132,41 @@
 // ------------------------------------------------------------------------
 
 //!
+//! \brief Gets the current work directory.
+//!
+//! Returns the path to the current work directory, without imposing any
+//! limits on its size as the native getcwd(2) does. Note that calling
+//! getcwd(NULL, 0) is not portable, hence why we have this auxiliary
+//! function.
+//!
+template< class Path >
+inline
+Path
+get_work_directory(void)
+{
+ size_t buflen = 256;
+ boost::scoped_array< char > buf(new char[buflen]);
+ char *res;
+ do {
+ res = ::getcwd(buf.get(), buflen);
+ if (res == NULL) {
+ if (errno == ERANGE) {
+ buflen *= 2;
+ buf.reset(new char[buflen]);
+ } else {
+ boost::throw_exception
+ (system_error
+ ("boost::process::detail::posix_ops::get_work_directory",
+ "getcwd(2) failed", errno));
+ }
+ }
+ } while (res == NULL);
+ return Path(buf.get());
+}
+
+// ------------------------------------------------------------------------
+
+//!
 //! Holds a mapping between native file descriptors and their corresponding
 //! pipes to set up communication between the parent and the %child process.
 //!


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk