aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/file_sys
diff options
context:
space:
mode:
authorGravatar Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>2014-09-27 19:21:48 +0000
committerGravatar Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>2014-10-06 19:58:42 +0200
commit0be5c03176236fe602d49c32717a6f3af0a55465 (patch)
tree61573d4ed66ac5e7f46968ef871b3acf9f0c5b99 /src/core/file_sys
parent23c2fbfc7a900ae3c9f8791a87c5ad672f5778fe (diff)
FileSys: split the constructor into an Open method, in order to notify the opener something went wrong.
Kernel: Return an invalid handle to OpenFile when it failed to open.
Diffstat (limited to 'src/core/file_sys')
-rw-r--r--src/core/file_sys/archive_sdmc.cpp2
-rw-r--r--src/core/file_sys/file.h6
-rw-r--r--src/core/file_sys/file_romfs.cpp8
-rw-r--r--src/core/file_sys/file_romfs.h6
-rw-r--r--src/core/file_sys/file_sdmc.cpp38
-rw-r--r--src/core/file_sys/file_sdmc.h8
6 files changed, 54 insertions, 14 deletions
diff --git a/src/core/file_sys/archive_sdmc.cpp b/src/core/file_sys/archive_sdmc.cpp
index 8d082738..213923c0 100644
--- a/src/core/file_sys/archive_sdmc.cpp
+++ b/src/core/file_sys/archive_sdmc.cpp
@@ -46,6 +46,8 @@ bool Archive_SDMC::Initialize() {
std::unique_ptr<File> Archive_SDMC::OpenFile(const std::string& path, const Mode mode) const {
DEBUG_LOG(FILESYS, "called path=%s mode=%d", path.c_str(), mode);
File_SDMC* file = new File_SDMC(this, path, mode);
+ if (!file->Open())
+ return nullptr;
return std::unique_ptr<File>(file);
}
diff --git a/src/core/file_sys/file.h b/src/core/file_sys/file.h
index 443e6531..4013b6c3 100644
--- a/src/core/file_sys/file.h
+++ b/src/core/file_sys/file.h
@@ -19,6 +19,12 @@ public:
virtual ~File() { }
/**
+ * Open the file
+ * @return true if the file opened correctly
+ */
+ virtual bool Open() = 0;
+
+ /**
* Read data from the file
* @param offset Offset in bytes to start reading data from
* @param length Length in bytes of data to read from file
diff --git a/src/core/file_sys/file_romfs.cpp b/src/core/file_sys/file_romfs.cpp
index 3ef616e0..b55708df 100644
--- a/src/core/file_sys/file_romfs.cpp
+++ b/src/core/file_sys/file_romfs.cpp
@@ -18,6 +18,14 @@ File_RomFS::~File_RomFS() {
}
/**
+ * Open the file
+ * @return true if the file opened correctly
+ */
+bool File_RomFS::Open() {
+ return false;
+}
+
+/**
* Read data from the file
* @param offset Offset in bytes to start reading data from
* @param length Length in bytes of data to read from file
diff --git a/src/core/file_sys/file_romfs.h b/src/core/file_sys/file_romfs.h
index 06973eb9..5196701d 100644
--- a/src/core/file_sys/file_romfs.h
+++ b/src/core/file_sys/file_romfs.h
@@ -20,6 +20,12 @@ public:
~File_RomFS() override;
/**
+ * Open the file
+ * @return true if the file opened correctly
+ */
+ bool Open() override;
+
+ /**
* Read data from the file
* @param offset Offset in bytes to start reading data from
* @param length Length in bytes of data to read from file
diff --git a/src/core/file_sys/file_sdmc.cpp b/src/core/file_sys/file_sdmc.cpp
index 3ef2b0c0..26204392 100644
--- a/src/core/file_sys/file_sdmc.cpp
+++ b/src/core/file_sys/file_sdmc.cpp
@@ -19,20 +19,8 @@ File_SDMC::File_SDMC(const Archive_SDMC* archive, const std::string& path, const
// TODO(Link Mauve): normalize path into an absolute path without "..", it can currently bypass
// the root directory we set while opening the archive.
// For example, opening /../../etc/passwd can give the emulated program your users list.
- std::string real_path = archive->GetMountPoint() + path;
-
- if (!mode.create_flag && !FileUtil::Exists(real_path)) {
- file = nullptr;
- return;
- }
-
- std::string mode_string;
- if (mode.read_flag)
- mode_string += "r";
- if (mode.write_flag)
- mode_string += "w";
-
- file = new FileUtil::IOFile(real_path, mode_string.c_str());
+ this->path = archive->GetMountPoint() + path;
+ this->mode.hex = mode.hex;
}
File_SDMC::~File_SDMC() {
@@ -40,6 +28,28 @@ File_SDMC::~File_SDMC() {
}
/**
+ * Open the file
+ * @return true if the file opened correctly
+ */
+bool File_SDMC::Open() {
+ if (!mode.create_flag && !FileUtil::Exists(path)) {
+ ERROR_LOG(FILESYS, "Non-existing file %s can’t be open without mode create.", path.c_str());
+ return false;
+ }
+
+ std::string mode_string;
+ if (mode.read_flag && mode.write_flag)
+ mode_string = "w+";
+ else if (mode.read_flag)
+ mode_string = "r";
+ else if (mode.write_flag)
+ mode_string = "w";
+
+ file = new FileUtil::IOFile(path, mode_string.c_str());
+ return true;
+}
+
+/**
* Read data from the file
* @param offset Offset in bytes to start reading data from
* @param length Length in bytes of data to read from file
diff --git a/src/core/file_sys/file_sdmc.h b/src/core/file_sys/file_sdmc.h
index 6b3a1f3a..df032f7c 100644
--- a/src/core/file_sys/file_sdmc.h
+++ b/src/core/file_sys/file_sdmc.h
@@ -23,6 +23,12 @@ public:
~File_SDMC() override;
/**
+ * Open the file
+ * @return true if the file opened correctly
+ */
+ bool Open() override;
+
+ /**
* Read data from the file
* @param offset Offset in bytes to start reading data from
* @param length Length in bytes of data to read from file
@@ -61,6 +67,8 @@ public:
bool Close() const override;
private:
+ std::string path;
+ Mode mode;
FileUtil::IOFile* file;
};