diff --git a/src/AbstractDiskWriter.cc b/src/AbstractDiskWriter.cc index ed0d1842..0aad2eba 100644 --- a/src/AbstractDiskWriter.cc +++ b/src/AbstractDiskWriter.cc @@ -104,6 +104,24 @@ void AbstractDiskWriter::closeFile() } } +namespace { +int openFileWithFlags(const std::string& filename, int flags, + error_code::Value errCode) +{ + int fd; + while((fd = a2open(utf8ToWChar(filename).c_str(), flags, OPEN_MODE)) == -1 + && errno == EINTR); + if(fd < 0) { + int errNum = errno; + throw DL_ABORT_EX3(errNum, fmt(EX_FILE_OPEN, + filename.c_str(), + util::safeStrerror(errNum).c_str()), + errCode); + } + return fd; +} +} // namespace + void AbstractDiskWriter::openExistingFile(int64_t totalLength) { int flags = O_BINARY; @@ -112,37 +130,15 @@ void AbstractDiskWriter::openExistingFile(int64_t totalLength) } else { flags |= O_RDWR; } - while((fd_ = a2open(utf8ToWChar(filename_).c_str(), - flags, OPEN_MODE)) == -1 && - errno == EINTR); - if(fd_ < 0) { - int errNum = errno; - throw DL_ABORT_EX3 - (errNum, - fmt(EX_FILE_OPEN, - filename_.c_str(), - util::safeStrerror(errNum).c_str()), - error_code::FILE_OPEN_ERROR); - } + fd_ = openFileWithFlags(filename_, flags, error_code::FILE_OPEN_ERROR); } void AbstractDiskWriter::createFile(int addFlags) { assert(!filename_.empty()); util::mkdirs(File(filename_).getDirname()); - - while((fd_ = a2open(utf8ToWChar(filename_).c_str(), - O_CREAT|O_RDWR|O_TRUNC|O_BINARY|addFlags, - OPEN_MODE)) == -1 && errno == EINTR); - if(fd_ < 0) { - int errNum = errno; - throw DL_ABORT_EX3 - (errNum, - fmt(EX_FILE_OPEN, - filename_.c_str(), - util::safeStrerror(errNum).c_str()), - error_code::FILE_CREATE_ERROR); - } + fd_ = openFileWithFlags(filename_, O_CREAT|O_RDWR|O_TRUNC|O_BINARY|addFlags, + error_code::FILE_CREATE_ERROR); } ssize_t AbstractDiskWriter::writeDataInternal(const unsigned char* data,