fs/io/FileOutputStream: add mode CREATE_VISIBLE

This commit is contained in:
Max Kellermann 2016-09-04 13:08:52 +02:00
parent f600e226da
commit d84f96a571
2 changed files with 17 additions and 5 deletions

View File

@ -26,7 +26,11 @@ FileOutputStream::FileOutputStream(Path _path, Mode _mode)
{ {
switch (mode) { switch (mode) {
case Mode::CREATE: case Mode::CREATE:
OpenCreate(); OpenCreate(false);
break;
case Mode::CREATE_VISIBLE:
OpenCreate(true);
break; break;
case Mode::APPEND_EXISTING: case Mode::APPEND_EXISTING:
@ -42,7 +46,7 @@ FileOutputStream::FileOutputStream(Path _path, Mode _mode)
#ifdef WIN32 #ifdef WIN32
inline void inline void
FileOutputStream::OpenCreate() FileOutputStream::OpenCreate(gcc_unused bool visible)
{ {
handle = CreateFile(path.c_str(), GENERIC_WRITE, 0, nullptr, handle = CreateFile(path.c_str(), GENERIC_WRITE, 0, nullptr,
CREATE_ALWAYS, CREATE_ALWAYS,
@ -147,11 +151,11 @@ OpenTempFile(FileDescriptor &fd, Path path)
#endif /* HAVE_LINKAT */ #endif /* HAVE_LINKAT */
inline void inline void
FileOutputStream::OpenCreate() FileOutputStream::OpenCreate(bool visible)
{ {
#ifdef HAVE_LINKAT #ifdef HAVE_LINKAT
/* try Linux's O_TMPFILE first */ /* try Linux's O_TMPFILE first */
is_tmpfile = OpenTempFile(fd, GetPath()); is_tmpfile = !visible && OpenTempFile(fd, GetPath());
if (!is_tmpfile) { if (!is_tmpfile) {
#endif #endif
/* fall back to plain POSIX */ /* fall back to plain POSIX */
@ -241,6 +245,7 @@ FileOutputStream::Cancel()
unlink(GetPath().c_str()); unlink(GetPath().c_str());
break; break;
case Mode::CREATE_VISIBLE:
case Mode::APPEND_EXISTING: case Mode::APPEND_EXISTING:
case Mode::APPEND_OR_CREATE: case Mode::APPEND_OR_CREATE:
/* can't roll this back */ /* can't roll this back */

View File

@ -64,6 +64,13 @@ public:
*/ */
CREATE, CREATE,
/**
* Like #CREATE, but no attempt is made to hide file
* contents during the transaction (e.g. via O_TMPFILE
* or a hidden temporary file).
*/
CREATE_VISIBLE,
/** /**
* Append to a file that already exists. If it does * Append to a file that already exists. If it does
* not, an exception is thrown. * not, an exception is thrown.
@ -103,7 +110,7 @@ public:
void Cancel(); void Cancel();
private: private:
void OpenCreate(); void OpenCreate(bool visible);
void OpenAppend(bool create); void OpenAppend(bool create);
bool Close() { bool Close() {