Blame lib/cdio++/iso9660.cpp

Packit dd8086
/* -*- C++ -*-
Packit dd8086
  Copyright (C) 2006, 2008, 2011, 2017 Rocky Bernstein <rocky@gnu.org>
Packit dd8086
Packit dd8086
  This program is free software: you can redistribute it and/or modify
Packit dd8086
  it under the terms of the GNU General Public License as published by
Packit dd8086
  the Free Software Foundation, either version 3 of the License, or
Packit dd8086
  (at your option) any later version.
Packit dd8086
Packit dd8086
  This program is distributed in the hope that it will be useful,
Packit dd8086
  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit dd8086
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit dd8086
  GNU General Public License for more details.
Packit dd8086
Packit dd8086
  You should have received a copy of the GNU General Public License
Packit dd8086
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit dd8086
*/
Packit dd8086
Packit dd8086
#ifdef HAVE_CONFIG_H
Packit dd8086
# include "config.h"
Packit dd8086
# define __CDIO_CONFIG_H__ 1
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#ifdef HAVE_SYS_TYPES_H
Packit dd8086
#include <sys/types.h>
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#include <cdio++/iso9660.hpp>
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  Given a directory pointer, find the filesystem entry that contains
Packit dd8086
  lsn and return information about it.
Packit dd8086
Packit dd8086
  @return Stat * of entry if we found lsn, or NULL otherwise.
Packit dd8086
  Caller must release returned object using delete when done.
Packit dd8086
*/
Packit dd8086
ISO9660::Stat *
Packit dd8086
ISO9660::FS::find_lsn(lsn_t i_lsn)
Packit dd8086
{
Packit dd8086
  return new Stat(iso9660_find_fs_lsn(p_cdio, i_lsn));
Packit dd8086
}
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  Read the Primary Volume Descriptor for a CD.
Packit dd8086
  True is returned if read, and false if there was an error.
Packit dd8086
*/
Packit dd8086
ISO9660::PVD *
Packit dd8086
ISO9660::FS::read_pvd ()
Packit dd8086
{
Packit dd8086
  iso9660_pvd_t pvd;
Packit dd8086
  bool b_okay = iso9660_fs_read_pvd (p_cdio, &pvd);
Packit dd8086
  if (b_okay) {
Packit dd8086
    return new PVD(&pvd);
Packit dd8086
  }
Packit dd8086
  return (PVD *) NULL;
Packit dd8086
}
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  Read the Super block of an ISO 9660 image. This is the
Packit dd8086
  Primary Volume Descriptor (PVD) and perhaps a Supplemental Volume
Packit dd8086
  Descriptor if (Joliet) extensions are acceptable.
Packit dd8086
*/
Packit dd8086
bool
Packit dd8086
ISO9660::FS::read_superblock (iso_extension_mask_t iso_extension_mask)
Packit dd8086
{
Packit dd8086
  return iso9660_fs_read_superblock (p_cdio, iso_extension_mask);
Packit dd8086
}
Packit dd8086
Packit dd8086
/*! Read psz_path (a directory) and return a list of iso9660_stat_t
Packit dd8086
  pointers for the files inside that directory. The caller must free the
Packit dd8086
  returned result.
Packit dd8086
*/
Packit dd8086
bool
Packit dd8086
ISO9660::FS::readdir (const char psz_path[], stat_vector_t& stat_vector)
Packit dd8086
{
Packit dd8086
  CdioList_t * p_stat_list = iso9660_fs_readdir (p_cdio, psz_path);
Packit dd8086
  if (p_stat_list) {
Packit dd8086
    CdioListNode_t *p_entnode;
Packit dd8086
    _CDIO_LIST_FOREACH (p_entnode, p_stat_list) {
Packit dd8086
      iso9660_stat_t *p_statbuf =
Packit dd8086
	(iso9660_stat_t *) _cdio_list_node_data (p_entnode);
Packit dd8086
      stat_vector.push_back(new ISO9660::Stat(p_statbuf));
Packit dd8086
    }
Packit dd8086
    _cdio_list_free (p_stat_list, false, (CdioDataFree_t) iso9660_stat_free);
Packit dd8086
    return true;
Packit dd8086
  } else {
Packit dd8086
    return false;
Packit dd8086
  }
Packit dd8086
}
Packit dd8086
Packit dd8086
/*! Close previously opened ISO 9660 image and free resources
Packit dd8086
  associated with the image. Call this when done using using an ISO
Packit dd8086
  9660 image.
Packit dd8086
Packit dd8086
  @return true is unconditionally returned. If there was an error
Packit dd8086
  false would be returned.
Packit dd8086
*/
Packit dd8086
bool
Packit dd8086
ISO9660::IFS::close()
Packit dd8086
{
Packit dd8086
  iso9660_close(p_iso9660);
Packit dd8086
  p_iso9660 = (iso9660_t *) NULL;
Packit dd8086
  return true;
Packit dd8086
}
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  Given a directory pointer, find the filesystem entry that contains
Packit dd8086
  lsn and return information about it.
