Add sub-controls for Hack array compat runtime checks
[hiphop-php.git] / hphp / runtime / base / pipe.cpp
blob00b53a23a2b2c773250f04138e4f97a7554cbc5f
1 /*
2 +----------------------------------------------------------------------+
3 | HipHop for PHP |
4 +----------------------------------------------------------------------+
5 | Copyright (c) 2010-present Facebook, Inc. (http://www.facebook.com) |
6 +----------------------------------------------------------------------+
7 | This source file is subject to version 3.01 of the PHP license, |
8 | that is bundled with this package in the file LICENSE, and is |
9 | available through the world-wide-web at the following url: |
10 | http://www.php.net/license/3_01.txt |
11 | If you did not receive a copy of the PHP license and are unable to |
12 | obtain it through the world-wide-web, please send a note to |
13 | license@php.net so we can mail you a copy immediately. |
14 +----------------------------------------------------------------------+
17 #include "hphp/runtime/base/pipe.h"
19 #include "hphp/runtime/base/type-string.h"
21 #ifdef _MSC_VER
22 #include "hphp/util/process.h"
23 #else
24 #include "hphp/util/light-process.h"
25 #endif
27 namespace HPHP {
29 IMPLEMENT_RESOURCE_ALLOCATION(Pipe)
30 ///////////////////////////////////////////////////////////////////////////////
32 Pipe::Pipe() {
35 Pipe::~Pipe() {
36 closeImpl();
39 bool Pipe::open(const String& filename, const String& mode) {
40 assert(m_stream == nullptr);
41 assert(getFd() == -1);
43 #ifdef _MSC_VER
44 auto old_cwd = Process::GetCurrentDirectory();
45 chdir(g_context->getCwd().data());
46 FILE* f = _popen(filename.data(), mode.data());
47 chdir(old_cwd.c_str());
48 #else
49 FILE *f = LightProcess::popen(filename.data(), mode.data(),
50 g_context->getCwd().data());
51 #endif
52 if (!f) {
53 return false;
55 m_stream = f;
56 setFd(fileno(f));
57 return true;
60 bool Pipe::close() {
61 invokeFiltersOnClose();
62 return closeImpl();
65 bool Pipe::closeImpl() {
66 bool ret = true;
67 s_pcloseRet = 0;
68 if (valid() && !isClosed()) {
69 assert(m_stream);
70 #ifdef _MSC_VER
71 int pcloseRet = _pclose(m_stream);
72 #else
73 int pcloseRet = LightProcess::pclose(m_stream);
74 if (WIFEXITED(pcloseRet)) pcloseRet = WEXITSTATUS(pcloseRet);
75 #endif
76 s_pcloseRet = pcloseRet;
77 ret = (pcloseRet == 0);
78 setIsClosed(true);
79 m_stream = nullptr;
81 File::closeImpl();
82 return ret;
85 ///////////////////////////////////////////////////////////////////////////////