diff --git a/libraries/libvapours/include/vapours/prfile2/pdm/prfile2_pdm_upper_layer_api.hpp b/libraries/libvapours/include/vapours/prfile2/pdm/prfile2_pdm_upper_layer_api.hpp
index c2056aad9..48ec04f2b 100644
--- a/libraries/libvapours/include/vapours/prfile2/pdm/prfile2_pdm_upper_layer_api.hpp
+++ b/libraries/libvapours/include/vapours/prfile2/pdm/prfile2_pdm_upper_layer_api.hpp
@@ -23,6 +23,14 @@ namespace ams::prfile2::pdm {
namespace part {
pdm::Error CheckDataEraseRequest(HandleType part_handle, bool *out);
+ pdm::Error CheckMediaInsert(HandleType part_handle, bool *out);
+
+ }
+
+ namespace disk {
+
+ pdm::Error CheckDataEraseRequest(HandleType disk_handle, bool *out);
+ pdm::Error CheckMediaInsert(HandleType disk_handle, bool *out);
}
diff --git a/libraries/libvapours/include/vapours/prfile2/prfile2_drv.hpp b/libraries/libvapours/include/vapours/prfile2/prfile2_drv.hpp
index c093ae653..2130d4bf4 100644
--- a/libraries/libvapours/include/vapours/prfile2/prfile2_drv.hpp
+++ b/libraries/libvapours/include/vapours/prfile2/prfile2_drv.hpp
@@ -26,4 +26,6 @@ namespace ams::prfile2::drv {
pf::Error Initialize(Volume *volume);
+ bool IsInserted(Volume *volume);
+
}
diff --git a/libraries/libvapours/source/prfile2/pdm/prfile2_pdm_upper_layer_disk_api.cpp b/libraries/libvapours/source/prfile2/pdm/prfile2_pdm_upper_layer_disk_api.cpp
new file mode 100644
index 000000000..75c666089
--- /dev/null
+++ b/libraries/libvapours/source/prfile2/pdm/prfile2_pdm_upper_layer_disk_api.cpp
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#if defined(ATMOSPHERE_IS_STRATOSPHERE)
+#include
+#elif defined(ATMOSPHERE_IS_MESOSPHERE)
+#include
+#elif defined(ATMOSPHERE_IS_EXOSPHERE)
+#include
+#else
+#include
+#endif
+#include "prfile2_pdm_disk_set.hpp"
+
+namespace ams::prfile2::pdm::disk {
+
+ pdm::Error CheckDataEraseRequest(HandleType disk_handle, bool *out) {
+ /* Check parameters. */
+ Disk *disk = GetDisk(disk_handle);
+ if (out == nullptr || disk == nullptr) {
+ return pdm::Error_InvalidParameter;
+ }
+
+ /* Check for data erase function. */
+ *out = disk->erase_callback != nullptr;
+ return pdm::Error_Ok;
+ }
+
+ pdm::Error CheckMediaInsert(HandleType disk_handle, bool *out) {
+ /* Check parameters. */
+ Disk *disk = GetDisk(disk_handle);
+ if (out == nullptr || disk == nullptr) {
+ return pdm::Error_InvalidParameter;
+ }
+
+ /* Get whether the disk is inserted. */
+ *out = disk->is_inserted;
+ return pdm::Error_Ok;
+ }
+
+}
diff --git a/libraries/libvapours/source/prfile2/pdm/prfile2_pdm_upper_layer_part_api.cpp b/libraries/libvapours/source/prfile2/pdm/prfile2_pdm_upper_layer_part_api.cpp
index 212c87e33..7e0a95f08 100644
--- a/libraries/libvapours/source/prfile2/pdm/prfile2_pdm_upper_layer_part_api.cpp
+++ b/libraries/libvapours/source/prfile2/pdm/prfile2_pdm_upper_layer_part_api.cpp
@@ -33,15 +33,19 @@ namespace ams::prfile2::pdm::part {
return pdm::Error_InvalidParameter;
}
- /* Get the disk. */
- Disk *disk = GetDisk(part->disk_handle);
- if (disk == nullptr) {
+ /* Check the disk. */
+ return pdm::disk::CheckDataEraseRequest(part->disk_handle, out);
+ }
+
+ pdm::Error CheckMediaInsert(HandleType part_handle, bool *out) {
+ /* Check parameters. */
+ Partition *part = GetPartition(part_handle);
+ if (out == nullptr || part == nullptr) {
return pdm::Error_InvalidParameter;
}
- /* Check for data erase function. */
- *out = disk->erase_callback != nullptr;
- return pdm::Error_Ok;
+ /* Check if the disk is inserted. */
+ return pdm::disk::CheckMediaInsert(part->disk_handle, out);
}
}
diff --git a/libraries/libvapours/source/prfile2/prfile2_drv.cpp b/libraries/libvapours/source/prfile2/prfile2_drv.cpp
index ddfd79611..7d00a2c2a 100644
--- a/libraries/libvapours/source/prfile2/prfile2_drv.cpp
+++ b/libraries/libvapours/source/prfile2/prfile2_drv.cpp
@@ -42,4 +42,12 @@ namespace ams::prfile2::drv {
return pf::Error_Ok;
}
+ bool IsInserted(Volume *volume) {
+ /* Check inserted. */
+ /* NOTE: Error is not checked here. */
+ bool inserted = false;
+ pdm::part::CheckMediaInsert(volume->partition_handle, std::addressof(inserted));
+ return inserted;
+ }
+
}
diff --git a/libraries/libvapours/source/prfile2/prfile2_volume.cpp b/libraries/libvapours/source/prfile2/prfile2_volume.cpp
index 7ff09c2a5..d8be0bd5a 100644
--- a/libraries/libvapours/source/prfile2/prfile2_volume.cpp
+++ b/libraries/libvapours/source/prfile2/prfile2_volume.cpp
@@ -272,6 +272,8 @@ namespace ams::prfile2::vol {
vol->tail_entry.tracker_size = util::size(vol->tail_entry.tracker_buf);
vol->tail_entry.tracker_bits = vol->tail_entry.tracker_buf;
+ /* NOTE: Cluster link is cleared here, but we already memset vol to zero, so it's unnecessary. */
+
/* Initialize driver for volume. */
if (auto err = drv::Initialize(vol); err != pf::Error_Ok) {
return SetLastErrorAndReturn(err);
@@ -310,7 +312,7 @@ namespace ams::prfile2::vol {
/* Perform mount as appropriate. */
const auto check_mount_err = /* TODO vol::CheckMediaInsertForAttachMount(vol) */ pf::Error_Ok;
- const bool inserted = /* TODO: drv::IsInserted(vol) */ false;
+ const bool inserted = drv::IsInserted(vol);
if (check_mount_err != pf::Error_Ok) {
if (inserted) {
drive_table->SetDiskInserted(true);