X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FFileUtil.cpp;h=a452644ecf15a67a1fef96322d213de7a4ec3f73;hb=a4eda9d3a960b35fbf1d5a3d4ac028a604637313;hp=2e130a32ad4cb311f8f06421b4bdb01727fe5bcf;hpb=bfd3d062d6b4f4d88de838d639facda105043380;p=folly.git diff --git a/folly/FileUtil.cpp b/folly/FileUtil.cpp index 2e130a32..a452644e 100644 --- a/folly/FileUtil.cpp +++ b/folly/FileUtil.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2013 Facebook, Inc. + * Copyright 2014 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,16 +14,25 @@ * limitations under the License. */ -#include "folly/FileUtil.h" +#include #include +#ifdef __APPLE__ +#include +#endif +#include +#include -#include "folly/detail/FileUtilDetail.h" +#include namespace folly { using namespace fileutil_detail; +int openNoInt(const char* name, int flags, mode_t mode) { + return wrapNoInt(open, name, flags, mode); +} + int closeNoInt(int fd) { int r = close(fd); // Ignore EINTR. On Linux, close() may only return EINTR after the file @@ -34,13 +43,51 @@ int closeNoInt(int fd) { // Interestingly enough, the Single Unix Specification says that the state // of the file descriptor is unspecified if close returns EINTR. In that // case, the safe thing to do is also not to retry close() -- leaking a file - // descriptor is probably better than closing the wrong file. + // descriptor is definitely better than closing the wrong file. if (r == -1 && errno == EINTR) { r = 0; } return r; } +int fsyncNoInt(int fd) { + return wrapNoInt(fsync, fd); +} + +int dupNoInt(int fd) { + return wrapNoInt(dup, fd); +} + +int dup2NoInt(int oldfd, int newfd) { + return wrapNoInt(dup2, oldfd, newfd); +} + +int fdatasyncNoInt(int fd) { +#if defined(__APPLE__) + return wrapNoInt(fcntl, fd, F_FULLFSYNC); +#elif defined(__FreeBSD__) + return wrapNoInt(fsync, fd); +#else + return wrapNoInt(fdatasync, fd); +#endif +} + +int ftruncateNoInt(int fd, off_t len) { + return wrapNoInt(ftruncate, fd, len); +} + +int truncateNoInt(const char* path, off_t len) { + return wrapNoInt(truncate, path, len); +} + +int flockNoInt(int fd, int operation) { + return wrapNoInt(flock, fd, operation); +} + +int shutdownNoInt(int fd, int how) { + return wrapNoInt(shutdown, fd, how); +} + ssize_t readNoInt(int fd, void* buf, size_t count) { return wrapNoInt(read, fd, buf, count); } @@ -85,17 +132,20 @@ ssize_t readvFull(int fd, iovec* iov, int count) { return wrapvFull(readv, fd, iov, count); } +#if FOLLY_HAVE_PREADV ssize_t preadvFull(int fd, iovec* iov, int count, off_t offset) { return wrapvFull(preadv, fd, iov, count, offset); } +#endif ssize_t writevFull(int fd, iovec* iov, int count) { return wrapvFull(writev, fd, iov, count); } +#if FOLLY_HAVE_PWRITEV ssize_t pwritevFull(int fd, iovec* iov, int count, off_t offset) { return wrapvFull(pwritev, fd, iov, count, offset); } +#endif } // namespaces -