Esempio n. 1
0
check_path_tables(int typel_extent, int typem_extent, int path_table_size){
  int file_addr;
  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, index;
	  char name[32];
	  namelen = *pnt++; pnt++;
	  extent = isonum_731(pnt); pnt += 4;
	  index = 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++, index, extent, name);
  };

  j = path_table_size;
  pnt = typem;
  count = 1;
  while(j){
	  int namelen, extent, index;
	  char name[32];
	  namelen = *pnt++; pnt++;
	  extent = isonum_732(pnt); pnt += 4;
	  index = 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++, index, extent, name);
  };

}
Esempio n. 2
0
void KIso::addBoot(struct el_torito_boot_descriptor* bootdesc)
{
    KISOFUNC;

    int i;
    long long size;
    boot_head boot;
    boot_entry *be;
    QString path;
    KIsoFile *entry;

    path = "Catalog";
    entry = new KIsoFile(this, path, dirent->permissions() & ~S_IFDIR,
                         dirent->date(), dirent->adate(), dirent->cdate(),
                         dirent->user(), dirent->group(), QString(),
                         (long long)isonum_731(bootdesc->boot_catalog) << (long long)11, (long long)2048);
    dirent->addEntry(entry);
    if (!ReadBootTable(&readf, isonum_731(bootdesc->boot_catalog), &boot, this)) {
        i = 1;
        be = boot.defentry;
        while (be) {
            size = BootImageSize(isonum_711(be->data.d_e.media),
                                 isonum_721(be->data.d_e.seccount));
            path = "Default Image";
            if (i > 1) path += " (" + QString::number(i) + ')';
            entry = new KIsoFile(this, path, dirent->permissions() & ~S_IFDIR,
                                 dirent->date(), dirent->adate(), dirent->cdate(),
                                 dirent->user(), dirent->group(), QString(),
                                 (long long)isonum_731(be->data.d_e.start) << (long long)11, size << (long long)9);
            dirent->addEntry(entry);
            be = be->next;
            i++;
        }

        FreeBootTable(&boot);
    }
}
Esempio n. 3
0
int
isonum_733 (char * p)
{
#if 0
	int i;

	for (i = 0; i < 4; i++) {
		if (p[i] != p[7-i]) {
			fprintf (stderr, "bad format 7.3.3 number\n");
			exit (1);
		}
	}
#endif
	return (isonum_731 (p));
}
Esempio n. 4
0
void K3b::Iso9660::addBoot(struct el_torito_boot_descriptor* bootdesc)
{
    int i,size;
    boot_head boot;
    boot_entry *be;
    QString path;
    K3b::Iso9660File *entry;

    entry=new K3b::Iso9660File( this, "Catalog", "Catalog", dirent->permissions() & ~S_IFDIR,
                              dirent->date(), dirent->adate(), dirent->cdate(),
                              dirent->user(), dirent->group(), QString(),
                              isonum_731(bootdesc->boot_catalog), 2048 );
    dirent->addEntry(entry);
    if (!ReadBootTable(&K3b::Iso9660::read_callback,isonum_731(bootdesc->boot_catalog),&boot,this)) {
        i=1;
        be=boot.defentry;
        while (be) {
            size=BootImageSize(&K3b::Iso9660::read_callback,
                               isonum_711(((struct default_entry*) be->data)->media),
                               isonum_731(((struct default_entry*) be->data)->start),
                               isonum_721(((struct default_entry*) be->data)->seccount),
                               this);
            path="Default Image";
            if (i>1) path += " (" + QString::number(i) + ')';
            entry=new K3b::Iso9660File( this, path, path, dirent->permissions() & ~S_IFDIR,
                                      dirent->date(), dirent->adate(), dirent->cdate(),
                                      dirent->user(), dirent->group(), QString(),
                                      isonum_731(((struct default_entry*) be->data)->start), size<<9 );
            dirent->addEntry(entry);
            be=be->next;
            i++;
        }

        FreeBootTable(&boot);
    }
}
Esempio n. 5
0
main(int argc, char * argv[]){
  int file_addr, file_size;
  char c;
  int nbyte;
  struct iso_primary_descriptor ipd;
  struct iso_directory_record * idr;
  int typel_extent, typem_extent;
  int path_table_size;
  int i,j;
  if(argc < 2) return 0;
  infile = fopen(argv[1],"rb");


  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");
}
Esempio n. 6
0
static void
hf_probe_volume_advanced_disc_detect (int fd)
{
  size_t secsz = ISO_DEFAULT_BLOCK_SIZE;
  int readoff;
  struct iso_primary_descriptor desc;
  u_char *ptbl;
  int ptbl_size, ptbl_bsize;
  int ptbl_lbn;
  struct iso_path_table_entry *pte;
  int pte_len;
  int name_len;
  int off;

  readoff = ISO_VOLDESC_SEC * secsz;
  do
    {
      if (pread(fd, &desc, sizeof desc, readoff) != sizeof desc)
        {
          hfp_warning("volume descriptor read error");
	  return;
	}
      if (isonum_711(desc.type) == ISO_VD_END)
        return;
      readoff += secsz;
    }
  while (isonum_711(desc.type) != ISO_VD_PRIMARY);

  ptbl_size = isonum_733(desc.path_table_size);
#if BYTE_ORDER == LITTLE_ENDIAN
  ptbl_lbn = isonum_731(desc.type_l_path_table);
#else
  ptbl_lbn = isonum_732(desc.type_m_path_table);
#endif
  ptbl_bsize = (ptbl_size + secsz - 1) / secsz * secsz;
  ptbl = g_malloc(ptbl_bsize);
  if (ptbl == NULL)
    {
      hfp_warning("path table allocation failure");
      return;
    }
  readoff = ptbl_lbn * secsz;
  if (pread(fd, ptbl, ptbl_bsize, readoff) != ptbl_bsize)
    {
      g_free(ptbl);
      hfp_warning("path table read error");
    }
  for (off = 0; off < ptbl_size; off += pte_len)
    {
      pte = (struct iso_path_table_entry *)(ptbl + off);
      name_len = *pte->name_len;
      pte_len = ISO_PATH_TABLE_ENTRY_SIZE + name_len + (name_len % 2);
      if (*(short *)pte->parent_no != 1)
        continue;
      if (name_len == 8 && strncmp(pte->name, "VIDEO_TS", 8) == 0)
        {
          libhal_device_set_property_bool(hfp_ctx, hfp_udi, "volume.disc.is_videodvd", TRUE, &hfp_error);
	  break;
	}
      else if (name_len == 3 && strncmp(pte->name, "VCD", 8) == 0)
        {
          libhal_device_set_property_bool(hfp_ctx, hfp_udi, "volume.disc.is_vcd", TRUE, &hfp_error);
	  break;
	}
      else if (name_len == 4 && strncmp(pte->name, "SVCD", 4) == 0)
        {
          libhal_device_set_property_bool(hfp_ctx, hfp_udi, "volume.disc.is_svcd", TRUE, &hfp_error);
	  break;
	}
    }
  g_free(ptbl);
}
Esempio n. 7
0
File: cdfs.c Progetto: HarryR/sanos
static int cdfs_read_path_table(struct cdfs *cdfs, struct iso_volume_descriptor *vd) {
  struct buf *buf;
  unsigned char *pt;
  int ptblk;
  int ptlen;
  int ptpos;
  int n;

  // Determine size and location of path table and allocate buffer
  ptlen = isonum_733(vd->path_table_size);
  ptblk = isonum_731(vd->type_l_path_table);
  cdfs->path_table_buffer = malloc(ptlen);
  if (!cdfs->path_table_buffer) return -ENOMEM;

  // Read L path table into buffer
  ptpos = 0;
  while (ptpos < ptlen) {
    buf = get_buffer(cdfs->cache, ptblk++);
    if (!buf) return -EIO;

    if (ptlen - ptpos > CDFS_BLOCKSIZE) {
      memcpy(cdfs->path_table_buffer + ptpos, buf->data, CDFS_BLOCKSIZE);
      ptpos += CDFS_BLOCKSIZE;
    } else {
      memcpy(cdfs->path_table_buffer + ptpos, buf->data, ptlen - ptpos);
      ptpos = ptlen;
    }

    release_buffer(cdfs->cache, buf);
  }

  // Determine number of records in pathtable
  // Path table records are indexed from 1 (first entry not used)
  pt = cdfs->path_table_buffer;
  n = 1;
  while (pt < cdfs->path_table_buffer + ptlen) {
    struct iso_pathtable_record *pathrec = (struct iso_pathtable_record *) pt;
    int namelen = pathrec->length;
    int reclen = sizeof(struct iso_pathtable_record) + namelen + (namelen & 1);

    n++;
    pt += reclen;
  }

  cdfs->path_table_records = n;

  // Allocate path table
  cdfs->path_table = (struct iso_pathtable_record **) kmalloc(cdfs->path_table_records * sizeof(struct iso_pathtable_record **));
  if (!cdfs->path_table) return -ENOMEM;
  cdfs->path_table[0] = NULL;

  // Setup pointers into path table buffer
  pt = cdfs->path_table_buffer;
  for (n = 1; n < cdfs->path_table_records; n++) {
    struct iso_pathtable_record *pathrec = (struct iso_pathtable_record *) pt;
    int namelen = pathrec->length;
    int reclen = sizeof(struct iso_pathtable_record) + namelen + (namelen & 1);

    cdfs->path_table[n] = pathrec;
    pt += reclen;
  }

  return 0;
}
Esempio n. 8
0
int
isonum_733 (unsigned char * p)
{
	return (isonum_731 ((char *)p));
}