readpageauxilliary.c 810 B

1234567891011121314151617181920212223242526272829303132333435
  1. #include "logfsos.h"
  2. #include "logfs.h"
  3. #include "nandfs.h"
  4. #include "local.h"
  5. static int
  6. countzeros(uchar byte)
  7. {
  8. int b, count;
  9. for (b = 0x80, count = 0; b; b>>= 1)
  10. if ((byte & b) == 0)
  11. count++;
  12. return count;
  13. }
  14. char *
  15. nandfsreadpageauxiliary(Nandfs *nandfs, NandfsTags *tags, long block, int page, int correct, LogfsLowLevelReadResult *result)
  16. {
  17. NandfsAuxiliary hdr;
  18. char *rv;
  19. rv = (*nandfs->read)(nandfs->magic, &hdr, sizeof(hdr), nandfs->rawblocksize * (nandfs->baseblock + block) + page * NandfsFullSize + NandfsPageSize);
  20. if (rv)
  21. return rv;
  22. if (countzeros(hdr.blockstatus) > 2) {
  23. *result = LogfsLowLevelReadResultBad;
  24. return nil;
  25. }
  26. if (correct)
  27. *result = _nandfscorrectauxiliary(&hdr);
  28. else
  29. *result = LogfsLowLevelReadResultOk;
  30. _nandfsextracttags(&hdr, tags);
  31. return nil;
  32. }