fs/io/FileOutputStream: make linkat() mandatory on Linux
This commit is contained in:
parent
d11e1d5880
commit
0642ce4795
|
@ -240,10 +240,6 @@ fi
|
|||
AC_SEARCH_LIBS([socket], [network socket])
|
||||
AC_SEARCH_LIBS([gethostbyname], [nsl])
|
||||
|
||||
if test x$host_is_linux = xyes; then
|
||||
AC_CHECK_FUNCS(linkat)
|
||||
fi
|
||||
|
||||
AC_CHECK_FUNCS(getpwnam_r getpwuid_r)
|
||||
AC_CHECK_FUNCS(initgroups)
|
||||
AC_CHECK_FUNCS(fnmatch)
|
||||
|
|
|
@ -138,7 +138,7 @@ FileOutputStream::Cancel() noexcept
|
|||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
|
||||
#ifdef HAVE_LINKAT
|
||||
#ifdef __linux__
|
||||
#ifndef O_TMPFILE
|
||||
/* supported since Linux 3.11 */
|
||||
#define __O_TMPFILE 020000000
|
||||
|
@ -159,12 +159,12 @@ OpenTempFile(FileDescriptor &fd, Path path)
|
|||
return fd.Open(directory.c_str(), O_TMPFILE|O_WRONLY, 0666);
|
||||
}
|
||||
|
||||
#endif /* HAVE_LINKAT */
|
||||
#endif /* __linux__ */
|
||||
|
||||
inline void
|
||||
FileOutputStream::OpenCreate(bool visible)
|
||||
{
|
||||
#ifdef HAVE_LINKAT
|
||||
#ifdef __linux__
|
||||
/* try Linux's O_TMPFILE first */
|
||||
is_tmpfile = !visible && OpenTempFile(fd, GetPath());
|
||||
if (!is_tmpfile) {
|
||||
|
@ -175,7 +175,7 @@ FileOutputStream::OpenCreate(bool visible)
|
|||
0666))
|
||||
throw FormatErrno("Failed to create %s",
|
||||
GetPath().c_str());
|
||||
#ifdef HAVE_LINKAT
|
||||
#ifdef __linux__
|
||||
}
|
||||
#else
|
||||
(void)visible;
|
||||
|
@ -218,7 +218,7 @@ FileOutputStream::Commit()
|
|||
{
|
||||
assert(IsDefined());
|
||||
|
||||
#ifdef HAVE_LINKAT
|
||||
#ifdef __linux__
|
||||
if (is_tmpfile) {
|
||||
unlink(GetPath().c_str());
|
||||
|
||||
|
@ -251,7 +251,7 @@ FileOutputStream::Cancel() noexcept
|
|||
|
||||
switch (mode) {
|
||||
case Mode::CREATE:
|
||||
#ifdef HAVE_LINKAT
|
||||
#ifdef __linux__
|
||||
if (!is_tmpfile)
|
||||
#endif
|
||||
unlink(GetPath().c_str());
|
||||
|
|
|
@ -57,7 +57,7 @@ class FileOutputStream final : public OutputStream {
|
|||
FileDescriptor fd = FileDescriptor::Undefined();
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_LINKAT
|
||||
#ifdef __linux__
|
||||
/**
|
||||
* Was O_TMPFILE used? If yes, then linkat() must be used to
|
||||
* create a link to this file.
|
||||
|
|
Loading…
Reference in New Issue