summaryrefslogtreecommitdiff
path: root/src/libultra_code_O2/osPfsFreeBlocks.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libultra_code_O2/osPfsFreeBlocks.c')
-rw-r--r--src/libultra_code_O2/osPfsFreeBlocks.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/libultra_code_O2/osPfsFreeBlocks.c b/src/libultra_code_O2/osPfsFreeBlocks.c
new file mode 100644
index 000000000..c7e7adcbf
--- /dev/null
+++ b/src/libultra_code_O2/osPfsFreeBlocks.c
@@ -0,0 +1,36 @@
+#include "ultra64.h"
+#include "global.h"
+#include "ultra64/pfs.h"
+
+s32 osPfsFreeBlocks(OSPfs* pfs, s32* leftoverBytes) {
+ s32 j;
+ s32 pages = 0;
+ __OSInode inode;
+ s32 ret = 0;
+ u8 bank;
+ s32 offset;
+
+ if (!(pfs->status & PFS_INITIALIZED)) {
+ return (PFS_ERR_INVALID);
+ }
+
+ if ((ret = __osCheckId(pfs)) != 0) {
+ return ret;
+ }
+
+ for (bank = PFS_ID_BANK_256K; bank < pfs->banks; bank++) {
+ if ((ret = __osPfsRWInode(pfs, &inode, PFS_READ, bank)) != 0) {
+ return ret;
+ }
+
+ offset = ((bank > PFS_ID_BANK_256K) ? 1 : pfs->inodeStartPage);
+ for (j = offset; j < PFS_INODE_SIZE_PER_PAGE; j++) {
+ if (inode.inodePage[j].ipage == PFS_PAGE_NOT_USED) {
+ pages++;
+ }
+ }
+ }
+
+ *leftoverBytes = pages * PFS_ONE_PAGE * BLOCKSIZE;
+ return 0;
+}