From d092a88a93922368782e9c9ab48c6a8cfa6d36f7 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 21 Aug 2018 18:16:52 +0200 Subject: system/Open: new UniqueFileDescriptor constructing library --- Makefile.am | 1 + src/fs/io/FileReader.cxx | 6 ++-- src/system/Open.cxx | 89 ++++++++++++++++++++++++++++++++++++++++++++++++ src/system/Open.hxx | 55 ++++++++++++++++++++++++++++++ 4 files changed, 147 insertions(+), 4 deletions(-) create mode 100644 src/system/Open.cxx create mode 100644 src/system/Open.hxx diff --git a/Makefile.am b/Makefile.am index 2ee3063ab..49e92eddc 100644 --- a/Makefile.am +++ b/Makefile.am @@ -615,6 +615,7 @@ libsystem_a_SOURCES = \ src/system/FatalError.cxx src/system/FatalError.hxx \ src/system/FileDescriptor.cxx src/system/FileDescriptor.hxx \ src/system/UniqueFileDescriptor.hxx \ + src/system/Open.cxx src/system/Open.hxx \ src/system/EventPipe.cxx src/system/EventPipe.hxx \ src/system/EventFD.cxx src/system/EventFD.hxx \ src/system/SignalFD.cxx src/system/SignalFD.hxx \ diff --git a/src/fs/io/FileReader.cxx b/src/fs/io/FileReader.cxx index afc4e701c..1138d0b8d 100644 --- a/src/fs/io/FileReader.cxx +++ b/src/fs/io/FileReader.cxx @@ -21,6 +21,7 @@ #include "FileReader.hxx" #include "fs/FileInfo.hxx" #include "system/Error.hxx" +#include "system/Open.hxx" #include @@ -88,11 +89,8 @@ FileReader::Close() noexcept #else FileReader::FileReader(Path _path) - :path(_path) + :path(_path), fd(OpenReadOnly(path.c_str())) { - fd.OpenReadOnly(path.c_str()); - if (!fd.IsDefined()) - throw FormatErrno("Failed to open %s", path.ToUTF8().c_str()); } FileInfo diff --git a/src/system/Open.cxx b/src/system/Open.cxx new file mode 100644 index 000000000..193e50ccf --- /dev/null +++ b/src/system/Open.cxx @@ -0,0 +1,89 @@ +/* + * Copyright 2018 Max Kellermann + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#include "Open.hxx" +#include "Error.hxx" +#include "UniqueFileDescriptor.hxx" + +#include + +UniqueFileDescriptor +OpenReadOnly(const char *path) +{ + UniqueFileDescriptor fd; + if (!fd.OpenReadOnly(path)) + throw FormatErrno("Failed to open '%s'", path); + + return fd; +} + +#ifdef __linux__ + +UniqueFileDescriptor +OpenPath(const char *path, int flags) +{ + UniqueFileDescriptor fd; + if (!fd.Open(path, O_PATH|flags)) + throw FormatErrno("Failed to open '%s'", path); + + return fd; +} + +UniqueFileDescriptor +OpenPath(FileDescriptor directory, const char *name, int flags) +{ + UniqueFileDescriptor fd; + if (!fd.Open(directory, name, O_PATH|flags)) + throw FormatErrno("Failed to open '%s'", name); + + return fd; +} + +UniqueFileDescriptor +OpenReadOnly(FileDescriptor directory, const char *name, int flags) +{ + UniqueFileDescriptor fd; + if (!fd.Open(directory, name, O_RDONLY|flags)) + throw FormatErrno("Failed to open '%s'", name); + + return fd; +} + +UniqueFileDescriptor +OpenDirectory(FileDescriptor directory, const char *name, int flags) +{ + UniqueFileDescriptor fd; + if (!fd.Open(directory, name, O_DIRECTORY|O_RDONLY|flags)) + throw FormatErrno("Failed to open '%s'", name); + + return fd; +} + +#endif diff --git a/src/system/Open.hxx b/src/system/Open.hxx new file mode 100644 index 000000000..af4e50bf5 --- /dev/null +++ b/src/system/Open.hxx @@ -0,0 +1,55 @@ +/* + * Copyright 2018 Max Kellermann + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef OPEN_HXX +#define OPEN_HXX + +class FileDescriptor; +class UniqueFileDescriptor; + +UniqueFileDescriptor +OpenReadOnly(const char *path); + +#ifdef __linux__ + +UniqueFileDescriptor +OpenPath(const char *path, int flags=0); + +UniqueFileDescriptor +OpenPath(FileDescriptor directory, const char *name, int flags=0); + +UniqueFileDescriptor +OpenReadOnly(FileDescriptor directory, const char *name, int flags=0); + +UniqueFileDescriptor +OpenDirectory(FileDescriptor directory, const char *name, int flags=0); + +#endif + +#endif -- cgit v1.2.3