diff --git a/Libraries/LibCore/File.cpp b/Libraries/LibCore/File.cpp index fd40d9b303..782960407c 100644 --- a/Libraries/LibCore/File.cpp +++ b/Libraries/LibCore/File.cpp @@ -33,6 +33,14 @@ namespace Core { +RefPtr File::open(const String& filename, IODevice::OpenMode mode, mode_t permissions) +{ + auto file = File::construct(filename); + if (!file->open_impl(mode, permissions)) + return nullptr; + return file; +} + File::File(const StringView& filename, Object* parent) : IODevice(parent) , m_filename(filename) @@ -54,6 +62,11 @@ bool File::open(int fd, IODevice::OpenMode mode, ShouldCloseFileDescription shou } bool File::open(IODevice::OpenMode mode) +{ + return open_impl(mode, 0666); +} + +bool File::open_impl(IODevice::OpenMode mode, mode_t permissions) { ASSERT(!m_filename.is_null()); int flags = 0; @@ -73,7 +86,7 @@ bool File::open(IODevice::OpenMode mode) flags |= O_TRUNC; if (mode & IODevice::MustBeNew) flags |= O_EXCL; - int fd = ::open(m_filename.characters(), flags, 0666); + int fd = ::open(m_filename.characters(), flags, permissions); if (fd < 0) { set_error(errno); return false; diff --git a/Libraries/LibCore/File.h b/Libraries/LibCore/File.h index fdfe6f785e..aa94dc35cf 100644 --- a/Libraries/LibCore/File.h +++ b/Libraries/LibCore/File.h @@ -36,6 +36,8 @@ class File final : public IODevice { public: virtual ~File() override; + static RefPtr open(const String& filename, IODevice::OpenMode, mode_t = 0644); + String filename() const { return m_filename; } void set_filename(const StringView& filename) { m_filename = filename; } @@ -59,6 +61,8 @@ private: } explicit File(const StringView&, Object* parent = nullptr); + bool open_impl(IODevice::OpenMode, mode_t); + String m_filename; ShouldCloseFileDescription m_should_close_file_descriptor { ShouldCloseFileDescription::Yes }; };