Revert "fcntl a little less"

This reverts commits:
e5362a4ae5.
dd9a26715d.

These commits were incorrect because they stomped other flags, such as
O_NONBLOCK.
This commit is contained in:
ridiculousfish 2019-04-13 12:22:46 -07:00
parent 13c5f93d63
commit 2c7dc98337
2 changed files with 13 additions and 7 deletions

View File

@ -441,14 +441,13 @@ int main(int argc, char **argv) {
res = reader_read(STDIN_FILENO, {});
} else {
char *file = *(argv + (my_optind++));
#if defined(O_CLOEXEC)
int fd = open(file, O_RDONLY | O_CLOEXEC);
#else
int fd = open(file, O_RDONLY);
#endif
if (fd == -1) {
perror(file);
} else {
// OK to not do this atomically since we cannot have gone multithreaded yet.
set_cloexec(fd);
wcstring_list_t list;
for (char **ptr = argv + my_optind; *ptr; ptr++) {
list.push_back(str2wcstring(*ptr));

View File

@ -176,9 +176,16 @@ FILE *wfopen(const wcstring &path, const char *mode) {
}
bool set_cloexec(int fd) {
int flags = fcntl(fd, F_SETFD, FD_CLOEXEC);
if (flags == -1) return false;
return true;
// Note we don't want to overwrite existing flags like O_NONBLOCK which may be set. So fetch the
// existing flags and OR in our new one.
int flags = fcntl(fd, F_GETFD, 0);
if (flags < 0) {
return false;
}
if (flags & FD_CLOEXEC) {
return true;
}
return fcntl(fd, F_SETFD, flags | FD_CLOEXEC) >= 0;
}
static int wopen_internal(const wcstring &pathname, int flags, mode_t mode, bool cloexec) {