Blame include/cdio/iso9660.h

Packit dd8086
/*
Packit dd8086
    Copyright (C) 2003-2008, 2012-2013, 2017
Packit dd8086
                  Rocky Bernstein <rocky@gnu.org>
Packit dd8086
    Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org>
Packit dd8086
Packit dd8086
    See also iso9660.h by Eric Youngdale (1993).
Packit dd8086
Packit dd8086
    Copyright 1993 Yggdrasil Computing, Incorporated
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
 * \file iso9660.h
Packit dd8086
 *
Packit dd8086
 * \brief The top-level interface header for libiso9660: the ISO-9660
Packit dd8086
 * filesystem library; applications include this.
Packit dd8086
 *
Packit dd8086
 * See also the ISO-9660 specification. The freely available European
Packit dd8086
 * equivalant standard is called ECMA-119.
Packit dd8086
*/
Packit dd8086
Packit dd8086

Packit dd8086
#ifndef CDIO_ISO9660_H_
Packit dd8086
#define CDIO_ISO9660_H_
Packit dd8086
Packit dd8086
#include <time.h>
Packit dd8086
Packit dd8086
#include <cdio/cdio.h>
Packit dd8086
#include <cdio/ds.h>
Packit dd8086
#include <cdio/posix.h>
Packit dd8086
Packit dd8086
/** \brief ISO 9660 Integer and Character types
Packit dd8086
Packit dd8086
These are described in the section 7 of the ISO 9660 (or ECMA 119)
Packit dd8086
specification.
Packit dd8086
*/
Packit dd8086
Packit dd8086
typedef uint8_t  iso711_t; /*! See section 7.1.1 */
Packit dd8086
typedef int8_t   iso712_t; /*! See section 7.1.2 */
Packit dd8086
typedef uint16_t iso721_t; /*! See section 7.2.1 */
Packit dd8086
typedef uint16_t iso722_t; /*! See section 7.2.2 */
Packit dd8086
typedef uint32_t iso723_t; /*! See section 7.2.3 */
Packit dd8086
typedef uint32_t iso731_t; /*! See section 7.3.1 */
Packit dd8086
typedef uint32_t iso732_t; /*! See section 7.3.2 */
Packit dd8086
typedef uint64_t iso733_t; /*! See section 7.3.3 */
Packit dd8086
Packit dd8086
typedef char     achar_t;  /*! See section 7.4.1 */
Packit dd8086
typedef char     dchar_t;  /*! See section 7.4.1 */
Packit dd8086
Packit dd8086
#ifndef EMPTY_ARRAY_SIZE
Packit dd8086
#define EMPTY_ARRAY_SIZE 0
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#include <cdio/types.h>
Packit dd8086
#include <cdio/xa.h>
Packit dd8086
Packit dd8086
#ifdef ISODCL
Packit dd8086
#undef ISODCL
Packit dd8086
#endif
Packit dd8086
/* This part borrowed from the bsd386 isofs */
Packit dd8086
#define ISODCL(from, to)        ((to) - (from) + 1)
Packit dd8086
Packit dd8086
#define MIN_TRACK_SIZE 4*75
Packit dd8086
#define MIN_ISO_SIZE MIN_TRACK_SIZE
Packit dd8086
Packit dd8086
/*! The below isn't really an enumeration one would really use in a
Packit dd8086
    program; things are done this way so that in a debugger one can to
Packit dd8086
    refer to the enumeration value names such as in a debugger
Packit dd8086
    expression and get something. With the more common a \#define
Packit dd8086
    mechanism, the name/value assocation is lost at run time.
Packit dd8086
  */
Packit dd8086
extern enum iso_enum1_s {
Packit dd8086
  ISO_PVD_SECTOR      =   16, /**< Sector of Primary Volume Descriptor. */
Packit dd8086
  ISO_EVD_SECTOR      =   17, /**< Sector of End Volume Descriptor. */
Packit dd8086
  LEN_ISONAME         =   31, /**< Size in bytes of the filename
Packit dd8086
                                 portion + null byte. */
Packit dd8086
  ISO_MAX_SYSTEM_ID   =   32, /**< Maximum number of characters in a system
Packit dd8086
                                 id. */
Packit dd8086
  MAX_ISONAME         =   37, /**< Size in bytes of the filename
Packit dd8086
                                 portion + null byte. */
Packit dd8086
  ISO_MAX_PREPARER_ID =  128, /**< Maximum number of characters in a
Packit dd8086
                                 preparer id. */
Packit dd8086
  MAX_ISOPATHNAME     =  255, /**< Maximum number of characters in the
Packit dd8086
                                 entire ISO 9660 filename. */
Packit dd8086
  ISO_BLOCKSIZE       = 2048  /**< Number of bytes in an ISO 9660 block. */
Packit dd8086
Packit dd8086
} iso_enums1;
Packit dd8086
Packit dd8086
/*! An enumeration for some of the ISO_* \#defines below. This isn't
Packit dd8086
    really an enumeration one would really use in a program it is here
Packit dd8086
    to be helpful in debuggers where wants just to refer to the
Packit dd8086
    ISO_*_ names and get something.
Packit dd8086
  */
