summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libadhocutil/fileUtils.cpp10
-rw-r--r--libadhocutil/fileUtils.h15
-rw-r--r--libadhocutil/unittests/testFileUtils.cpp18
3 files changed, 43 insertions, 0 deletions
diff --git a/libadhocutil/fileUtils.cpp b/libadhocutil/fileUtils.cpp
index d114d30..23fce0e 100644
--- a/libadhocutil/fileUtils.cpp
+++ b/libadhocutil/fileUtils.cpp
@@ -12,6 +12,11 @@ namespace AdHoc {
return *pp;
}
+ FileHandle::FileHandle(int d) :
+ fh(d)
+ {
+ }
+
FileHandle::FileHandle(const boost::filesystem::path & path, int flags) :
fh(open(path.c_str(), flags))
{
@@ -33,6 +38,11 @@ namespace AdHoc {
close(fh);
}
+ FileHandle::operator int() const
+ {
+ return fh;
+ }
+
FileHandleStat::FileHandleStat(const boost::filesystem::path & path) :
FileHandle(path)
{
diff --git a/libadhocutil/fileUtils.h b/libadhocutil/fileUtils.h
index 6ab20d3..4df8c97 100644
--- a/libadhocutil/fileUtils.h
+++ b/libadhocutil/fileUtils.h
@@ -22,6 +22,12 @@ namespace AdHoc {
class DLL_PUBLIC FileHandle {
public:
/**
+ * Construct from an existing file descriptor.
+ * @param fd An open file descriptor.
+ */
+ FileHandle(int fd);
+
+ /**
* Open a new file handle.
* @param path Path of file to open.
* @param flags File handle flags
@@ -38,6 +44,15 @@ namespace AdHoc {
virtual ~FileHandle();
+ FileHandle(const FileHandle &) = delete;
+ void operator=(const FileHandle &) = delete;
+
+ /**
+ * Implicit conversion back to raw Unix file descriptor.
+ * @return The container file descriptor.
+ */
+ operator int() const;
+
/// The file handle.
const int fh;
};
diff --git a/libadhocutil/unittests/testFileUtils.cpp b/libadhocutil/unittests/testFileUtils.cpp
index 2a5ab60..0e1cb79 100644
--- a/libadhocutil/unittests/testFileUtils.cpp
+++ b/libadhocutil/unittests/testFileUtils.cpp
@@ -5,6 +5,14 @@
#include <definedDirs.h>
#include <sys.h>
+BOOST_AUTO_TEST_CASE( raw )
+{
+ int f = open("/proc/self/exe", O_RDONLY);
+ BOOST_REQUIRE(f != -1);
+ AdHoc::FileUtils::FileHandle fh(f);
+ BOOST_REQUIRE_EQUAL(f, fh);
+}
+
BOOST_AUTO_TEST_CASE( memmap )
{
AdHoc::FileUtils::MemMap f(rootDir / "testFileUtils.cpp");
@@ -13,6 +21,16 @@ BOOST_AUTO_TEST_CASE( memmap )
BOOST_REQUIRE_EQUAL(0, memcmp(f.data, "#define BOOST_TEST_MODULE FileUtils", 35));
}
+BOOST_AUTO_TEST_CASE( openmode )
+{
+ boost::filesystem::remove(binDir / "test.file");
+ BOOST_REQUIRE_THROW({
+ AdHoc::FileUtils::FileHandle fh(binDir / "test.file", O_RDONLY, S_IRWXU);
+ }, AdHoc::SystemExceptionOn);
+ AdHoc::FileUtils::FileHandle fh(binDir / "test.file", O_CREAT, S_IRWXU);
+ boost::filesystem::remove(binDir / "test.file");
+}
+
BOOST_AUTO_TEST_CASE( openfail )
{
BOOST_REQUIRE_THROW({