diff options
Diffstat (limited to 'indra/llcommon/llprocess.cpp')
| -rw-r--r-- | indra/llcommon/llprocess.cpp | 22 | 
1 files changed, 17 insertions, 5 deletions
diff --git a/indra/llcommon/llprocess.cpp b/indra/llcommon/llprocess.cpp index 912e596c3f..2800cc5608 100644 --- a/indra/llcommon/llprocess.cpp +++ b/indra/llcommon/llprocess.cpp @@ -176,13 +176,13 @@ public:              // In general, our streambuf might contain a number of different              // physical buffers; iterate over those.              bool keepwriting = true; -            for (const_buffer_sequence::const_iterator bufi(bufs.begin()), bufend(bufs.end()); +            for (auto bufi = buffer_sequence_begin(bufs), bufend = buffer_sequence_end(bufs);                   bufi != bufend && keepwriting; ++bufi)              {                  // http://www.boost.org/doc/libs/1_49_0_beta1/doc/html/boost_asio/reference/buffer.html#boost_asio.reference.buffer.accessing_buffer_contents                  // Although apr_file_write() accepts const void*, we                  // manipulate const char* so we can increment the pointer. -                const char* remainptr = boost::asio::buffer_cast<const char*>(*bufi); +                const char* remainptr = static_cast<const char*>((*bufi).data());                  std::size_t remainlen = boost::asio::buffer_size(*bufi);                  while (remainlen)                  { @@ -377,14 +377,14 @@ public:              // In general, the mutable_buffer_sequence returned by prepare() might              // contain a number of different physical buffers; iterate over those.              std::size_t tocommit(0); -            for (mutable_buffer_sequence::const_iterator bufi(bufs.begin()), bufend(bufs.end()); +            for (auto bufi = buffer_sequence_begin(bufs), bufend = buffer_sequence_end(bufs);                   bufi != bufend; ++bufi)              {                  // http://www.boost.org/doc/libs/1_49_0_beta1/doc/html/boost_asio/reference/buffer.html#boost_asio.reference.buffer.accessing_buffer_contents                  std::size_t toread(boost::asio::buffer_size(*bufi));                  apr_size_t gotten(toread);                  apr_status_t err = apr_file_read(mPipe, -                                                 boost::asio::buffer_cast<void*>(*bufi), +                                                 static_cast<void*>((*bufi).data()),                                                   &gotten);                  // EAGAIN is exactly what we want from a nonblocking pipe.                  // Rather than waiting for data, it should return immediately. @@ -691,10 +691,22 @@ LLProcess::LLProcess(const LLSDOrParams& params):      // terminate with a null pointer      argv.push_back(NULL); +    // create an env vector for the child process +    std::vector<const char*> envv; + +    // Add environment value assignments. See above remarks about c_str(). +    for (const std::string& env : params.envs) +    { +        envv.push_back(env.c_str()); +    } + +    // terminate with a null pointer +    envv.push_back(NULL); +      // Launch! The NULL would be the environment block, if we were passing      // one. Hand-expand chkapr() macro so we can fill in the actual command      // string instead of the variable names. -    if (ll_apr_warn_status(apr_proc_create(&mProcess, argv[0], &argv[0], NULL, procattr, +    if (ll_apr_warn_status(apr_proc_create(&mProcess, argv[0], &argv[0], &envv[0], procattr,                                             mPool)))      {          LLTHROW(LLProcessError(STRINGIZE(params << " failed")));  | 