Packit dd8086
Packit dd8086
/*! ISO 9660 directory flags. */
Packit dd8086
extern enum iso_flag_enum_s {
Packit dd8086
  ISO_FILE            =   0,   /**<  Not really a flag...                */
Packit dd8086
  ISO_EXISTENCE       =   1,   /**< Do not make existence known (hidden) */
Packit dd8086
  ISO_DIRECTORY       =   2,   /**< This file is a directory             */
Packit dd8086
  ISO_ASSOCIATED      =   4,   /**< This file is an associated file      */
Packit dd8086
  ISO_RECORD          =   8,   /**< Record format in extended attr. != 0 */
Packit dd8086
  ISO_PROTECTION      =  16,   /**< No read/execute perm. in ext. attr.  */
Packit dd8086
  ISO_DRESERVED1      =  32,   /**<, Reserved bit 5                      */
Packit dd8086
  ISO_DRESERVED2      =  64,   /**<, Reserved bit 6                      */
Packit dd8086
  ISO_MULTIEXTENT     = 128,   /**< Not final entry of a mult. ext. file */
Packit dd8086
} iso_flag_enums;
Packit dd8086
Packit dd8086
/*! Volume descriptor types */
Packit dd8086
extern enum iso_vd_enum_s {
Packit dd8086
  ISO_VD_BOOT_RECORD   =  0,  /**< CD is bootable */
Packit dd8086
  ISO_VD_PRIMARY       =  1,  /**< Is in any ISO-9660 */
Packit dd8086
  ISO_VD_SUPPLEMENTARY =  2,  /**< Used by Joliet, for example */
Packit dd8086
  ISO_VD_PARITION      =  3,  /**< Indicates a partition of a CD */
Packit dd8086
  ISO_VD_END           = 255
Packit dd8086
} iso_vd_enums;
Packit dd8086
Packit dd8086
Packit dd8086
/*!
Packit dd8086
   An ISO filename is:
Packit dd8086
   abcd.eee ->
Packit dd8086
   filename.ext;version#
Packit dd8086
Packit dd8086
    For ISO-9660 Level 1, the maximum needed string length is:
Packit dd8086
Packit dd8086
@code
Packit dd8086
         30 chars (filename + ext)
Packit dd8086
    +     2 chars ('.' + ';')
Packit dd8086
    +     5 chars (strlen("32767"))
Packit dd8086
    +     1 null byte
Packit dd8086
   ================================
Packit dd8086
    =    38 chars
Packit dd8086
@endcode
Packit dd8086
Packit dd8086
*/
Packit dd8086
Packit dd8086
/*! \brief Maximum number of characters in a publisher id. */
Packit dd8086
#define ISO_MAX_PUBLISHER_ID 128
Packit dd8086
Packit dd8086
/*! \brief Maximum number of characters in an application id. */
Packit dd8086
#define ISO_MAX_APPLICATION_ID 128
Packit dd8086
Packit dd8086
/*! \brief Maximum number of characters in a volume id. */
Packit dd8086
#define ISO_MAX_VOLUME_ID 32
Packit dd8086
Packit dd8086
/*! \brief Maximum number of characters in a volume-set id. */
Packit dd8086
#define ISO_MAX_VOLUMESET_ID 128
Packit dd8086
Packit dd8086
/*! String inside frame which identifies an ISO 9660 filesystem. This
Packit dd8086
    string is the "id" field of an iso9660_pvd_t or an iso9660_svd_t.
Packit dd8086
*/
Packit dd8086
extern const char ISO_STANDARD_ID[sizeof("CD001")-1];
Packit dd8086
Packit dd8086
#define ISO_STANDARD_ID      "CD001"
Packit dd8086
Packit dd8086
#ifdef __cplusplus
Packit dd8086
extern "C" {
Packit dd8086
#endif /* __cplusplus */
Packit dd8086
Packit dd8086
typedef enum strncpy_pad_check {
Packit dd8086
  ISO9660_NOCHECK = 0,
Packit dd8086
  ISO9660_7BIT,
Packit dd8086
  ISO9660_ACHARS,
Packit dd8086
  ISO9660_DCHARS
Packit dd8086
} strncpy_pad_check_t;
Packit dd8086
Packit dd8086
PRAGMA_BEGIN_PACKED
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  \brief ISO-9660 shorter-format time structure. See ECMA 9.1.5.
Packit dd8086
Packit dd8086
  @see iso9660_dtime
Packit dd8086
 */
Packit dd8086
struct  iso9660_dtime_s {
Packit dd8086
  iso711_t      dt_year;   /**< Number of years since 1900 */
Packit dd8086
  iso711_t      dt_month;  /**< Has value in range 1..12. Note starts
Packit dd8086
                              at 1, not 0 like a tm struct. */
Packit dd8086
  iso711_t      dt_day;    /**< Day of the month from 1 to 31 */
Packit dd8086
  iso711_t      dt_hour;   /**< Hour of the day from 0 to 23 */
Packit dd8086
  iso711_t      dt_minute; /**< Minute of the hour from 0 to 59 */
Packit dd8086
  iso711_t      dt_second; /**< Second of the minute from 0 to 59 */
Packit dd8086
  iso712_t      dt_gmtoff; /**< GMT values -48 .. + 52 in 15 minute
Packit dd8086
                              intervals */
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
typedef struct iso9660_dtime_s  iso9660_dtime_t;
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  \brief ISO-9660 longer-format time structure.
Packit dd8086
Packit dd8086
  Section 8.4.26.1 of ECMA 119. All values are encoded as character
Packit dd8086
  arrays, eg. '1', '9', '5', '5' for the year 1955 (no null terminated
Packit dd8086
  byte).
Packit dd8086
Packit dd8086
  @see iso9660_ltime
Packit dd8086
 */
Packit dd8086
struct  iso9660_ltime_s {
Packit dd8086
  char   lt_year        [ISODCL(   1,   4)];   /**< Add 1900 to value
Packit dd8086
                                                    for the Julian
Packit dd8086
                                                    year */
Packit dd8086
  char   lt_month       [ISODCL(   5,   6)];   /**< Has value in range
Packit dd8086
                                                  1..12. Note starts
Packit dd8086
                                                  at 1, not 0 like a
Packit dd8086
                                                  tm struct. */
Packit dd8086
  char   lt_day         [ISODCL(   7,   8)];   /**< Day of month: 1..31 */
Packit dd8086
  char   lt_hour        [ISODCL(   9,   10)];  /**< hour: 0..23 */
Packit dd8086
  char   lt_minute      [ISODCL(  11,   12)];  /**< minute: 0..59 */
Packit dd8086
  char   lt_second      [ISODCL(  13,   14)];  /**< second: 0..59 */
Packit dd8086
  char   lt_hsecond     [ISODCL(  15,   16)];  /**< The value is in
Packit dd8086
                                                  units of 1/100's of
Packit dd8086
                                                  a second */
Packit dd8086
  iso712_t lt_gmtoff;  /**< Offset from Greenwich Mean Time in number
Packit dd8086
                          of 15 min intervals from -48 (West) to +52
Packit dd8086
                          (East) recorded according to 7.1.2 numerical
Packit dd8086
                          value */
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
typedef struct iso9660_ltime_s  iso9660_ltime_t;
Packit dd8086
typedef struct iso9660_dir_s    iso9660_dir_t;
Packit dd8086
typedef struct iso9660_stat_s   iso9660_stat_t;
Packit dd8086
Packit dd8086
#include <cdio/rock.h>
Packit dd8086
Packit dd8086
/*! \brief Format of an ISO-9660 directory record
Packit dd8086
Packit dd8086
 Section 9.1 of ECMA 119.
Packit dd8086
Packit dd8086
 This structure may have an odd length depending on how many
Packit dd8086
 characters there are in the filename!  Some compilers (e.g. on
Packit dd8086
 Sun3/mc68020) pad the structures to an even length.  For this reason,
Packit dd8086
 we cannot use sizeof (struct iso_path_table) or sizeof (struct
Packit dd8086
 iso_directory_record) to compute on disk sizes.  Instead, we use
Packit dd8086
 offsetof(..., name) and add the name size.  See mkisofs.h of the
Packit dd8086
 cdrtools package.
Packit dd8086
Packit dd8086
  @see iso9660_stat
Packit dd8086
*/
Packit dd8086
struct iso9660_dir_s {
Packit dd8086
  iso711_t         length;            /*! Length of Directory record (9.1.1) */
Packit dd8086
  iso711_t         xa_length;         /*! XA length if XA is used. Otherwise
Packit dd8086
                                          zero. (9.1.2)  */
Packit dd8086
  iso733_t         extent;            /*! LBA of first local block allocated
Packit dd8086
                                          to the extent */
Packit dd8086
  iso733_t         size;              /*! data length of File Section. This
Packit dd8086
                                          does not include the length of
Packit dd8086
                                          any XA Records. (9.1.2) */
Packit dd8086
  iso9660_dtime_t  recording_time;    /*! Recording date and time (9.1.3) */
Packit dd8086
  uint8_t          file_flags;        /*! If no XA then zero. If a directory,
Packit dd8086
                                        then bits 2,3 and 7 are zero.
Packit dd8086
                                        (9.1.6) */
Packit dd8086
  iso711_t         file_unit_size;    /*! File Unit size for the File
Packit dd8086
                                        Section if the File Section
Packit dd8086
                                        is recorded in interleaved
Packit dd8086
                                        mode. Otherwise zero. (9.1.7) */
Packit dd8086
  iso711_t         interleave_gap;    /*! Interleave Gap size for the
Packit dd8086
                                        File Section if the File
Packit dd8086
                                        Section is interleaved. Otherwise
Packit dd8086
                                        zero. (9.1.8) */
Packit dd8086
  iso723_t volume_sequence_number;    /*! Ordinal number of the volume
Packit dd8086
                                          in the Volume Set on which
Packit dd8086
                                          the Extent described by this
Packit dd8086
                                          Directory Record is
Packit dd8086
                                          recorded. (9.1.9) */
Packit dd8086
/*! MSVC compilers cannot handle a zero sized array in the middle
Packit dd8086
    of a struct, and iso9660_dir_s is reused within iso9660_pvd_s.
Packit dd8086
    Therefore, instead of defining:
Packit dd8086
       iso711_t filename_len;
Packit dd8086
       char     filename[];
Packit dd8086
    we leverage the fact that iso711_t and char are the same size
Packit dd8086
    and use an union. The only gotcha is that the actual string
Packit dd8086
    payload of filename.str[] starts at 1, not 0. */
Packit dd8086
  union {
Packit dd8086
    iso711_t        len;
Packit dd8086
    char            str[1];
Packit dd8086
  } filename;
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  \brief ISO-9660 Primary Volume Descriptor.
Packit dd8086
 */
Packit dd8086
struct iso9660_pvd_s {
Packit dd8086
  iso711_t         type;                         /**< ISO_VD_PRIMARY - 1 */
Packit dd8086
  char             id[5];                        /**< ISO_STANDARD_ID "CD001"
Packit dd8086
                                                  */
Packit dd8086
  iso711_t         version;                      /**< value 1 for ECMA 119 */
Packit dd8086
  char             unused1[1];                   /**< unused - value 0 */
Packit dd8086
  achar_t          system_id[ISO_MAX_SYSTEM_ID]; /**< each char is an achar */
Packit dd8086
  dchar_t          volume_id[ISO_MAX_VOLUME_ID]; /**< each char is a dchar */
Packit dd8086
  uint8_t          unused2[8];                   /**< unused - value 0 */
Packit dd8086
  iso733_t         volume_space_size;            /**< total number of
Packit dd8086
                                                    sectors */
Packit dd8086
  uint8_t          unused3[32];                  /**< unused - value 0 */
Packit dd8086
  iso723_t         volume_set_size;              /**< often 1 */
Packit dd8086
  iso723_t         volume_sequence_number;       /**< often 1 */
Packit dd8086
  iso723_t         logical_block_size;           /**< sector size, e.g. 2048 */
Packit dd8086
  iso733_t         path_table_size;              /**< bytes in path table */
Packit dd8086
  iso731_t         type_l_path_table;            /**< first sector of L Path
Packit dd8086
                                                      Table */
Packit dd8086
  iso731_t         opt_type_l_path_table;        /**< first sector of optional
Packit dd8086
                                                    L Path Table */
Packit dd8086
  iso732_t         type_m_path_table;            /**< first sector of M Path
Packit dd8086
                                                    table */
Packit dd8086
  iso732_t         opt_type_m_path_table;        /**< first sector of optional
Packit dd8086
                                                    M Path table */
Packit dd8086
  iso9660_dir_t    root_directory_record;        /**< See 8.4.18 and
Packit dd8086
                                                    section 9.1 of
Packit dd8086
                                                    ISO 9660 spec. */
Packit dd8086
  char             root_directory_filename;      /**< Is '\\0' or root
Packit dd8086
                                                  directory. Also pads previous
Packit dd8086
                                                  field to 34 bytes */
Packit dd8086
  dchar_t          volume_set_id[ISO_MAX_VOLUMESET_ID]; /**< Volume Set of
Packit dd8086
                                                           which the volume is
Packit dd8086
                                                           a member. See
Packit dd8086
                                                        section 8.4.19 */
Packit dd8086
  achar_t          publisher_id[ISO_MAX_PUBLISHER_ID];  /**< Publisher of
Packit dd8086
                                                         volume. If the first
Packit dd8086
                                                         character is '_' 0x5F,
Packit dd8086
                                                         the remaining bytes
Packit dd8086
                                                         specify a file
Packit dd8086
                                                         containing the user.
Packit dd8086
                                                         If all bytes are " "
Packit dd8086
                                                         (0x20) no publisher
Packit dd8086
                                                         is specified. See
Packit dd8086
                                                         section 8.4.20 of
Packit dd8086
                                                         ECMA 119 */
Packit dd8086
  achar_t          preparer_id[ISO_MAX_PREPARER_ID]; /**< preparer of
Packit dd8086
                                                         volume. If the first
Packit dd8086
                                                         character is '_' 0x5F,
Packit dd8086
                                                         the remaining bytes
Packit dd8086
                                                         specify a file
Packit dd8086
                                                         containing the user.
Packit dd8086
                                                         If all bytes are " "
Packit dd8086
                                                         (0x20) no preparer
Packit dd8086
                                                         is specified.
Packit dd8086
                                                         See section 8.4.21
Packit dd8086
                                                         of ECMA 119 */
Packit dd8086
  achar_t          application_id[ISO_MAX_APPLICATION_ID]; /**< application
Packit dd8086
                                                         use to create the
Packit dd8086
                                                         volume. If the first
Packit dd8086
                                                         character is '_' 0x5F,
Packit dd8086
                                                         the remaining bytes
Packit dd8086
                                                         specify a file
Packit dd8086
                                                         containing the user.
Packit dd8086
                                                         If all bytes are " "
Packit dd8086
                                                         (0x20) no application
Packit dd8086
                                                         is specified.
Packit dd8086
                                                         See section of 8.4.22
Packit dd8086
                                                         of ECMA 119 */
Packit dd8086
  dchar_t          copyright_file_id[37];     /**< Name of file for
Packit dd8086
                                                 copyright info. If
Packit dd8086
                                                 all bytes are " "
Packit dd8086
                                                 (0x20), then no file
Packit dd8086
                                                 is identified.  See
Packit dd8086
                                                 section 8.4.23 of ECMA 119
Packit dd8086
                                                 9660 spec. */
Packit dd8086
  dchar_t          abstract_file_id[37];      /**< See section 8.4.24 of
Packit dd8086
                                                 ECMA 119. */
Packit dd8086
  dchar_t          bibliographic_file_id[37]; /**< See section 7.5 of
Packit dd8086
                                                 ISO 9660 spec. */
Packit dd8086
  iso9660_ltime_t  creation_date;             /**< date and time of volume
Packit dd8086
                                                 creation. See section 8.4.26.1
Packit dd8086
                                                 of the ISO 9660 spec. */
Packit dd8086
  iso9660_ltime_t  modification_date;         /**< date and time of the most
Packit dd8086
                                                 recent modification.
Packit dd8086
                                                 See section 8.4.27 of the
Packit dd8086
                                                 ISO 9660 spec. */
Packit dd8086
  iso9660_ltime_t  expiration_date;           /**< date and time when volume
Packit dd8086
                                                 expires. See section 8.4.28
Packit dd8086
                                                 of the ISO 9660 spec. */
Packit dd8086
  iso9660_ltime_t  effective_date;            /**< date and time when volume
Packit dd8086
                                                 is effective. See section
Packit dd8086
                                                 8.4.29 of the ISO 9660
Packit dd8086
                                                 spec. */
Packit dd8086
  iso711_t         file_structure_version;    /**< value 1 for ECMA 119 */
Packit dd8086
  uint8_t           unused4[1];                /**< unused - value 0 */
Packit dd8086
  char             application_data[512];     /**< Application can put
Packit dd8086
                                                 whatever it wants here. */
Packit dd8086
  uint8_t          unused5[653];              /**< Unused - value 0 */
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
typedef struct iso9660_pvd_s  iso9660_pvd_t;
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  \brief ISO-9660 Supplementary Volume Descriptor.
Packit dd8086
Packit dd8086
  This is used for Joliet Extentions and is almost the same as the
Packit dd8086
  the primary descriptor but two unused fields, "unused1" and "unused3
Packit dd8086
  become "flags and "escape_sequences" respectively.
Packit dd8086
*/
Packit dd8086
struct iso9660_svd_s {
Packit dd8086
  iso711_t         type;                         /**< ISO_VD_SUPPLEMENTARY - 2
Packit dd8086
                                                  */
Packit dd8086
  char             id[5];                        /**< ISO_STANDARD_ID "CD001"
Packit dd8086
                                                  */
Packit dd8086
  iso711_t         version;                      /**< value 1 */
Packit dd8086
  char             flags;                        /**< Section 8.5.3 */
Packit dd8086
  achar_t          system_id[ISO_MAX_SYSTEM_ID]; /**< Section 8.5.4; each char
Packit dd8086
                                                    is an achar */
Packit dd8086
  dchar_t          volume_id[ISO_MAX_VOLUME_ID]; /**< Section 8.5.5; each char
Packit dd8086
                                                    is a dchar */
Packit dd8086
  char             unused2[8];
Packit dd8086
  iso733_t         volume_space_size;            /**< total number of
Packit dd8086
                                                    sectors */
Packit dd8086
  char             escape_sequences[32];         /**< Section 8.5.6 */
Packit dd8086
  iso723_t         volume_set_size;              /**< often 1 */
Packit dd8086
  iso723_t         volume_sequence_number;       /**< often 1 */
Packit dd8086
  iso723_t         logical_block_size;           /**< sector size, e.g. 2048 */
Packit dd8086
  iso733_t         path_table_size;              /**< 8.5.7; bytes in path
Packit dd8086
                                                    table */
Packit dd8086
  iso731_t         type_l_path_table;            /**< 8.5.8; first sector of
Packit dd8086
                                                    little-endian path table */
Packit dd8086
  iso731_t         opt_type_l_path_table;        /**< 8.5.9; first sector of
Packit dd8086
                                                    optional little-endian
Packit dd8086
                                                    path table */
Packit dd8086
  iso732_t         type_m_path_table;            /**< 8.5.10; first sector of
Packit dd8086
                                                    big-endian path table */
Packit dd8086
  iso732_t         opt_type_m_path_table;        /**< 8.5.11; first sector of
Packit dd8086
                                                    optional big-endian path
Packit dd8086
                                                    table */
Packit dd8086
  iso9660_dir_t    root_directory_record;        /**< See section 8.5.12 and
Packit dd8086
                                                    9.1 of ISO 9660 spec. */
Packit dd8086
  char             root_directory_filename;      /**< Is '\\0' or root
Packit dd8086
                                                  directory. Also pads previous
Packit dd8086
                                                  field to 34 bytes */
Packit dd8086
  dchar_t          volume_set_id[ISO_MAX_VOLUMESET_ID];    /**< 8.5.13;
Packit dd8086
                                                              dchars */
Packit dd8086
  achar_t          publisher_id[ISO_MAX_PUBLISHER_ID]; /**<
Packit dd8086
                                                          Publisher of volume.
Packit dd8086
                                                          If the first char-
Packit dd8086
                                                          aracter is '_' 0x5F,
Packit dd8086
                                                          the remaining bytes
Packit dd8086
                                                          specify a file
Packit dd8086
                                                          containing the user.
Packit dd8086
                                                          If all bytes are " "
Packit dd8086
                                                          (0x20) no publisher
Packit dd8086
                                                          is specified. See
Packit dd8086
                                                          section 8.5.14 of
Packit dd8086
                                                          ECMA 119 */
Packit dd8086
  achar_t          preparer_id[ISO_MAX_PREPARER_ID]; /**<
Packit dd8086
                                                        Data preparer of
Packit dd8086
                                                        volume. If the first
Packit dd8086
                                                        character is '_' 0x5F,
Packit dd8086
                                                        the remaining bytes
Packit dd8086
                                                        specify a file
Packit dd8086
                                                        containing the user.
Packit dd8086
                                                        If all bytes are " "
Packit dd8086
                                                        (0x20) no preparer
Packit dd8086
                                                        is specified.
Packit dd8086
                                                        See section 8.5.15
Packit dd8086
                                                        of ECMA 119 */
Packit dd8086
  achar_t          application_id[ISO_MAX_APPLICATION_ID]; /**< application
Packit dd8086
                                                         use to create the
Packit dd8086
                                                         volume. If the first
Packit dd8086
                                                         character is '_' 0x5F,
Packit dd8086
                                                         the remaining bytes
Packit dd8086
                                                         specify a file
Packit dd8086
                                                         containing the user.
Packit dd8086
                                                         If all bytes are " "
Packit dd8086
                                                         (0x20) no application
Packit dd8086
                                                         is specified.
Packit dd8086
                                                         See section of 8.5.16
Packit dd8086
                                                         of ECMA 119 */
Packit dd8086
  dchar_t          copyright_file_id[37];     /**< Name of file for
Packit dd8086
                                                 copyright info. If
Packit dd8086
                                                 all bytes are " "
Packit dd8086
                                                 (0x20), then no file
Packit dd8086
                                                 is identified.  See
Packit dd8086
                                                 section 8.5.17 of ECMA 119
Packit dd8086
                                                 9660 spec. */
Packit dd8086
  dchar_t          abstract_file_id[37];      /**< See section 8.5.18 of
Packit dd8086
                                                 ECMA 119. */
Packit dd8086
  dchar_t          bibliographic_file_id[37]; /**< See section 8.5.19 of
Packit dd8086
                                                 ECMA 119. */
Packit dd8086
  iso9660_ltime_t  creation_date;             /**< date and time of volume
Packit dd8086
                                                 creation. See section 8.4.26.1
Packit dd8086
                                                 of the ECMA 119 spec. */
Packit dd8086
  iso9660_ltime_t  modification_date;         /**< date and time of the most
Packit dd8086
                                                 recent modification.
Packit dd8086
                                                 See section 8.4.27 of the
Packit dd8086
                                                 ECMA 119 spec. */
Packit dd8086
  iso9660_ltime_t  expiration_date;           /**< date and time when volume
Packit dd8086
                                                 expires. See section 8.4.28
Packit dd8086
                                                 of the ECMA 119 spec. */
Packit dd8086
  iso9660_ltime_t  effective_date;            /**< date and time when volume
Packit dd8086
                                                 is effective. See section
Packit dd8086
                                                 8.4.29 of the ECMA 119
Packit dd8086
                                                 spec. */
Packit dd8086
  iso711_t         file_structure_version;    /**< value 1 for ECMA 119 */
Packit dd8086
  uint8_t           unused4[1];                /**< unused - value 0 */
Packit dd8086
  char             application_data[512];     /**< 8.5.20 Application can put
Packit dd8086
                                                 whatever it wants here. */
Packit dd8086
  uint8_t          unused5[653];              /**< Unused - value 0 */
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
typedef struct iso9660_svd_s  iso9660_svd_t;
Packit dd8086
Packit dd8086
PRAGMA_END_PACKED
Packit dd8086
Packit dd8086
/*! \brief A data type for a list of ISO9660
Packit dd8086
  statbuf file pointers returned from the various
Packit dd8086
  Cdio iso9660 readdir routines.
Packit dd8086
 */
Packit dd8086
typedef CdioList_t CdioISO9660FileList_t;
Packit dd8086
Packit dd8086
/*! \brief A data type for a list of ISO9660
Packit dd8086
  statbuf drectory pointer returned from the variious
Packit dd8086
  Cdio iso9660 readdir routines.
Packit dd8086
 */
Packit dd8086
typedef CdioList_t CdioISO9660DirList_t;
Packit dd8086
Packit dd8086
/*! \brief Unix stat-like version of iso9660_dir
Packit dd8086
Packit dd8086
   The iso9660_stat structure is not part of the ISO-9660
Packit dd8086
   specification. We use it for our to communicate information
Packit dd8086
   in a C-library friendly way, e.g struct tm time structures and
Packit dd8086
   a C-style filename string.
Packit dd8086
Packit dd8086
   @see iso9660_dir
Packit dd8086
*/
Packit dd8086
struct iso9660_stat_s { /* big endian!! */
Packit dd8086
Packit dd8086
 iso_rock_statbuf_t rr;              /**< Rock Ridge-specific fields  */
Packit dd8086
Packit dd8086
  struct tm          tm;              /**< time on entry - FIXME merge with
Packit dd8086
                                         one of entries above, like ctime? */
Packit dd8086
  lsn_t              lsn;             /**< start logical sector number */
Packit dd8086
  uint32_t           size;            /**< total size in bytes */
Packit dd8086
  uint32_t           secsize;         /**< number of sectors allocated */
Packit dd8086
  iso9660_xa_t       xa;              /**< XA attributes */
Packit dd8086
  enum { _STAT_FILE = 1, _STAT_DIR = 2 } type;
Packit dd8086
  bool               b_xa;
Packit dd8086
  char         filename[EMPTY_ARRAY_SIZE]; /**< filename */
Packit dd8086
};
Packit dd8086
Packit dd8086
/** A mask used in iso9660_ifs_read_vd which allows what kinds
Packit dd8086
    of extensions we allow, eg. Joliet, Rock Ridge, etc. */
Packit dd8086
typedef uint8_t iso_extension_mask_t;
Packit dd8086
Packit dd8086
/*! An enumeration for some of the ISO_EXTENSION_* \#defines below. This isn't
Packit dd8086
    really an enumeration one would really use in a program it is here
Packit dd8086
    to be helpful in debuggers where wants just to refer to the
Packit dd8086
    ISO_EXTENSION_*_ names and get something.
Packit dd8086
  */
Packit dd8086
extern enum iso_extension_enum_s {
Packit dd8086
  ISO_EXTENSION_JOLIET_LEVEL1 = 0x01,
Packit dd8086
  ISO_EXTENSION_JOLIET_LEVEL2 = 0x02,
Packit dd8086
  ISO_EXTENSION_JOLIET_LEVEL3 = 0x04,
Packit dd8086
  ISO_EXTENSION_ROCK_RIDGE    = 0x08,
Packit dd8086
  ISO_EXTENSION_HIGH_SIERRA   = 0x10
Packit dd8086
} iso_extension_enums;
Packit dd8086
Packit dd8086
Packit dd8086
#define ISO_EXTENSION_ALL           0xFF
Packit dd8086
#define ISO_EXTENSION_NONE          0x00
Packit dd8086
#define ISO_EXTENSION_JOLIET     \
Packit dd8086
  (ISO_EXTENSION_JOLIET_LEVEL1 | \
Packit dd8086
   ISO_EXTENSION_JOLIET_LEVEL2 | \
Packit dd8086
   ISO_EXTENSION_JOLIET_LEVEL3 )
Packit dd8086
Packit dd8086
Packit dd8086
/** This is an opaque structure. */
Packit dd8086
typedef struct _iso9660_s iso9660_t;
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
    @param p_iso the ISO-9660 file image to get data from
Packit dd8086
Packit dd8086
    @return true is unconditionally returned. If there was an error
Packit dd8086
    false would be returned. Resources associated with p_iso are
Packit dd8086
    freed.
Packit dd8086
  */
Packit dd8086
  bool iso9660_close (iso9660_t * p_iso);
Packit dd8086
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Open an ISO 9660 image for reading. Maybe in the future we will have
Packit dd8086
    a mode. NULL is returned on error.
Packit dd8086
Packit dd8086
    @param psz_path full path of ISO9660 file.
Packit dd8086
Packit dd8086
Packit dd8086
    @return a IS9660 structure  is unconditionally returned. The caller
Packit dd8086
    should call iso9660_close() when done.
Packit dd8086
  */
Packit dd8086
  iso9660_t *iso9660_open (const char *psz_path /*flags, mode */);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Open an ISO 9660 image for reading allowing various ISO 9660
Packit dd8086
    extensions.  Maybe in the future we will have a mode. NULL is
Packit dd8086
    returned on error.
Packit dd8086
Packit dd8086
    @see iso9660_open_fuzzy
Packit dd8086
  */
Packit dd8086
  iso9660_t *iso9660_open_ext (const char *psz_path,
Packit dd8086
                               iso_extension_mask_t iso_extension_mask);
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
    Some tolerence allowed for positioning the ISO 9660 image. We scan
Packit dd8086
    for STANDARD_ID and use that to set the eventual offset to adjust
Packit dd8086
    by (as long as that is <= i_fuzz).
Packit dd8086
Packit dd8086
    Maybe in the future we will have a mode. NULL is returned on error.
Packit dd8086
Packit dd8086
    @see iso9660_open, @see iso9660_fuzzy_ext
Packit dd8086
  */
Packit dd8086
  iso9660_t *iso9660_open_fuzzy (const char *psz_path /*flags, mode */,
Packit dd8086
                                 uint16_t i_fuzz);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Open an ISO 9660 image for reading with some tolerence for positioning
Packit dd8086
    of the ISO9660 image. We scan for ISO_STANDARD_ID and use that to set
Packit dd8086
    the eventual offset to adjust by (as long as that is <= i_fuzz).
Packit dd8086
Packit dd8086
    Maybe in the future we will have a mode. NULL is returned on error.
Packit dd8086
Packit dd8086
    @see iso9660_open_ext @see iso9660_open_fuzzy
Packit dd8086
  */
Packit dd8086
  iso9660_t *iso9660_open_fuzzy_ext (const char *psz_path,
Packit dd8086
                                     iso_extension_mask_t iso_extension_mask,
Packit dd8086
                                     uint16_t i_fuzz
Packit dd8086
                                     /*flags, mode */);
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
  bool iso9660_ifs_fuzzy_read_superblock (iso9660_t *p_iso,
Packit dd8086
                                          iso_extension_mask_t iso_extension_mask,
Packit dd8086
                                          uint16_t i_fuzz);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Seek to a position and then read i_size blocks.
Packit dd8086
Packit dd8086
    @param p_iso the ISO-9660 file image to get data from
Packit dd8086
Packit dd8086
    @param ptr place to put returned data. It should be able to store
Packit dd8086
    a least i_size bytes
Packit dd8086
Packit dd8086
    @param start location to start reading from
Packit dd8086
Packit dd8086
    @param i_size number of blocks to read. Each block is ISO_BLOCKSIZE bytes
Packit dd8086
    long.
Packit dd8086
Packit dd8086
    @return number of bytes (not blocks) read
Packit dd8086
Packit dd8086
  */
Packit dd8086
  long int iso9660_iso_seek_read (const iso9660_t *p_iso, /*out*/ void *ptr,
Packit dd8086
                                  lsn_t start, long int i_size);
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
  bool iso9660_fs_read_pvd ( const CdIo_t *p_cdio,
Packit dd8086
                             /*out*/ iso9660_pvd_t *p_pvd );
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Read the Primary Volume Descriptor for an ISO 9660 image.
Packit dd8086
    True is returned if read, and false if there was an error.
Packit dd8086
  */
Packit dd8086
  bool iso9660_ifs_read_pvd (const iso9660_t *p_iso,
Packit dd8086
                             /*out*/ iso9660_pvd_t *p_pvd);
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 iso9660_fs_read_superblock (CdIo_t *p_cdio,
Packit dd8086
                                   iso_extension_mask_t iso_extension_mask);
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 iso9660_ifs_read_superblock (iso9660_t *p_iso,
Packit dd8086
                                    iso_extension_mask_t iso_extension_mask);
Packit dd8086
Packit dd8086
Packit dd8086
/*====================================================
Packit dd8086
  Time conversion
Packit dd8086
 ====================================================*/
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Set time in format used in ISO 9660 directory index record
Packit dd8086
    from a Unix time structure.
Packit dd8086
  */
Packit dd8086
  void iso9660_set_dtime (const struct tm *tm,
Packit dd8086
                          /*out*/ iso9660_dtime_t *idr_date);
Packit dd8086
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Set time in format used in ISO 9660 directory index record
Packit dd8086
    from a Unix time structure. timezone is given as an offset
Packit dd8086
    correction in minutes.
Packit dd8086
  */
Packit dd8086
  void iso9660_set_dtime_with_timezone (const struct tm *p_tm,
Packit dd8086
                                        int timezone,
Packit dd8086
                                        /*out*/ iso9660_dtime_t *p_idr_date);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Set "long" time in format used in ISO 9660 primary volume descriptor
Packit dd8086
    from a Unix time structure. */
Packit dd8086
  void iso9660_set_ltime (const struct tm *_tm,
Packit dd8086
                          /*out*/ iso9660_ltime_t *p_pvd_date);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Set "long" time in format used in ISO 9660 primary volume descriptor
Packit dd8086
    from a Unix time structure. */
Packit dd8086
  void iso9660_set_ltime_with_timezone (const struct tm *_tm,
Packit dd8086
                                        int timezone,
Packit dd8086
                                        /*out*/ iso9660_ltime_t *p_pvd_date);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Get Unix time structure from format use in an ISO 9660 directory index
Packit dd8086
    record. Even though tm_wday and tm_yday fields are not explicitly in
Packit dd8086
    idr_date, they are calculated from the other fields.
Packit dd8086
Packit dd8086
    If tm is to reflect the localtime, set "b_localtime" true, otherwise
Packit dd8086
    tm will reported in GMT.
Packit dd8086
  */
Packit dd8086
  bool iso9660_get_dtime (const iso9660_dtime_t *idr_date, bool b_localtime,
Packit dd8086
                          /*out*/ struct tm *tm);
Packit dd8086
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Get "long" time in format used in ISO 9660 primary volume descriptor
Packit dd8086
    from a Unix time structure.
Packit dd8086
  */
Packit dd8086
  bool iso9660_get_ltime (const iso9660_ltime_t *p_ldate,
Packit dd8086
                          /*out*/ struct tm *p_tm);
Packit dd8086
Packit dd8086
  /*====================================================
Packit dd8086
    Character Classification and String Manipulation
Packit dd8086
    ====================================================*/
Packit dd8086
  /*!
Packit dd8086
    Return true if c is a DCHAR - a character that can appear in an an
Packit dd8086
    ISO-9600 level 1 directory name. These are the ASCII capital
Packit dd8086
    letters A-Z, the digits 0-9 and an underscore.
Packit dd8086
  */
Packit dd8086
  bool iso9660_is_dchar (int c);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Return true if c is an ACHAR -
Packit dd8086
    These are the DCHAR's plus some ASCII symbols including the space
Packit dd8086
    symbol.
Packit dd8086
  */
Packit dd8086
  bool iso9660_is_achar (int c);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Convert an ISO-9660 file name which is in the format usually stored
Packit dd8086
    in a ISO 9660 directory entry into what's usually listed as the
Packit dd8086
    file name in a listing.  Lowercase name, and remove trailing ;1's
Packit dd8086
    or .;1's and turn the other ;'s into version numbers.
Packit dd8086
Packit dd8086
    @param psz_oldname the ISO-9660 filename to be translated.
Packit dd8086
    @param psz_newname returned string. The caller allocates this and
Packit dd8086
    it should be at least the size of psz_oldname.
Packit dd8086
    @return length of the translated string is returned.
Packit dd8086
  */
Packit dd8086
  int iso9660_name_translate(const char *psz_oldname,
Packit dd8086
                             /*out*/ char *psz_newname);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Convert an ISO-9660 file name which is in the format usually stored
Packit dd8086
    in a ISO 9660 directory entry into what's usually listed as the
Packit dd8086
    file name in a listing.  Lowercase name if no Joliet Extension
Packit dd8086
    interpretation. Remove trailing ;1's or .;1's and turn the other
Packit dd8086
    ;'s into version numbers.
Packit dd8086
Packit dd8086
    @param psz_oldname the ISO-9660 filename to be translated.
Packit dd8086
    @param psz_newname returned string. The caller allocates this and
Packit dd8086
    it should be at least the size of psz_oldname.
Packit dd8086
    @param i_joliet_level 0 if not using Joliet Extension. Otherwise the
Packit dd8086
    Joliet level.
Packit dd8086
    @return length of the translated string is returned. It will be no greater
Packit dd8086
    than the length of psz_oldname.
Packit dd8086
  */
Packit dd8086
  int iso9660_name_translate_ext(const char *psz_oldname, char *psz_newname,
Packit dd8086
                                 uint8_t i_joliet_level);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Pad string src with spaces to size len and copy this to dst. If
Packit dd8086
    len is less than the length of src, dst will be truncated to the
Packit dd8086
    first len characters of src.
Packit dd8086
Packit dd8086
    src can also be scanned to see if it contains only ACHARs, DCHARs,
Packit dd8086
    7-bit ASCII chars depending on the enumeration _check.
Packit dd8086
Packit dd8086
    In addition to getting changed, dst is the return value.
Packit dd8086
    Note: this string might not be NULL terminated.
Packit dd8086
  */
Packit dd8086
  char *iso9660_strncpy_pad(char dst[], const char src[], size_t len,
Packit dd8086
                            enum strncpy_pad_check _check);
Packit dd8086
Packit dd8086
  /*=====================================================================
Packit dd8086
    File and Directory Names
Packit dd8086
    ======================================================================*/
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Check that psz_path is a valid ISO-9660 directory name.
Packit dd8086
Packit dd8086
    A valid directory name should not start out with a slash (/),
Packit dd8086
    dot (.) or null byte, should be less than 37 characters long,
Packit dd8086
    have no more than 8 characters in a directory component
Packit dd8086
    which is separated by a /, and consist of only DCHARs.
Packit dd8086
Packit dd8086
    True is returned if psz_path is valid.
Packit dd8086
  */
Packit dd8086
  bool iso9660_dirname_valid_p (const char psz_path[]);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Take psz_path and a version number and turn that into a ISO-9660
Packit dd8086
    pathname.  (That's just the pathname followd by ";" and the version
Packit dd8086
    number. For example, mydir/file.ext -> MYDIR/FILE.EXT;1 for version
Packit dd8086
    1. The resulting ISO-9660 pathname is returned.
Packit dd8086
  */
Packit dd8086
  char *iso9660_pathname_isofy (const char psz_path[], uint16_t i_version);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Check that psz_path is a valid ISO-9660 pathname.
Packit dd8086
Packit dd8086
    A valid pathname contains a valid directory name, if one appears and
Packit dd8086
    the filename portion should be no more than 8 characters for the
Packit dd8086
    file prefix and 3 characters in the extension (or portion after a
Packit dd8086
    dot). There should be exactly one dot somewhere in the filename
Packit dd8086
    portion and the filename should be composed of only DCHARs.
Packit dd8086
Packit dd8086
    True is returned if psz_path is valid.
Packit dd8086
  */
Packit dd8086
  bool iso9660_pathname_valid_p (const char psz_path[]);
Packit dd8086
Packit dd8086
/*=====================================================================
Packit dd8086
  directory tree
Packit dd8086
======================================================================*/
Packit dd8086
Packit dd8086
void
Packit dd8086
iso9660_dir_init_new (void *dir, uint32_t self, uint32_t ssize,
Packit dd8086
                      uint32_t parent, uint32_t psize,
Packit dd8086
                      const time_t *dir_time);
Packit dd8086
Packit dd8086
void
Packit dd8086
iso9660_dir_init_new_su (void *dir, uint32_t self, uint32_t ssize,
Packit dd8086
                         const void *ssu_data, unsigned int ssu_size,
Packit dd8086
                         uint32_t parent, uint32_t psize,
Packit dd8086
                         const void *psu_data, unsigned int psu_size,
Packit dd8086
                         const time_t *dir_time);
Packit dd8086
Packit dd8086
void
Packit dd8086
iso9660_dir_add_entry_su (void *dir, const char filename[], uint32_t extent,
Packit dd8086
                          uint32_t size, uint8_t file_flags,
Packit dd8086
                          const void *su_data,
Packit dd8086
                          unsigned int su_size, const time_t *entry_time);
Packit dd8086
Packit dd8086
unsigned int
Packit dd8086
iso9660_dir_calc_record_size (unsigned int namelen, unsigned int su_len);
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
   @param p_cdio the CD object to read from
Packit dd8086
Packit dd8086
   @return stat_t of entry if we found lsn, or NULL otherwise.
Packit dd8086
   Caller must free return value using iso9660_stat_free().
Packit dd8086
 */
Packit dd8086
#define iso9660_fs_find_lsn  iso9660_find_fs_lsn
Packit dd8086
iso9660_stat_t *iso9660_fs_find_lsn(CdIo_t *p_cdio, lsn_t i_lsn);
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
   @param p_cdio the ISO-9660 file image to get data from.
Packit dd8086
Packit dd8086
   @param i_lsn the LSN to find
Packit dd8086
Packit dd8086
   @param ppsz_full_filename the place to store the name of the path that has LSN.
Packit dd8086
   On entry this should point to NULL. If not, the value will be freed.
Packit dd8086
   On exit a value is malloc'd and the caller is responsible for
Packit dd8086
   freeing the result.
Packit dd8086
Packit dd8086
   @return stat_t of entry if we found lsn, or NULL otherwise.
Packit dd8086
   Caller must free return value using iso9660_stat_free().
Packit dd8086
 */
Packit dd8086
iso9660_stat_t *iso9660_fs_find_lsn_with_path(CdIo_t *p_cdio, lsn_t i_lsn,
Packit dd8086
                                              /*out*/ char **ppsz_full_filename);
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
   @param p_iso the ISO-9660 file image to get data from.
Packit dd8086
Packit dd8086
   @param i_lsn the LSN to find
Packit dd8086
Packit dd8086
   @return stat_t of entry if we found lsn, or NULL otherwise.
Packit dd8086
   Caller must free return value using iso9660_stat_free().
Packit dd8086
 */
Packit dd8086
iso9660_stat_t *iso9660_ifs_find_lsn(iso9660_t *p_iso, lsn_t i_lsn);
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
   @param p_iso pointer to iso_t
Packit dd8086
Packit dd8086
   @param i_lsn LSN to find
Packit dd8086
Packit dd8086
   @param ppsz_path  full path of lsn filename. On entry *ppsz_path should be
Packit dd8086
   NULL. On return it will be allocated an point to the full path of the
Packit dd8086
   file at lsn or NULL if the lsn is not found. You should deallocate
Packit dd8086
   *ppsz_path when you are done using it.
Packit dd8086
Packit dd8086
   @return stat_t of entry if we found lsn, or NULL otherwise.
Packit dd8086
   Caller must free return value using iso9660_stat_free().
Packit dd8086
 */
Packit dd8086
iso9660_stat_t *iso9660_ifs_find_lsn_with_path(iso9660_t *p_iso,
Packit dd8086
                                               lsn_t i_lsn,
Packit dd8086
                                               /*out*/ char **ppsz_path);
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  Free the passed iso9660_stat_t structure.
Packit dd8086
Packit dd8086
  @param p_stat iso9660 stat buffer to free.
Packit dd8086
Packit dd8086
 */
Packit dd8086
void iso9660_stat_free(iso9660_stat_t *p_stat);
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  Return file status for psz_path. NULL is returned on error.
Packit dd8086
Packit dd8086
  @param p_cdio the CD object to read from
Packit dd8086
Packit dd8086
  @param psz_path filename path to look up and get information about
Packit dd8086
Packit dd8086
  @return ISO 9660 file information. The caller must free the returned
Packit dd8086
  result using iso9660_stat_free().
Packit dd8086
Packit dd8086
Packit dd8086
  Important note:
Packit dd8086
Packit dd8086
  You make get different results looking up "/" versus "/." and the
Packit dd8086
  latter may give more complete information. "/" will take information
Packit dd8086
  from the PVD only, whereas "/." will force a directory read of "/" and
Packit dd8086
  find "." and in that Rock-Ridge information might be found which fills
Packit dd8086
  in more stat information. Ideally iso9660_fs_stat should be fixed.
Packit dd8086
  Patches anyone?
Packit dd8086
 */
Packit dd8086
iso9660_stat_t *iso9660_fs_stat (CdIo_t *p_cdio, const char psz_path[]);
Packit dd8086
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  Return file status for path name psz_path. NULL is returned on error.
Packit dd8086
  pathname version numbers in the ISO 9660 name are dropped, i.e. ;1
Packit dd8086
  is removed and if level 1 ISO-9660 names are lowercased.
Packit dd8086
Packit dd8086
  @param p_cdio the CD object to read from
Packit dd8086
Packit dd8086
  @param psz_path filename path to look up and get information about
Packit dd8086
Packit dd8086
  @return ISO 9660 file information.  The caller must free the
Packit dd8086
  returned result using iso9660_stat_free().
Packit dd8086
Packit dd8086
 */
Packit dd8086
iso9660_stat_t *iso9660_fs_stat_translate (CdIo_t *p_cdio,
Packit dd8086
                                           const char psz_path[]);
Packit dd8086
/*!
Packit dd8086
Packit dd8086
  @param p_iso the ISO-9660 file image to get data from
Packit dd8086
Packit dd8086
  @param psz_path path the look up
Packit dd8086
Packit dd8086
  @return file status for pathname. NULL is returned on error.
Packit dd8086
  The caller must free the returned result using iso9660_stat_free().
Packit dd8086
 */
Packit dd8086
iso9660_stat_t *iso9660_ifs_stat (iso9660_t *p_iso, const char psz_path[]);
Packit dd8086
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  @param p_iso the ISO-9660 file image to get data from
Packit dd8086
Packit dd8086
  @param psz_path filename path translate
Packit dd8086
Packit dd8086
  @return file status for path name psz_path. NULL is returned on
Packit dd8086
  error.  pathname version numbers in the ISO 9660 name are dropped,
Packit dd8086
  i.e. ;1 is removed and if level 1 ISO-9660 names are lowercased.
Packit dd8086
  The caller must free the returned result using iso9660_stat_free().
Packit dd8086
 */
Packit dd8086
iso9660_stat_t *iso9660_ifs_stat_translate (iso9660_t *p_iso,
Packit dd8086
                                            const char psz_path[]);
Packit dd8086
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  Create a new data structure to hold a list of
Packit dd8086
  ISO9660 statbuf-entry pointers for the files inside
Packit dd8086
  a directory.
Packit dd8086
Packit dd8086
  @return allocated list. Free with iso9660_filelist_free()
Packit dd8086
*/
Packit dd8086
CdioISO9660FileList_t * iso9660_filelist_new(void);
Packit dd8086
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  Create a new data structure to hold a list of
Packit dd8086
  ISO9660 statbuf entries for directory
Packit dd8086
  pointers for the files inside a directory.
Packit dd8086
Packit dd8086
  @return allocated list. Free with iso9660_dirlist_free()
Packit dd8086
*/
Packit dd8086
CdioISO9660DirList_t * iso9660_dirlist_new(void);
Packit dd8086
Packit dd8086
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  Free the passed CdioISOC9660FileList_t structure.
Packit dd8086
*/
Packit dd8086
void iso9660_filelist_free(CdioISO9660FileList_t *p_filelist);
Packit dd8086
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  Free the passed CdioISOC9660Dirlist_t structure.
Packit dd8086
*/
Packit dd8086
void iso9660_dirlist_free(CdioISO9660DirList_t *p_filelist);
Packit dd8086
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.
Packit dd8086
Packit dd8086
  @param p_cdio the CD object to read from
Packit dd8086
Packit dd8086
  @param psz_path path the read the directory from.
Packit dd8086
Packit dd8086
  @return file status for psz_path. The caller must free the
Packit dd8086
  The caller must free the returned result using iso9660_stat_free().
Packit dd8086
*/
Packit dd8086
CdioList_t * iso9660_fs_readdir (CdIo_t *p_cdio, const char psz_path[]);
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.
Packit dd8086
Packit dd8086
  @param p_iso the ISO-9660 file image to get data from
Packit dd8086
Packit dd8086
  @param psz_path path the read the directory from.
Packit dd8086
Packit dd8086
  @return file status for psz_path. The caller must free the
Packit dd8086
  The caller must free the returned result using iso9660_stat_free().
Packit dd8086
*/
Packit dd8086
CdioList_t * iso9660_ifs_readdir (iso9660_t *p_iso, const char psz_path[]);
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  Return the PVD's application ID.
Packit dd8086
Packit dd8086
  @param p_pvd the PVD to get data from
Packit dd8086
Packit dd8086
  @return  the application id.
Packit dd8086
  NULL is returned if there is some problem in getting this.
Packit dd8086
  The caller must free the resturned result using free() if
Packit dd8086
  not null.
Packit dd8086
*/
Packit dd8086
char * iso9660_get_application_id(iso9660_pvd_t *p_pvd);
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  Return the PVD's application ID.
Packit dd8086
Packit dd8086
  @param p_iso the ISO-9660 file image to get data from
Packit dd8086
Packit dd8086
  @param p_psz_app_id the application id set on success.
Packit dd8086
Packit dd8086
  NULL is returned if there is some problem in getting this.
Packit dd8086
  The caller must free the resturned result using free() if
Packit dd8086
  not null.
Packit dd8086
*/
Packit dd8086
bool iso9660_ifs_get_application_id(iso9660_t *p_iso,
Packit dd8086
                                    /*out*/ cdio_utf8_t **p_psz_app_id);
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  Return the Joliet level recognized for p_iso.
Packit dd8086
*/
Packit dd8086
uint8_t iso9660_ifs_get_joliet_level(iso9660_t *p_iso);
Packit dd8086
Packit dd8086
uint8_t iso9660_get_dir_len(const iso9660_dir_t *p_idr);
Packit dd8086
Packit dd8086
#ifdef FIXME
Packit dd8086
uint8_t iso9660_get_dir_size(const iso9660_dir_t *p_idr);
Packit dd8086
Packit dd8086
lsn_t iso9660_get_dir_extent(const iso9660_dir_t *p_idr);
Packit dd8086
#endif
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Return the directory name stored in the iso9660_dir_t
Packit dd8086
Packit dd8086
    A string is allocated: the caller must deallocate. This routine
Packit dd8086
    can return NULL if memory allocation fails.
Packit dd8086
  */
Packit dd8086
  char * iso9660_dir_to_name (const iso9660_dir_t *p_iso9660_dir);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Returns a POSIX mode for a given p_iso_dirent.
Packit dd8086
  */
Packit dd8086
  mode_t iso9660_get_posix_filemode(const iso9660_stat_t *p_iso_dirent);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Return a string containing the preparer id with trailing
Packit dd8086
    blanks removed.
Packit dd8086
  */
Packit dd8086
  char *iso9660_get_preparer_id(const iso9660_pvd_t *p_pvd);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Get the preparer ID.  psz_preparer_id is set to NULL if there
Packit dd8086
    is some problem in getting this and false is returned.
Packit dd8086
  */
Packit dd8086
  bool iso9660_ifs_get_preparer_id(iso9660_t *p_iso,
Packit dd8086
                                   /*out*/ cdio_utf8_t **p_psz_preparer_id);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Return a string containing the PVD's publisher id with trailing
Packit dd8086
    blanks removed.
Packit dd8086
  */
Packit dd8086
  char *iso9660_get_publisher_id(const iso9660_pvd_t *p_pvd);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Get the publisher ID.  psz_publisher_id is set to NULL if there
Packit dd8086
    is some problem in getting this and false is returned.
Packit dd8086
  */
Packit dd8086
  bool iso9660_ifs_get_publisher_id(iso9660_t *p_iso,
Packit dd8086
                                    /*out*/ cdio_utf8_t **p_psz_publisher_id);
Packit dd8086
Packit dd8086
  uint8_t iso9660_get_pvd_type(const iso9660_pvd_t *p_pvd);
Packit dd8086
Packit dd8086
  const char * iso9660_get_pvd_id(const iso9660_pvd_t *p_pvd);
Packit dd8086
Packit dd8086
  int iso9660_get_pvd_space_size(const iso9660_pvd_t *p_pvd);
Packit dd8086
Packit dd8086
  int iso9660_get_pvd_block_size(const iso9660_pvd_t *p_pvd) ;
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 iso9660_get_pvd_version(const iso9660_pvd_t *pvd) ;
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Return a string containing the PVD's system id with trailing
Packit dd8086
    blanks removed.
Packit dd8086
  */
Packit dd8086
  char *iso9660_get_system_id(const iso9660_pvd_t *p_pvd);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Return "yup" if any file has Rock-Ridge extensions. Warning: this can
Packit dd8086
    be time consuming. On an ISO 9600 image with lots of files but no Rock-Ridge
Packit dd8086
    extensions, the entire directory structure will be scanned up to u_file_limit.
Packit dd8086
Packit dd8086
    @param p_iso the ISO-9660 file image to get data from
Packit dd8086
Packit dd8086
    @param u_file_limit the maximimum number of (non-rock-ridge) files
Packit dd8086
    to consider before giving up and returning "dunno".
Packit dd8086
Packit dd8086
    "dunno" can also be returned if there was some error encountered
Packit dd8086
    such as not being able to allocate memory in processing.
Packit dd8086
Packit dd8086
  */
Packit dd8086
  bool_3way_t iso9660_have_rr(iso9660_t *p_iso, uint64_t u_file_limit);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Get the system ID.  psz_system_id is set to NULL if there
Packit dd8086
    is some problem in getting this and false is returned.
Packit dd8086
  */
Packit dd8086
  bool iso9660_ifs_get_system_id(iso9660_t *p_iso,
Packit dd8086
                                 /*out*/ cdio_utf8_t **p_psz_system_id);
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 iso9660_get_root_lsn(const iso9660_pvd_t *p_pvd);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Get the volume ID in the PVD.  psz_volume_id is set to NULL if there
Packit dd8086
    is some problem in getting this and false is returned.
Packit dd8086
  */
Packit dd8086
  char *iso9660_get_volume_id(const iso9660_pvd_t *p_pvd);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Get the volume ID in the PVD.  psz_volume_id is set to NULL if there
Packit dd8086
    is some problem in getting this and false is returned.
Packit dd8086
  */
Packit dd8086
  bool iso9660_ifs_get_volume_id(iso9660_t *p_iso,
Packit dd8086
                                 /*out*/ cdio_utf8_t **p_psz_volume_id);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Return the volumeset ID in the PVD.
Packit dd8086
    NULL is returned if there is some problem in getting this.
Packit dd8086
  */
Packit dd8086
  char *iso9660_get_volumeset_id(const iso9660_pvd_t *p_pvd);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Get the volumeset ID.  psz_systemset_id is set to NULL if there
Packit dd8086
    is some problem in getting this and false is returned.
Packit dd8086
  */
Packit dd8086
  bool iso9660_ifs_get_volumeset_id(iso9660_t *p_iso,
Packit dd8086
                                    /*out*/ cdio_utf8_t **p_psz_volumeset_id);
Packit dd8086
Packit dd8086
  /* pathtable */
Packit dd8086
Packit dd8086
  /*! Zero's out pathable. Do this first. */
Packit dd8086
  void iso9660_pathtable_init (void *pt);
Packit dd8086
Packit dd8086
  unsigned int iso9660_pathtable_get_size (const void *pt);
Packit dd8086
Packit dd8086
  uint16_t iso9660_pathtable_l_add_entry (void *pt, const char name[],
Packit dd8086
                                          uint32_t extent, uint16_t parent);
Packit dd8086
Packit dd8086
  uint16_t iso9660_pathtable_m_add_entry (void *pt, const char name[],
Packit dd8086
                                          uint32_t extent, uint16_t parent);
Packit dd8086
Packit dd8086
  /**=====================================================================
Packit dd8086
     Volume Descriptors
Packit dd8086
     ======================================================================*/
Packit dd8086
Packit dd8086
  void iso9660_set_pvd (void *pd, const char volume_id[],
Packit dd8086
                        const char application_id[],
Packit dd8086
                        const char publisher_id[], const char preparer_id[],
Packit dd8086
                        uint32_t iso_size, const void *root_dir,
Packit dd8086
                        uint32_t path_table_l_extent,
Packit dd8086
                        uint32_t path_table_m_extent,
Packit dd8086
                        uint32_t path_table_size, const time_t *pvd_time);
Packit dd8086
Packit dd8086
  void iso9660_set_evd (void *pd);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Return true if ISO 9660 image has extended attrributes (XA).
Packit dd8086
  */
Packit dd8086
  bool iso9660_ifs_is_xa (const iso9660_t * p_iso);
Packit dd8086
Packit dd8086
Packit dd8086
#ifndef DO_NOT_WANT_COMPATIBILITY
Packit dd8086
/** For compatibility with < 0.77 */
Packit dd8086
#define iso9660_isdchar       iso9660_is_dchar
Packit dd8086
#define iso9660_isachar       iso9660_is_achar
Packit dd8086
#endif /*DO_NOT_WANT_COMPATIBILITY*/
Packit dd8086
Packit dd8086
#ifdef __cplusplus
Packit dd8086
}
Packit dd8086
#endif /* __cplusplus */
Packit dd8086
Packit dd8086
#undef ISODCL
Packit dd8086
#endif /* CDIO_ISO9660_H_ */
Packit dd8086

Packit dd8086
/*
Packit dd8086
 * Local variables:
Packit dd8086
 *  c-file-style: "gnu"
Packit dd8086
 *  tab-width: 8
Packit dd8086
 *  indent-tabs-mode: nil
Packit dd8086
 * End:
Packit dd8086
 */