readSpMap.c
上传用户:light_show
上传日期:2007-01-06
资源大小:218k
文件大小:2k
源码类别:

SCSI/ASPI

开发平台:

Unix_Linux

  1. #include "../nsrHdrs/nsr.h"
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <ctype.h>
  6. #include "chkudf.h"
  7. #include "protos.h"
  8. /*
  9.  *  Read a File Entry and extract the basics.
  10.  */
  11. int ReadSpaceMap(void)
  12. {
  13.   struct SpaceBitmapHdr *BMD;
  14.   int i;
  15.   for (i = 0; i < PTN_no; i++) {
  16.     if (Part_Info[i].Space != -1) {
  17.       printf("n--Reading the Space Bitmap Descriptor for partition reference %d.n", i);
  18.       printf("  Descriptor is %d sectors at %d:%d.n", 
  19.              Part_Info[i].SpLen >> bdivshift, i, Part_Info[i].Space);
  20.       BMD = (struct SpaceBitmapHdr *)malloc(Part_Info[i].SpLen);
  21.       if (BMD) {
  22.         ReadLBlocks(BMD, Part_Info[i].Space, i, Part_Info[i].SpLen >> bdivshift);
  23.         track_filespace(i, Part_Info[i].Space, Part_Info[i].SpLen);
  24.   
  25.         CheckTag((struct tag *)BMD, Part_Info[i].Space, TAGID_SPACE_BMAP, 
  26.                      0, Part_Info[i].SpLen);
  27.         if (Error.Code == ERR_TAGID) {
  28.           printf("**Not a space bitmap descriptor.n");
  29.         } else {
  30.           DumpError();
  31.         }
  32.         if (!Error.Code) {
  33.           printf("  Partition is %d blocks long, requiring %d bytes.n",
  34.                  Part_Info[i].Len, (Part_Info[i].Len + 7) >> 3);
  35.           if (U_endian32(BMD->N_Bits) != Part_Info[i].Len) {
  36.             printf("**Partition is %d blocks long and is described by %d bits.n",
  37.                    Part_Info[i].Len, U_endian32(BMD->N_Bits));
  38.           }
  39.           if ((U_endian32(BMD->N_Bits) + 7) >> 3 != U_endian32(BMD->N_Bytes)) {
  40.             printf("**Bitmap descriptor requires %d bytes to hold %d bits.n",
  41.                    U_endian32(BMD->N_Bytes), U_endian32(BMD->N_Bits));
  42.           }
  43.           if (Part_Info[i].SpMap && (U_endian32(BMD->N_Bytes) < Part_Info[i].SpLen)) {
  44.             memcpy(Part_Info[i].SpMap, 
  45.                    (UINT8 *)BMD + sizeof(struct SpaceBitmapHdr), U_endian32(BMD->N_Bytes));
  46.             printf("  Read the space bitmap for partition reference %d.n", i);
  47.           }
  48.         } else {
  49.           DumpError();
  50.         }
  51.         free(BMD);
  52.       } else {
  53.         printf("**Couldn't allocate memory for space bitmap.n");  // if (BMD)
  54.       }
  55.     }
  56.   }
  57.   return 0;
  58. }