projects
/
folly.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
(wangle) fix after-delete assert
[folly.git]
/
folly
/
Subprocess.cpp
diff --git
a/folly/Subprocess.cpp
b/folly/Subprocess.cpp
index ac8eab60d7a1423c8db0af85ef0b0998885c870b..c17e8849e8f080a2a722b84a35b5317a6a68b2df 100644
(file)
--- a/
folly/Subprocess.cpp
+++ b/
folly/Subprocess.cpp
@@
-39,7
+39,6
@@
#include <folly/Conv.h>
#include <folly/Exception.h>
#include <folly/Conv.h>
#include <folly/Exception.h>
-#include <folly/FileUtil.h>
#include <folly/ScopeGuard.h>
#include <folly/String.h>
#include <folly/io/Cursor.h>
#include <folly/ScopeGuard.h>
#include <folly/String.h>
#include <folly/io/Cursor.h>
@@
-256,29
+255,25
@@
void Subprocess::spawn(
// in case it fails before calling exec()
int errFds[2];
#if FOLLY_HAVE_PIPE2
// in case it fails before calling exec()
int errFds[2];
#if FOLLY_HAVE_PIPE2
-
int r = ::pipe2(errFds, O_CLOEXEC
);
+
checkUnixError(::pipe2(errFds, O_CLOEXEC), "pipe2"
);
#else
#else
-
int r = ::pipe(errFds
);
+
checkUnixError(::pipe(errFds), "pipe"
);
#endif
#endif
- checkUnixError(r, "pipe");
SCOPE_EXIT {
CHECK_ERR(::close(errFds[0]));
if (errFds[1] >= 0) {
CHECK_ERR(::close(errFds[1]));
}
};
SCOPE_EXIT {
CHECK_ERR(::close(errFds[0]));
if (errFds[1] >= 0) {
CHECK_ERR(::close(errFds[1]));
}
};
- // Ask the child to close the read end of the error pipe.
- options.fdActions_[errFds[0]] = CLOSE;
#if !FOLLY_HAVE_PIPE2
#if !FOLLY_HAVE_PIPE2
- r = fcntl(errFds[0], F_SETFD, FD_CLOEXEC);
- checkUnixError(
r
, "set FD_CLOEXEC");
+ // Ask the child to close the read end of the error pipe.
+ checkUnixError(
fcntl(errFds[0], F_SETFD, FD_CLOEXEC)
, "set FD_CLOEXEC");
// Set the close-on-exec flag on the write side of the pipe.
// This way the pipe will be closed automatically in the child if execve()
// succeeds. If the exec fails the child can write error information to the
// pipe.
// Set the close-on-exec flag on the write side of the pipe.
// This way the pipe will be closed automatically in the child if execve()
// succeeds. If the exec fails the child can write error information to the
// pipe.
- r = fcntl(errFds[1], F_SETFD, FD_CLOEXEC);
- checkUnixError(r, "set FD_CLOEXEC");
+ checkUnixError(fcntl(errFds[1], F_SETFD, FD_CLOEXEC), "set FD_CLOEXEC");
#endif
// Perform the actual work of setting up pipes then forking and
#endif
// Perform the actual work of setting up pipes then forking and
@@
-454,12
+449,9
@@
int Subprocess::prepareChild(const Options& options,
}
}
}
}
- // Close parent's ends of all pipes
- for (auto& p : pipes_) {
- if (::close(p.parentFd) == -1) {
- return errno;
- }
- }
+ // We don't have to explicitly close the parent's end of all pipes,
+ // as they all have the FD_CLOEXEC flag set and will be closed at
+ // exec time.
// Close all fds that we're supposed to close.
for (auto& p : options.fdActions_) {
// Close all fds that we're supposed to close.
for (auto& p : options.fdActions_) {
@@
-501,7
+493,6
@@
int Subprocess::runChild(const char* executable,
char** argv, char** env,
const Options& options) const {
// Now, finally, exec.
char** argv, char** env,
const Options& options) const {
// Now, finally, exec.
- int r;
if (options.usePath_) {
::execvp(executable, argv);
} else {
if (options.usePath_) {
::execvp(executable, argv);
} else {
@@
-826,4
+817,3
@@
Initializer initializer;
} // namespace
} // namespace folly
} // namespace
} // namespace folly
-