|
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 |
}
|