⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 isovfy.c

📁 创建一个符合iso-9660标准的iso文件系统
💻 C
📖 第 1 页 / 共 2 页
字号:
	if((idr->name_len[0] & 1) == 0){		pnt++;		len--;	};	rr_goof = 0;	parse_rr((unsigned char *)pnt, len, 0);	return rr_goof;}int dir_count = 0;int dir_size_count = 0;int ngoof = 0;voidcheck_tree(file_addr, file_size, parent_addr)	int	file_addr;	int	file_size;	int	parent_addr;{  unsigned char buffer[2048];  unsigned int k;  int rflag = 0;  int i, i1, j, goof;  int extent, size;  int orig_file_addr, parent_file_addr;  struct iso_directory_record * idr;  i1 = 0;  orig_file_addr = file_addr / blocksize;  /* Actual extent of this directory */  parent_file_addr = parent_addr / blocksize;  if((dir_count % 100) == 0) printf("[%d %d]\n", dir_count, dir_size_count);#if 0  printf("Starting directory %d %d %d\n", file_addr, file_size, parent_addr);#endif  dir_count++;  dir_size_count += file_size / blocksize;  if(file_size & 0x3ff) printf("********Directory has unusual size\n");  for(k=0; k < (file_size / sizeof(buffer)); k++){	  lseek(fileno(infile), file_addr, 0);	  read(fileno(infile), buffer, sizeof(buffer));	  i = 0;	  while(1==1){		  goof = iline=0;		  idr = (struct iso_directory_record *) &buffer[i];		  if(idr->length[0] == 0) break;		  sprintf(&lbuffer[iline],"%3d ", idr->length[0]);		  iline += strlen(lbuffer + iline);		  extent = isonum_733(idr->extent);		  size = isonum_733(idr->size);		  sprintf(&lbuffer[iline],"%5x ", extent);		  iline += strlen(lbuffer + iline);		  sprintf(&lbuffer[iline],"%8d ", size);		  iline += strlen(lbuffer + iline);		  sprintf (&lbuffer[iline], "%c", (idr->flags[0] & 2) ? '*' : ' '); 		  iline += strlen(lbuffer + iline);		  if(idr->name_len[0] > 33)		    {		      sprintf(&lbuffer[iline],"File name length=(%d)",			      idr->name_len[0]);		      goof++;		      iline += strlen(lbuffer + iline);		    }		  else if(idr->name_len[0] == 1 && idr->name[0] == 0) {			  sprintf(&lbuffer[iline],".             ");			  iline += strlen(lbuffer + iline);			  rflag = 0;			  if(orig_file_addr !=isonum_733(idr->extent) + isonum_711((char *) idr->ext_attr_length))			    {			      sprintf(&lbuffer[iline],"***** Directory has null extent.");			      goof++;			      iline += strlen(lbuffer + iline);			    }			  if(i1)			    {			      sprintf(&lbuffer[iline],"***** . not  first entry.");			      rr_goof++;			      iline += strlen(lbuffer + iline);			    }		  } else if(idr->name_len[0] == 1 && idr->name[0] == 1) {			  sprintf(&lbuffer[iline],"..            ");			  iline += strlen(lbuffer + iline);			  rflag = 0;			  if(parent_file_addr !=isonum_733(idr->extent) + isonum_711((char *) idr->ext_attr_length))			    {			      sprintf(&lbuffer[iline],"***** Directory has null extent.");			      goof++;			      iline += strlen(lbuffer + iline);			    }			  if(i1 != 1)			    {			      sprintf(&lbuffer[iline],"***** .. not second entry.");			      rr_goof++;			      iline += strlen(lbuffer + iline);			    }			  		  } else {		          if(i1 < 2) 			    {			      sprintf(&lbuffer[iline]," Improper sorting.");			      rr_goof++;			    }			  for(j=0; j<idr->name_len[0]; j++) 			    {			      sprintf(&lbuffer[iline],"%c", idr->name[j]);			    }			  for(j=0; j<14 - (int) idr->name_len[0]; j++) 			    {			      sprintf(&lbuffer[iline]," ");			      iline += strlen(lbuffer + iline);			    }			  rflag = 1;		  };		  if(size && extent == 0) 		    {		      sprintf(&lbuffer[iline],"****Extent==0, size != 0");		      goof++;		      iline += strlen(lbuffer + iline);		    }#if 0		  /* This is apparently legal. */		  if(size == 0 && extent) 		    {		      sprintf(&lbuffer[iline],"****Extent!=0, size == 0");		      goof++;		      iline += strlen(lbuffer + iline);		    }#endif		  if(idr->flags[0] & 0xf5)		    {			  sprintf(&lbuffer[iline],"Flags=(%x) ", idr->flags[0]);			  goof++;			  iline += strlen(lbuffer + iline);		    }		  if(idr->interleave[0])		    {			  sprintf(&lbuffer[iline],"Interleave=(%d) ", idr->interleave[0]);			  goof++;			  iline += strlen(lbuffer + iline);		    }		  if(idr->file_unit_size[0])		    {			sprintf(&lbuffer[iline],"File unit size=(%d) ", idr->file_unit_size[0]);			goof++;			iline += strlen(lbuffer + iline);		    }		  if(idr->volume_sequence_number[0] != 1)		    {		      sprintf(&lbuffer[iline],"Volume sequence number=(%d) ", idr->volume_sequence_number[0]);		      goof++;		      iline += strlen(lbuffer + iline);		    }		  goof += dump_rr(idr);		  sprintf(&lbuffer[iline],"\n");		  iline += strlen(lbuffer + iline);		  if(goof){		          ngoof++;			  lbuffer[iline++] = 0;			  printf("%x: %s", orig_file_addr, lbuffer);		  };		  if(rflag && (idr->flags[0] & 2)) check_tree((isonum_733(idr->extent) + isonum_711((char *)idr->ext_attr_length)) * blocksize,						   isonum_733(idr->size),						   orig_file_addr * blocksize);		  i += buffer[i];		  i1++;		  if (i > 2048 - sizeof(struct iso_directory_record)) break;	  };	  file_addr += sizeof(buffer);  };  fflush(stdout);}/* This function simply dumps the contents of the path tables.  No   consistency checking takes place, although this would proably be a good   idea. */struct path_table_info{  char * name;  unsigned int extent;  unsigned short index;  unsigned short parent;};voidcheck_path_tables(typel_extent, typem_extent, path_table_size)	int	typel_extent;	int	typem_extent;	int	path_table_size;{  int count;  int j;  char * pnt;  char * typel, *typem;  /* Now read in the path tables */  typel = (char *) malloc(path_table_size);  lseek(fileno(infile), typel_extent * blocksize, 0);  read(fileno(infile), typel, path_table_size);  typem = (char *) malloc(path_table_size);  lseek(fileno(infile), typem_extent * blocksize, 0);  read(fileno(infile), typem, path_table_size);  j = path_table_size;  pnt = typel;  count = 1;  while(j){	  int namelen, extent, idx;	  char name[32];	  namelen = *pnt++; pnt++;	  extent = isonum_731(pnt); pnt += 4;	  idx = isonum_721(pnt); pnt+= 2;	  j -= 8+namelen;	  memset(name, 0, sizeof(name));	  strncpy(name, pnt, namelen);	  pnt += namelen;	  if(j & 1) { j--; pnt++;};	  printf("%4.4d %4.4d %8.8x %s\n",count++, idx, extent, name);  };  j = path_table_size;  pnt = typem;  count = 1;  while(j){	  int namelen, extent, idx;	  char name[32];	  namelen = *pnt++; pnt++;	  extent = isonum_732(pnt); pnt += 4;	  idx = isonum_722(pnt); pnt+= 2;	  j -= 8+namelen;	  memset(name, 0, sizeof(name));	  strncpy(name, pnt, namelen);	  pnt += namelen;	  if(j & 1) { j--; pnt++;};	  printf("%4.4d %4.4d %8.8x %s\n", count++, idx, extent, name);  };}voidusage(excode)	int	excode;{	errmsgno(EX_BAD, "Usage: %s [options] image\n",                get_progname());	error("Options:\n");	exit(excode);}intmain(argc, argv)	int	argc;	char	*argv[];{  int file_addr, file_size;  struct iso_primary_descriptor ipd;  struct iso_directory_record * idr;  int typel_extent, typem_extent;  int path_table_size;	save_args(argc, argv);  if(argc < 2)	usage(EX_BAD);  infile = fopen(argv[1],"rb");  if (infile == NULL) {#ifdef	USE_LIBSCHILY	comerr("Cannot open '%s'.\n", argv[1]);#else	printf("Cannot open '%s'.\n", argv[1]);	exit(1);#endif  }  file_addr = 32768;  lseek(fileno(infile), file_addr, 0);  read(fileno(infile), &ipd, sizeof(ipd));  idr = (struct iso_directory_record *)ipd.root_directory_record;  blocksize = isonum_723((char *)ipd.logical_block_size);  if( blocksize != 512 && blocksize != 1024 && blocksize != 2048 )    {      blocksize = 2048;    }  file_addr = isonum_733(idr->extent) + isonum_711((char *)idr->ext_attr_length);  file_size = isonum_733(idr->size);  printf("Root at extent %x, %d bytes\n", file_addr, file_size);  file_addr = file_addr * blocksize;  check_tree(file_addr, file_size, file_addr);  typel_extent = isonum_731((char *)ipd.type_l_path_table);  typem_extent = isonum_732((char *)ipd.type_m_path_table);  path_table_size = isonum_733(ipd.path_table_size);  /* Enable this to get the dump of the path tables */#if 0  check_path_tables(typel_extent, typem_extent, path_table_size);#endif  fclose(infile);  if(!ngoof) printf("No errors found\n");  return (0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -