mirror of
https://github.com/Llewellynvdm/conky.git
synced 2024-12-26 04:17:33 +00:00
Emulate O_CLOEXEC on systems that don't support it
This commit is contained in:
parent
031e79e77e
commit
0493ba853c
@ -34,6 +34,9 @@ check_include_files(dirent.h HAVE_DIRENT_H)
|
||||
# Check for some functions
|
||||
check_function_exists(strndup HAVE_STRNDUP)
|
||||
|
||||
check_symbol_exists(pipe2 "unistd.h" HAVE_PIPE2)
|
||||
check_symbol_exists(O_CLOEXEC "fcntl.h" HAVE_O_CLOEXEC)
|
||||
|
||||
AC_SEARCH_LIBS(clock_gettime "time.h" CLOCK_GETTIME_LIB "rt")
|
||||
if(NOT CLOCK_GETTIME_LIB)
|
||||
message(FATAL_ERROR "clock_gettime not found.")
|
||||
|
@ -33,6 +33,9 @@
|
||||
#cmakedefine HAVE_FOPENCOOKIE 1
|
||||
#cmakedefine HAVE_FUNOPEN 1
|
||||
|
||||
#cmakedefine HAVE_PIPE2 1
|
||||
#cmakedefine HAVE_O_CLOEXEC 1
|
||||
|
||||
#cmakedefine BUILD_X11 1
|
||||
|
||||
#cmakedefine OWN_WINDOW 1
|
||||
|
@ -27,6 +27,38 @@
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#if !defined(HAVE_PIPE2) || !defined(HAVE_O_CLOEXEC)
|
||||
#include <fcntl.h>
|
||||
|
||||
namespace {
|
||||
int pipe2_emulate(int pipefd[2], int flags)
|
||||
{
|
||||
if(pipe(pipefd) == -1)
|
||||
return -1;
|
||||
|
||||
if(flags & O_CLOEXEC) {
|
||||
// we emulate O_CLOEXEC if the system does not have it
|
||||
// not very thread-safe, but at least it works
|
||||
|
||||
for(int i = 0; i < 2; ++i) {
|
||||
int r = fcntl(pipefd[i], F_GETFD);
|
||||
if(r == -1)
|
||||
return -1;
|
||||
|
||||
if(fcntl(pipefd[i], F_SETFD, r | FD_CLOEXEC) == -1)
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int (* const pipe2_ptr)(int[2], int) = &pipe2_emulate;
|
||||
}
|
||||
#else
|
||||
int (* const pipe2_ptr)(int[2], int) = &pipe2;
|
||||
#endif
|
||||
|
||||
std::string strerror_r(int errnum)
|
||||
{
|
||||
char buf[100];
|
||||
@ -36,7 +68,7 @@ std::string strerror_r(int errnum)
|
||||
std::pair<int, int> pipe2(int flags)
|
||||
{
|
||||
int fd[2];
|
||||
if(pipe2(fd, flags) == -1)
|
||||
if(pipe2_ptr(fd, flags) == -1)
|
||||
throw errno_error("pipe2");
|
||||
else
|
||||
return std::pair<int, int>(fd[0], fd[1]);
|
||||
|
@ -24,7 +24,11 @@
|
||||
#ifndef CPPWRAP_HH
|
||||
#define CPPWRAP_HH
|
||||
|
||||
#ifdef HAVE_O_CLOEXEC
|
||||
#include <fcntl.h>
|
||||
#else
|
||||
enum { O_CLOEXEC = 02000000 };
|
||||
#endif
|
||||
|
||||
#include <cerrno>
|
||||
#include <stdexcept>
|
||||
|
Loading…
Reference in New Issue
Block a user