Add a wrapper for open.

This centralizes the handling of O_BINARY and opens the way for hiding more
differences (like how open behaves with directories).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@186447 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola
2013-07-16 19:44:17 +00:00
parent 1a9c39e52a
commit c1b49b56d4
27 changed files with 130 additions and 119 deletions

View File

@@ -26,7 +26,6 @@
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
#include <cstdlib>
#include <fcntl.h>
#include <memory>
#if !defined(_MSC_VER) && !defined(__MINGW32__)
@@ -299,19 +298,14 @@ static void doDisplayTable(StringRef Name, object::Archive::child_iterator I) {
// Implement the 'x' operation. This function extracts files back to the file
// system.
static void doExtract(StringRef Name, object::Archive::child_iterator I) {
// Open up a file stream for writing
// FIXME: we should abstract this, O_BINARY in particular.
int OpenFlags = O_TRUNC | O_WRONLY | O_CREAT;
#ifdef O_BINARY
OpenFlags |= O_BINARY;
#endif
// Retain the original mode.
sys::fs::perms Mode = I->getAccessMode();
SmallString<128> Storage = Name;
int FD = open(Name.str().c_str(), OpenFlags, Mode);
if (FD < 0)
fail("Could not open output file");
int FD;
failIfError(
sys::fs::openFileForWrite(Storage.c_str(), FD, sys::fs::F_None, Mode),
Storage.c_str());
{
raw_fd_ostream file(FD, false);
@@ -559,13 +553,8 @@ static void performWriteOperation(ArchiveOperation Operation,
if (I->isNewMember()) {
const char *FileName = I->getNew();
int OpenFlags = O_RDONLY;
#ifdef O_BINARY
OpenFlags |= O_BINARY;
#endif
int FD = ::open(FileName, OpenFlags);
if (FD == -1)
return failIfError(error_code(errno, posix_category()), FileName);
int FD;
failIfError(sys::fs::openFileForRead(FileName, FD), FileName);
sys::fs::file_status Status;
failIfError(sys::fs::status(FD, Status), FileName);