Packit dd8086
Packit dd8086
  Returns Stat*  of entry if we found lsn, or NULL otherwise.
Packit dd8086
  Caller must release returned object using delete when done.
Packit dd8086
*/
Packit dd8086
ISO9660::Stat *
Packit dd8086
ISO9660::IFS::find_lsn(lsn_t i_lsn)
Packit dd8086
{
Packit dd8086
  return new Stat(iso9660_ifs_find_lsn(p_iso9660, i_lsn));
Packit dd8086
}
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  Return the Joliet level recognized.
Packit dd8086
*/
Packit dd8086
uint8_t
Packit dd8086
ISO9660::IFS::get_joliet_level()
Packit dd8086
{
Packit dd8086
  return iso9660_ifs_get_joliet_level(p_iso9660);
Packit dd8086
}
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  Return true if ISO 9660 image has extended attrributes (XA).
Packit dd8086
*/
Packit dd8086
bool
Packit dd8086
ISO9660::IFS::is_xa ()
Packit dd8086
{
Packit dd8086
  return iso9660_ifs_is_xa (p_iso9660);
Packit dd8086
}
Packit dd8086
Packit dd8086
/*! Open an ISO 9660 image for "fuzzy" reading. This means that we
Packit dd8086
  will try to guess various internal offset based on internal
Packit dd8086
  checks. This may be useful when trying to read an ISO 9660 image
Packit dd8086
  contained in a file format that libiso9660 doesn't know natively
Packit dd8086
  (or knows imperfectly.)
Packit dd8086
Packit dd8086
  Maybe in the future we will have a mode. NULL is returned on
Packit dd8086
  error.
Packit dd8086
Packit dd8086
  @see open
Packit dd8086
*/
Packit dd8086
bool
Packit dd8086
ISO9660::IFS::open_fuzzy (const char *psz_path,
Packit dd8086
			  iso_extension_mask_t iso_extension_mask,
Packit dd8086
			  uint16_t i_fuzz)
Packit dd8086
{
Packit dd8086
  p_iso9660 = iso9660_open_fuzzy_ext(psz_path, iso_extension_mask, i_fuzz);
Packit dd8086
  //return p_iso9660 != (iso9660_t *) NULL;
Packit dd8086
  return true;
Packit dd8086
}
Packit dd8086
Packit dd8086
/*! Read the Primary Volume Descriptor for an ISO 9660 image.  A
Packit dd8086
  PVD object is returned if read, and NULL if there was an error.
Packit dd8086
*/
Packit dd8086
ISO9660::PVD *
Packit dd8086
ISO9660::IFS::read_pvd ()
Packit dd8086
{
Packit dd8086
  iso9660_pvd_t pvd;
Packit dd8086
  bool b_okay = iso9660_ifs_read_pvd (p_iso9660, &pvd);
Packit dd8086
  if (b_okay) {
Packit dd8086
    return new PVD(&pvd);
Packit dd8086
  }
Packit dd8086
  return (PVD *) NULL;
Packit dd8086
}
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  Read the Super block of an ISO 9660 image but determine framesize
Packit dd8086
  and datastart and a possible additional offset. Generally here we are
Packit dd8086
  not reading an ISO 9660 image but a CD-Image which contains an ISO 9660
Packit dd8086
  filesystem.
Packit dd8086
Packit dd8086
  @see read_superblock
Packit dd8086
*/
Packit dd8086
bool
Packit dd8086
ISO9660::IFS::read_superblock (iso_extension_mask_t iso_extension_mask,
Packit dd8086
			       uint16_t i_fuzz)
Packit dd8086
{
Packit dd8086
  return iso9660_ifs_read_superblock (p_iso9660, iso_extension_mask);
Packit dd8086
}
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  Read the Super block of an ISO 9660 image but determine framesize
Packit dd8086
  and datastart and a possible additional offset. Generally here we are
