isovfy.c
上传用户:xiejiait
上传日期:2007-01-06
资源大小:881k
文件大小:17k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /*
  2.  * File isovfy.c - verify consistency of iso9660 filesystem.
  3.  *
  4.    Written by Eric Youngdale (1993).
  5.    Copyright 1993 Yggdrasil Computing, Incorporated
  6.    This program is free software; you can redistribute it and/or modify
  7.    it under the terms of the GNU General Public License as published by
  8.    the Free Software Foundation; either version 2, or (at your option)
  9.    any later version.
  10.    This program is distributed in the hope that it will be useful,
  11.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.    GNU General Public License for more details.
  14.    You should have received a copy of the GNU General Public License
  15.    along with this program; if not, write to the Free Software
  16.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  17. static char rcsid[] ="$Id: isovfy.c,v 1.5 1999/03/02 03:41:36 eric Exp $";
  18. #include "../config.h"
  19. #include <stdxlib.h>
  20. #include <unixstd.h>
  21. #include <strdefs.h>
  22. #include <stdio.h>
  23. #include <standard.h>
  24. #include <signal.h>
  25. FILE * infile;
  26. int blocksize;
  27. #define PAGE sizeof(buffer)
  28. #define ISODCL(from, to) (to - from + 1)
  29. struct iso_primary_descriptor {
  30. unsigned char type [ISODCL (  1,   1)]; /* 711 */
  31. unsigned char id [ISODCL (  2,   6)];
  32. unsigned char version [ISODCL (  7,   7)]; /* 711 */
  33. unsigned char unused1 [ISODCL (  8,   8)];
  34. unsigned char system_id [ISODCL (  9,  40)]; /* aunsigned chars */
  35. unsigned char volume_id [ISODCL ( 41,  72)]; /* dunsigned chars */
  36. unsigned char unused2 [ISODCL ( 73,  80)];
  37. unsigned char volume_space_size [ISODCL ( 81,  88)]; /* 733 */
  38. unsigned char unused3 [ISODCL ( 89, 120)];
  39. unsigned char volume_set_size [ISODCL (121, 124)]; /* 723 */
  40. unsigned char volume_sequence_number [ISODCL (125, 128)]; /* 723 */
  41. unsigned char logical_block_size [ISODCL (129, 132)]; /* 723 */
  42. unsigned char path_table_size [ISODCL (133, 140)]; /* 733 */
  43. unsigned char type_l_path_table [ISODCL (141, 144)]; /* 731 */
  44. unsigned char opt_type_l_path_table [ISODCL (145, 148)]; /* 731 */
  45. unsigned char type_m_path_table [ISODCL (149, 152)]; /* 732 */
  46. unsigned char opt_type_m_path_table [ISODCL (153, 156)]; /* 732 */
  47. unsigned char root_directory_record [ISODCL (157, 190)]; /* 9.1 */
  48. unsigned char volume_set_id [ISODCL (191, 318)]; /* dunsigned chars */
  49. unsigned char publisher_id [ISODCL (319, 446)]; /* achars */
  50. unsigned char preparer_id [ISODCL (447, 574)]; /* achars */
  51. unsigned char application_id [ISODCL (575, 702)]; /* achars */
  52. unsigned char copyright_file_id [ISODCL (703, 739)]; /* 7.5 dchars */
  53. unsigned char abstract_file_id [ISODCL (740, 776)]; /* 7.5 dchars */
  54. unsigned char bibliographic_file_id [ISODCL (777, 813)]; /* 7.5 dchars */
  55. unsigned char creation_date [ISODCL (814, 830)]; /* 8.4.26.1 */
  56. unsigned char modification_date [ISODCL (831, 847)]; /* 8.4.26.1 */
  57. unsigned char expiration_date [ISODCL (848, 864)]; /* 8.4.26.1 */
  58. unsigned char effective_date [ISODCL (865, 881)]; /* 8.4.26.1 */
  59. unsigned char file_structure_version [ISODCL (882, 882)]; /* 711 */
  60. unsigned char unused4 [ISODCL (883, 883)];
  61. unsigned char application_data [ISODCL (884, 1395)];
  62. unsigned char unused5 [ISODCL (1396, 2048)];
  63. };
  64. struct iso_directory_record {
  65. unsigned char length [ISODCL (1, 1)]; /* 711 */
  66. unsigned char ext_attr_length [ISODCL (2, 2)]; /* 711 */
  67. unsigned char extent [ISODCL (3, 10)]; /* 733 */
  68. unsigned char size [ISODCL (11, 18)]; /* 733 */
  69. unsigned char date [ISODCL (19, 25)]; /* 7 by 711 */
  70. unsigned char flags [ISODCL (26, 26)];
  71. unsigned char file_unit_size [ISODCL (27, 27)]; /* 711 */
  72. unsigned char interleave [ISODCL (28, 28)]; /* 711 */
  73. unsigned char volume_sequence_number [ISODCL (29, 32)]; /* 723 */
  74. unsigned char name_len [ISODCL (33, 33)]; /* 711 */
  75. unsigned char name [38];
  76. };
  77. int isonum_721 __PR((char * p));
  78. int isonum_723 __PR((char * p));
  79. int isonum_711 __PR((char * p));
  80. int isonum_731 __PR((char * p));
  81. int isonum_722 __PR((char * p));
  82. int isonum_732 __PR((char * p));
  83. int isonum_733 __PR((unsigned char * p));
  84. int parse_rr __PR((unsigned char * pnt, int len, int cont_flag));
  85. int dump_rr __PR((struct iso_directory_record * idr));
  86. void check_tree __PR((int file_addr, int file_size, int parent_addr));
  87. void check_path_tables __PR((int typel_extent, int typem_extent, int path_table_size));
  88. void usage __PR((int excode));
  89. int main __PR((int argc, char *argv[]));
  90. int
  91. isonum_721 (p)
  92. char *p;
  93. {
  94. return ((p[0] & 0xff) | ((p[1] & 0xff) << 8));
  95. }
  96. int
  97. isonum_723 (p)
  98. char *p;
  99. {
  100. #if 0
  101. if (p[0] != p[3] || p[1] != p[2]) {
  102. #ifdef USE_LIBSCHILY
  103. comerrno(EX_BAD, "invalid format 7.2.3 numbern");
  104. #else
  105. fprintf (stderr, "invalid format 7.2.3 numbern");
  106. exit (1);
  107. #endif
  108. }
  109. #endif
  110. return (isonum_721 (p));
  111. }
  112. int
  113. isonum_711 (p)
  114. char *p;
  115. {
  116. return (*p & 0xff);
  117. }
  118. int
  119. isonum_731 (p)
  120. char *p;
  121. {
  122. return ((p[0] & 0xff)
  123. | ((p[1] & 0xff) << 8)
  124. | ((p[2] & 0xff) << 16)
  125. | ((p[3] & 0xff) << 24));
  126. }
  127. int
  128. isonum_722(p)
  129. char *p;
  130. {
  131. return ((p[1] & 0xff)
  132. | ((p[0] & 0xff) << 8));
  133. }
  134. int
  135. isonum_732 (p)
  136. char *p;
  137. {
  138. return ((p[3] & 0xff)
  139. | ((p[2] & 0xff) << 8)
  140. | ((p[1] & 0xff) << 16)
  141. | ((p[0] & 0xff) << 24));
  142. }
  143. int
  144. isonum_733 (p)
  145. unsigned char *p;
  146. {
  147. return (isonum_731 ((char *)p));
  148. }
  149. char lbuffer[1024];
  150. int iline;
  151. int rr_goof;
  152. int parse_rr(pnt, len, cont_flag)
  153. unsigned char *pnt;
  154. int len;
  155. int cont_flag;
  156. {
  157. int slen;
  158. int ncount;
  159. int flag1, flag2;
  160. int extent;
  161. unsigned char *pnts;
  162. int cont_extent, cont_offset, cont_size;
  163. char symlinkname[1024];
  164. sprintf(lbuffer+iline," RRlen=%d ", len);
  165. iline += strlen(lbuffer+iline);
  166. cont_extent = cont_offset = cont_size = 0;
  167. symlinkname[0] = 0;
  168. ncount = 0;
  169. flag1 = flag2 = 0;
  170. while(len >= 4){
  171. if(ncount) sprintf(lbuffer+iline,",");
  172. else sprintf(lbuffer+iline,"[");
  173. iline += strlen(lbuffer + iline);
  174. sprintf(lbuffer+iline,"%c%c", pnt[0], pnt[1]);
  175. iline += strlen(lbuffer + iline);
  176. if(pnt[0] < 'A' || pnt[0] > 'Z' || pnt[1] < 'A' || 
  177.    pnt[1] > 'Z') {
  178. sprintf(lbuffer+iline,"**BAD SUSP %d %d]", 
  179.  pnt[0], pnt[1]);
  180. rr_goof++;
  181. iline += strlen(lbuffer + iline);
  182. return flag2;
  183. };
  184. if(pnt[3] != 1 && pnt[3] != 2) {
  185. sprintf(lbuffer+iline, "**BAD RRVERSION (%d)n", pnt[3]);
  186. rr_goof++;
  187. iline += strlen(lbuffer + iline);
  188. return flag2;
  189. };
  190. ncount++;
  191. if(pnt[0] == 'R' && pnt[1] == 'R') flag1 = pnt[4] & 0xff;
  192. if(strncmp((char *)pnt, "PX", 2) == 0) flag2 |= 1;
  193. if(strncmp((char *)pnt, "PN", 2) == 0) flag2 |= 2;
  194. if(strncmp((char *)pnt, "SL", 2) == 0) flag2 |= 4;
  195. if(strncmp((char *)pnt, "NM", 2) == 0) flag2 |= 8;
  196. if(strncmp((char *)pnt, "CL", 2) == 0) flag2 |= 16;
  197. if(strncmp((char *)pnt, "PL", 2) == 0) flag2 |= 32;
  198. if(strncmp((char *)pnt, "RE", 2) == 0) flag2 |= 64;
  199. if(strncmp((char *)pnt, "TF", 2) == 0) flag2 |= 128;
  200. if(strncmp((char *)pnt, "CE", 2) == 0) {
  201. cont_extent = isonum_733(pnt+4);
  202. cont_offset = isonum_733(pnt+12);
  203. cont_size = isonum_733(pnt+20);
  204. sprintf(lbuffer+iline, "=[%x,%x,%d]",
  205.  cont_extent, cont_offset, cont_size);
  206. iline += strlen(lbuffer + iline);
  207.       };
  208. if(strncmp((char *)pnt, "PL", 2) == 0 || strncmp((char *)pnt, "CL", 2) == 0) {
  209. extent = isonum_733(pnt+4);
  210.         sprintf(lbuffer+iline,"=%x", extent);
  211. iline += strlen(lbuffer + iline);
  212. if(extent == 0) rr_goof++;
  213. };
  214. if(strncmp((char *)pnt, "SL", 2) == 0) {
  215. pnts = pnt+5;
  216. slen = pnt[2] - 5;
  217. while(slen >= 1){
  218. switch(pnts[0] & 0xfe){
  219. case 0:
  220. strncat(symlinkname, (char *)(pnts+2), pnts[1]);
  221. break;
  222. case 2:
  223. strcat (symlinkname, ".");
  224. break;
  225. case 4:
  226. strcat (symlinkname, "..");
  227. break;
  228. case 8:
  229. strcat (symlinkname, "/");
  230. break;
  231. case 16:
  232. strcat(symlinkname,"/mnt");
  233. sprintf(lbuffer+iline,"Warning - mount point requested");
  234. iline += strlen(lbuffer + iline);
  235. break;
  236. case 32:
  237. strcat(symlinkname,"kafka");
  238. sprintf(lbuffer+iline,"Warning - host_name requested");
  239. iline += strlen(lbuffer + iline);
  240. break;
  241. default:
  242. sprintf(lbuffer+iline,"Reserved bit setting in symlink");
  243. rr_goof++;
  244. iline += strlen(lbuffer + iline);
  245. break;
  246. };
  247. if((pnts[0] & 0xfe) && pnts[1] != 0) {
  248. sprintf(lbuffer+iline,"Incorrect length in symlink component");
  249. iline += strlen(lbuffer + iline);
  250. };
  251. if((pnts[0] & 1) == 0)
  252.   strcat(symlinkname,"/");
  253. slen -= (pnts[1] + 2);
  254. pnts += (pnts[1] + 2);
  255.        };
  256. if(symlinkname[0] != 0) {
  257.   sprintf(lbuffer+iline,"=%s", symlinkname);
  258.   iline += strlen(lbuffer + iline);
  259.   symlinkname[0] = 0;
  260. }
  261. };
  262. len -= pnt[2];
  263. pnt += pnt[2];
  264. if(len <= 3 && cont_extent) {
  265.   unsigned char sector[2048];
  266.   lseek(fileno(infile), cont_extent * blocksize, 0);
  267.   read(fileno(infile), sector, sizeof(sector));
  268.   flag2 |= parse_rr(&sector[cont_offset], cont_size, 1);
  269. };
  270. };
  271. if(ncount) 
  272.   {
  273.     sprintf(lbuffer+iline,"]");
  274.     iline += strlen(lbuffer + iline);
  275.   }
  276. if (!cont_flag && flag1 && flag1 != flag2) 
  277.   {
  278.     sprintf(lbuffer+iline,"Flag %x != %x", flag1, flag2);
  279.     rr_goof++;
  280.     iline += strlen(lbuffer + iline);
  281.   }
  282. return flag2;
  283. }
  284. int 
  285. dump_rr(idr)
  286. struct iso_directory_record *idr;
  287. {
  288. int len;
  289. char * pnt;
  290. len = idr->length[0] & 0xff;
  291. len -= (sizeof(struct iso_directory_record) - sizeof(idr->name));
  292. len -= idr->name_len[0];
  293. pnt = (char *) idr;
  294. pnt += (sizeof(struct iso_directory_record) - sizeof(idr->name));
  295. pnt += idr->name_len[0];
  296. if((idr->name_len[0] & 1) == 0){
  297. pnt++;
  298. len--;
  299. };
  300. rr_goof = 0;
  301. parse_rr((unsigned char *)pnt, len, 0);
  302. return rr_goof;
  303. }
  304. int dir_count = 0;
  305. int dir_size_count = 0;
  306. int ngoof = 0;
  307. void
  308. check_tree(file_addr, file_size, parent_addr)
  309. int file_addr;
  310. int file_size;
  311. int parent_addr;
  312. {
  313.   unsigned char buffer[2048];
  314.   unsigned int k;
  315.   int rflag = 0;
  316.   int i, i1, j, goof;
  317.   int extent, size;
  318.   int orig_file_addr, parent_file_addr;
  319.   struct iso_directory_record * idr;
  320.   i1 = 0;
  321.   orig_file_addr = file_addr / blocksize;  /* Actual extent of this directory */
  322.   parent_file_addr = parent_addr / blocksize;
  323.   if((dir_count % 100) == 0) printf("[%d %d]n", dir_count, dir_size_count);
  324. #if 0
  325.   printf("Starting directory %d %d %dn", file_addr, file_size, parent_addr);
  326. #endif
  327.   dir_count++;
  328.   dir_size_count += file_size / blocksize;
  329.   if(file_size & 0x3ff) printf("********Directory has unusual sizen");
  330.   for(k=0; k < (file_size / sizeof(buffer)); k++){
  331.   lseek(fileno(infile), file_addr, 0);
  332.   read(fileno(infile), buffer, sizeof(buffer));
  333.   i = 0;
  334.   while(1==1){
  335.   goof = iline=0;
  336.   idr = (struct iso_directory_record *) &buffer[i];
  337.   if(idr->length[0] == 0) break;
  338.   sprintf(&lbuffer[iline],"%3d ", idr->length[0]);
  339.   iline += strlen(lbuffer + iline);
  340.   extent = isonum_733(idr->extent);
  341.   size = isonum_733(idr->size);
  342.   sprintf(&lbuffer[iline],"%5x ", extent);
  343.   iline += strlen(lbuffer + iline);
  344.   sprintf(&lbuffer[iline],"%8d ", size);
  345.   iline += strlen(lbuffer + iline);
  346.   sprintf (&lbuffer[iline], "%c", (idr->flags[0] & 2) ? '*' : ' '); 
  347.   iline += strlen(lbuffer + iline);
  348.   if(idr->name_len[0] > 33)
  349.     {
  350.       sprintf(&lbuffer[iline],"File name length=(%d)",
  351.       idr->name_len[0]);
  352.       goof++;
  353.       iline += strlen(lbuffer + iline);
  354.     }
  355.   else if(idr->name_len[0] == 1 && idr->name[0] == 0) {
  356.   sprintf(&lbuffer[iline],".             ");
  357.   iline += strlen(lbuffer + iline);
  358.   rflag = 0;
  359.   if(orig_file_addr !=isonum_733(idr->extent) + isonum_711((char *) idr->ext_attr_length))
  360.     {
  361.       sprintf(&lbuffer[iline],"***** Directory has null extent.");
  362.       goof++;
  363.       iline += strlen(lbuffer + iline);
  364.     }
  365.   if(i1)
  366.     {
  367.       sprintf(&lbuffer[iline],"***** . not  first entry.");
  368.       rr_goof++;
  369.       iline += strlen(lbuffer + iline);
  370.     }
  371.   } else if(idr->name_len[0] == 1 && idr->name[0] == 1) {
  372.   sprintf(&lbuffer[iline],"..            ");
  373.   iline += strlen(lbuffer + iline);
  374.   rflag = 0;
  375.   if(parent_file_addr !=isonum_733(idr->extent) + isonum_711((char *) idr->ext_attr_length))
  376.     {
  377.       sprintf(&lbuffer[iline],"***** Directory has null extent.");
  378.       goof++;
  379.       iline += strlen(lbuffer + iline);
  380.     }
  381.   if(i1 != 1)
  382.     {
  383.       sprintf(&lbuffer[iline],"***** .. not second entry.");
  384.       rr_goof++;
  385.       iline += strlen(lbuffer + iline);
  386.     }
  387.   
  388.   } else {
  389.           if(i1 < 2) 
  390.     {
  391.       sprintf(&lbuffer[iline]," Improper sorting.");
  392.       rr_goof++;
  393.     }
  394.   for(j=0; j<idr->name_len[0]; j++) 
  395.     {
  396.       sprintf(&lbuffer[iline],"%c", idr->name[j]);
  397.     }
  398.   for(j=0; j<14 - (int) idr->name_len[0]; j++) 
  399.     {
  400.       sprintf(&lbuffer[iline]," ");
  401.       iline += strlen(lbuffer + iline);
  402.     }
  403.   rflag = 1;
  404.   };
  405.   if(size && extent == 0) 
  406.     {
  407.       sprintf(&lbuffer[iline],"****Extent==0, size != 0");
  408.       goof++;
  409.       iline += strlen(lbuffer + iline);
  410.     }
  411. #if 0
  412.   /* This is apparently legal. */
  413.   if(size == 0 && extent) 
  414.     {
  415.       sprintf(&lbuffer[iline],"****Extent!=0, size == 0");
  416.       goof++;
  417.       iline += strlen(lbuffer + iline);
  418.     }
  419. #endif
  420.   if(idr->flags[0] & 0xf5)
  421.     {
  422.   sprintf(&lbuffer[iline],"Flags=(%x) ", idr->flags[0]);
  423.   goof++;
  424.   iline += strlen(lbuffer + iline);
  425.     }
  426.   if(idr->interleave[0])
  427.     {
  428.   sprintf(&lbuffer[iline],"Interleave=(%d) ", idr->interleave[0]);
  429.   goof++;
  430.   iline += strlen(lbuffer + iline);
  431.     }
  432.   if(idr->file_unit_size[0])
  433.     {
  434. sprintf(&lbuffer[iline],"File unit size=(%d) ", idr->file_unit_size[0]);
  435. goof++;
  436. iline += strlen(lbuffer + iline);
  437.     }
  438.   if(idr->volume_sequence_number[0] != 1)
  439.     {
  440.       sprintf(&lbuffer[iline],"Volume sequence number=(%d) ", idr->volume_sequence_number[0]);
  441.       goof++;
  442.       iline += strlen(lbuffer + iline);
  443.     }
  444.   goof += dump_rr(idr);
  445.   sprintf(&lbuffer[iline],"n");
  446.   iline += strlen(lbuffer + iline);
  447.   if(goof){
  448.           ngoof++;
  449.   lbuffer[iline++] = 0;
  450.   printf("%x: %s", orig_file_addr, lbuffer);
  451.   };
  452.   if(rflag && (idr->flags[0] & 2)) check_tree((isonum_733(idr->extent) + isonum_711((char *)idr->ext_attr_length)) * blocksize,
  453.    isonum_733(idr->size),
  454.    orig_file_addr * blocksize);
  455.   i += buffer[i];
  456.   i1++;
  457.   if (i > 2048 - sizeof(struct iso_directory_record)) break;
  458.   };
  459.   file_addr += sizeof(buffer);
  460.   };
  461.   fflush(stdout);
  462. }
  463. /* This function simply dumps the contents of the path tables.  No
  464.    consistency checking takes place, although this would proably be a good
  465.    idea. */
  466. struct path_table_info{
  467.   char * name;
  468.   unsigned int extent;
  469.   unsigned short index;
  470.   unsigned short parent;
  471. };
  472. void
  473. check_path_tables(typel_extent, typem_extent, path_table_size)
  474. int typel_extent;
  475. int typem_extent;
  476. int path_table_size;
  477. {
  478.   int count;
  479.   int j;
  480.   char * pnt;
  481.   char * typel, *typem;
  482.   /* Now read in the path tables */
  483.   typel = (char *) malloc(path_table_size);
  484.   lseek(fileno(infile), typel_extent * blocksize, 0);
  485.   read(fileno(infile), typel, path_table_size);
  486.   typem = (char *) malloc(path_table_size);
  487.   lseek(fileno(infile), typem_extent * blocksize, 0);
  488.   read(fileno(infile), typem, path_table_size);
  489.   j = path_table_size;
  490.   pnt = typel;
  491.   count = 1;
  492.   while(j){
  493.   int namelen, extent, idx;
  494.   char name[32];
  495.   namelen = *pnt++; pnt++;
  496.   extent = isonum_731(pnt); pnt += 4;
  497.   idx = isonum_721(pnt); pnt+= 2;
  498.   j -= 8+namelen;
  499.   memset(name, 0, sizeof(name));
  500.   strncpy(name, pnt, namelen);
  501.   pnt += namelen;
  502.   if(j & 1) { j--; pnt++;};
  503.   printf("%4.4d %4.4d %8.8x %sn",count++, idx, extent, name);
  504.   };
  505.   j = path_table_size;
  506.   pnt = typem;
  507.   count = 1;
  508.   while(j){
  509.   int namelen, extent, idx;
  510.   char name[32];
  511.   namelen = *pnt++; pnt++;
  512.   extent = isonum_732(pnt); pnt += 4;
  513.   idx = isonum_722(pnt); pnt+= 2;
  514.   j -= 8+namelen;
  515.   memset(name, 0, sizeof(name));
  516.   strncpy(name, pnt, namelen);
  517.   pnt += namelen;
  518.   if(j & 1) { j--; pnt++;};
  519.   printf("%4.4d %4.4d %8.8x %sn", count++, idx, extent, name);
  520.   };
  521. }
  522. void
  523. usage(excode)
  524. int excode;
  525. {
  526. errmsgno(EX_BAD, "Usage: %s [options] imagen",
  527.                 get_progname());
  528. error("Options:n");
  529. exit(excode);
  530. }
  531. int
  532. main(argc, argv)
  533. int argc;
  534. char *argv[];
  535. {
  536.   int file_addr, file_size;
  537.   struct iso_primary_descriptor ipd;
  538.   struct iso_directory_record * idr;
  539.   int typel_extent, typem_extent;
  540.   int path_table_size;
  541. save_args(argc, argv);
  542.   if(argc < 2)
  543. usage(EX_BAD);
  544.   infile = fopen(argv[1],"rb");
  545.   if (infile == NULL) {
  546. #ifdef USE_LIBSCHILY
  547. comerr("Cannot open '%s'.n", argv[1]);
  548. #else
  549. printf("Cannot open '%s'.n", argv[1]);
  550. exit(1);
  551. #endif
  552.   }
  553.   file_addr = 32768;
  554.   lseek(fileno(infile), file_addr, 0);
  555.   read(fileno(infile), &ipd, sizeof(ipd));
  556.   idr = (struct iso_directory_record *)ipd.root_directory_record;
  557.   blocksize = isonum_723((char *)ipd.logical_block_size);
  558.   if( blocksize != 512 && blocksize != 1024 && blocksize != 2048 )
  559.     {
  560.       blocksize = 2048;
  561.     }
  562.   file_addr = isonum_733(idr->extent) + isonum_711((char *)idr->ext_attr_length);
  563.   file_size = isonum_733(idr->size);
  564.   printf("Root at extent %x, %d bytesn", file_addr, file_size);
  565.   file_addr = file_addr * blocksize;
  566.   check_tree(file_addr, file_size, file_addr);
  567.   typel_extent = isonum_731((char *)ipd.type_l_path_table);
  568.   typem_extent = isonum_732((char *)ipd.type_m_path_table);
  569.   path_table_size = isonum_733(ipd.path_table_size);
  570.   /* Enable this to get the dump of the path tables */
  571. #if 0
  572.   check_path_tables(typel_extent, typem_extent, path_table_size);
  573. #endif
  574.   fclose(infile);
  575.   if(!ngoof) printf("No errors foundn");
  576.   return (0);
  577. }