summaryrefslogtreecommitdiff
path: root/libnandfs/readpageauxilliary.c
diff options
context:
space:
mode:
Diffstat (limited to 'libnandfs/readpageauxilliary.c')
-rw-r--r--libnandfs/readpageauxilliary.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/libnandfs/readpageauxilliary.c b/libnandfs/readpageauxilliary.c
new file mode 100644
index 00000000..ba71d2b5
--- /dev/null
+++ b/libnandfs/readpageauxilliary.c
@@ -0,0 +1,35 @@
+#include "lib9.h"
+#include "logfs.h"
+#include "nandfs.h"
+#include "local.h"
+
+static int
+countzeros(uchar byte)
+{
+ int b, count;
+ for (b = 0x80, count = 0; b; b>>= 1)
+ if ((byte & b) == 0)
+ count++;
+ return count;
+}
+
+char *
+nandfsreadpageauxiliary(Nandfs *nandfs, NandfsTags *tags, long block, int page, int correct, LogfsLowLevelReadResult *result)
+{
+ NandfsAuxiliary hdr;
+ char *rv;
+
+ rv = (*nandfs->read)(nandfs->magic, &hdr, sizeof(hdr), nandfs->rawblocksize * (nandfs->baseblock + block) + page * NandfsFullSize + NandfsPageSize);
+ if (rv)
+ return rv;
+ if (countzeros(hdr.blockstatus) > 2) {
+ *result = LogfsLowLevelReadResultBad;
+ return nil;
+ }
+ if (correct)
+ *result = _nandfscorrectauxiliary(&hdr);
+ else
+ *result = LogfsLowLevelReadResultOk;
+ _nandfsextracttags(&hdr, tags);
+ return nil;
+}