Packit dd8086
  not reading an ISO 9660 image but a CD-Image which contains an ISO 9660
Packit dd8086
  filesystem.
Packit dd8086
Packit dd8086
  @see read_superblock
Packit dd8086
*/
Packit dd8086
bool
Packit dd8086
ISO9660::IFS::read_superblock_fuzzy (iso_extension_mask_t iso_extension_mask,
Packit dd8086
				     uint16_t i_fuzz)
Packit dd8086
{
Packit dd8086
  return iso9660_ifs_fuzzy_read_superblock (p_iso9660, iso_extension_mask,
Packit dd8086
					    i_fuzz);
Packit dd8086
}
Packit dd8086
Packit dd8086
char *
Packit dd8086
ISO9660::PVD::get_application_id()
Packit dd8086
{
Packit dd8086
  return iso9660_get_application_id(&pvd);
Packit dd8086
}
Packit dd8086
Packit dd8086
int
Packit dd8086
ISO9660::PVD::get_pvd_block_size()
Packit dd8086
{
Packit dd8086
  return iso9660_get_pvd_block_size(&pvd);
Packit dd8086
}
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  Return the PVD's preparer ID.
Packit dd8086
  NULL is returned if there is some problem in getting this.
Packit dd8086
*/
Packit dd8086
char *
Packit dd8086
ISO9660::PVD::get_preparer_id()
Packit dd8086
{
Packit dd8086
  return iso9660_get_preparer_id(&pvd);
Packit dd8086
}
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  Return the PVD's publisher ID.
Packit dd8086
  NULL is returned if there is some problem in getting this.
Packit dd8086
*/
Packit dd8086
char *
Packit dd8086
ISO9660::PVD::get_publisher_id()
Packit dd8086
{
Packit dd8086
  return iso9660_get_publisher_id(&pvd);
Packit dd8086
}
Packit dd8086
Packit dd8086
const char *
Packit dd8086
ISO9660::PVD::get_pvd_id()
Packit dd8086
{
Packit dd8086
  return iso9660_get_pvd_id(&pvd);
Packit dd8086
}
Packit dd8086
Packit dd8086
int
Packit dd8086
ISO9660::PVD::get_pvd_space_size()
Packit dd8086
{
Packit dd8086
  return iso9660_get_pvd_space_size(&pvd);
Packit dd8086
}
Packit dd8086
Packit dd8086
uint8_t
Packit dd8086
ISO9660::PVD::get_pvd_type() {
Packit dd8086
  return iso9660_get_pvd_type(&pvd);
Packit dd8086
}
Packit dd8086
Packit dd8086
/*! Return the primary volume id version number (of pvd).
Packit dd8086
  If there is an error 0 is returned.
Packit dd8086
*/
Packit dd8086
int
Packit dd8086
ISO9660::PVD::get_pvd_version()
Packit dd8086
{
Packit dd8086
  return iso9660_get_pvd_version(&pvd);
Packit dd8086
}
Packit dd8086
Packit dd8086
/*! Return the LSN of the root directory for pvd.
Packit dd8086
  If there is an error CDIO_INVALID_LSN is returned.
Packit dd8086
*/
Packit dd8086
lsn_t
Packit dd8086
ISO9660::PVD::get_root_lsn()
Packit dd8086
{
Packit dd8086
  return iso9660_get_root_lsn(&pvd);
Packit dd8086
}
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  Return the PVD's system ID.
Packit dd8086
  NULL is returned if there is some problem in getting this.
Packit dd8086
*/
Packit dd8086
char *
Packit dd8086
ISO9660::PVD::get_system_id()
Packit dd8086
{
Packit dd8086
  return iso9660_get_system_id(&pvd);
Packit dd8086
}
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  Return the PVD's volume ID.
Packit dd8086
  NULL is returned if there is some problem in getting this.
Packit dd8086
*/
Packit dd8086
char *
Packit dd8086
ISO9660::PVD::get_volume_id()
Packit dd8086
{
Packit dd8086
  return iso9660_get_volume_id(&pvd);
Packit dd8086
}
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  Return the PVD's volumeset ID.
Packit dd8086
  NULL is returned if there is some problem in getting this.
Packit dd8086
*/
Packit dd8086
char *
Packit dd8086
ISO9660::PVD::get_volumeset_id()
Packit dd8086
{
Packit dd8086
  return iso9660_get_volumeset_id(&pvd);
Packit dd8086
}