Blame include/cdio/rock.h

Packit dd8086
/*
Packit dd8086
    Copyright (C) 2005, 2006 2008, 2012 Rocky Bernstein <rocky@gnu.org>
Packit dd8086
Packit dd8086
    See also rock.c by Eric Youngdale (1993) from GNU/Linux 
Packit dd8086
    This is 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 rock.h 
Packit dd8086
   \brief Things related to the Rock Ridge Interchange Protocol (RRIP)
Packit dd8086
Packit dd8086
   Applications will probably not include this directly but via 
Packit dd8086
   the iso9660.h header.
Packit dd8086
*/
Packit dd8086
Packit dd8086

Packit dd8086
#ifndef CDIO_ROCK_H_
Packit dd8086
#define CDIO_ROCK_H_
Packit dd8086
Packit dd8086
#include <cdio/types.h>
Packit dd8086
Packit dd8086
#ifdef __cplusplus
Packit dd8086
extern "C" {
Packit dd8086
#endif /* __cplusplus */
Packit dd8086
Packit dd8086
/*! An enumeration for some of the ISO_ROCK_* \#defines below. This isn't
Packit dd8086
  really an enumeration one would really use in a program it is to
Packit dd8086
  be helpful in debuggers where wants just to refer to the ISO_ROCK_*
Packit dd8086
  names and get something.
Packit dd8086
*/
Packit dd8086
extern enum iso_rock_enums {
Packit dd8086
  ISO_ROCK_IRUSR  = 000400,   /**< read permission (owner) */
Packit dd8086
  ISO_ROCK_IWUSR  = 000200,   /**< write permission (owner) */
Packit dd8086
  ISO_ROCK_IXUSR  = 000100,   /**< execute permission (owner) */
Packit dd8086
  ISO_ROCK_IRGRP  = 000040,   /**< read permission (group) */
Packit dd8086
  ISO_ROCK_IWGRP  = 000020,   /**< write permission (group) */
Packit dd8086
  ISO_ROCK_IXGRP  = 000010,   /**< execute permission (group) */
Packit dd8086
  ISO_ROCK_IROTH  = 000004,   /**< read permission (other) */
Packit dd8086
  ISO_ROCK_IWOTH  = 000002,   /**< write permission (other) */
Packit dd8086
  ISO_ROCK_IXOTH  = 000001,   /**< execute permission (other) */
Packit dd8086
Packit dd8086
  ISO_ROCK_ISUID  = 004000,   /**< set user ID on execution */
Packit dd8086
  ISO_ROCK_ISGID  = 002000,   /**< set group ID on execution */
Packit dd8086
  ISO_ROCK_ISVTX  = 001000,   /**< save swapped text even after use */
Packit dd8086
Packit dd8086
  ISO_ROCK_ISSOCK = 0140000,  /**< socket */
Packit dd8086
  ISO_ROCK_ISLNK  = 0120000,  /**< symbolic link */
Packit dd8086
  ISO_ROCK_ISREG  = 0100000,  /**< regular */
Packit dd8086
  ISO_ROCK_ISBLK  = 060000,   /**< block special */
Packit dd8086
  ISO_ROCK_ISCHR  = 020000,   /**< character special */
Packit dd8086
  ISO_ROCK_ISDIR  = 040000,   /**< directory */
Packit dd8086
  ISO_ROCK_ISFIFO = 010000    /**< pipe or FIFO */
Packit dd8086
} iso_rock_enums;
Packit dd8086
Packit dd8086
#define ISO_ROCK_IRUSR    000400  /** read permission (owner) */
Packit dd8086
#define ISO_ROCK_IWUSR    000200  /** write permission (owner) */
Packit dd8086
#define ISO_ROCK_IXUSR    000100  /** execute permission (owner) */
Packit dd8086
#define ISO_ROCK_IRGRP    000040  /** read permission (group) */
Packit dd8086
#define ISO_ROCK_IWGRP    000020  /** write permission (group) */
Packit dd8086
#define ISO_ROCK_IXGRP    000010  /** execute permission (group) */
Packit dd8086
#define ISO_ROCK_IROTH    000004  /** read permission (other) */
Packit dd8086
#define ISO_ROCK_IWOTH    000002  /** write permission (other) */
Packit dd8086
#define ISO_ROCK_IXOTH    000001  /** execute permission (other) */
Packit dd8086
Packit dd8086
#define ISO_ROCK_ISUID    004000  /** set user ID on execution */
Packit dd8086
#define ISO_ROCK_ISGID    002000  /** set group ID on execution */
Packit dd8086
#define ISO_ROCK_ISVTX    001000  /** save swapped text even after use */
Packit dd8086
Packit dd8086
#define ISO_ROCK_ISSOCK  0140000  /** socket */
Packit dd8086
#define ISO_ROCK_ISLNK   0120000  /** symbolic link */
Packit dd8086
#define ISO_ROCK_ISREG   0100000  /** regular */
Packit dd8086
#define ISO_ROCK_ISBLK    060000  /** block special */
Packit dd8086
#define ISO_ROCK_ISCHR    020000  /** character special */
Packit dd8086
#define ISO_ROCK_ISDIR    040000  /** directory */
Packit dd8086
#define ISO_ROCK_ISFIFO   010000  /** pipe or FIFO */
Packit dd8086
Packit dd8086
/** Enforced file locking (shared w/set group ID) */
Packit dd8086
#define ISO_ROCK_ENFMT ISO_ROCK_ISGID
Packit dd8086
Packit dd8086
PRAGMA_BEGIN_PACKED
Packit dd8086
Packit dd8086
/*! The next two structs are used by the system-use-sharing protocol
Packit dd8086
   (SUSP), in which the Rock Ridge extensions are embedded.  It is
Packit dd8086
   quite possible that other extensions are present on the disk, and
Packit dd8086
   this is fine as long as they all use SUSP. */
Packit dd8086
Packit dd8086
/*! system-use-sharing protocol */
Packit dd8086
typedef struct iso_su_sp_s{
Packit dd8086
  unsigned char magic[2];
Packit dd8086
  uint8_t       skip;
Packit dd8086
} GNUC_PACKED iso_su_sp_t;
Packit dd8086
Packit dd8086
/*! system-use extension record */
Packit dd8086
typedef struct iso_su_er_s {
Packit dd8086
  iso711_t      len_id;  /**< Identifier length. Value 10?. */
Packit dd8086
  unsigned char len_des;
Packit dd8086
  unsigned char len_src;
Packit dd8086
  iso711_t      ext_ver; /**< Extension version. Value 1? */
Packit dd8086
  char data[EMPTY_ARRAY_SIZE];
Packit dd8086
} GNUC_PACKED iso_su_er_t;
Packit dd8086
Packit dd8086
typedef struct iso_su_ce_s {
Packit dd8086
  char extent[8];
Packit dd8086
  char offset[8];
Packit dd8086
  char size[8];
Packit dd8086
} iso_su_ce_t;
Packit dd8086
Packit dd8086
/*! POSIX file attributes, PX. See Rock Ridge Section 4.1.2 */
Packit dd8086
typedef struct iso_rock_px_s {
Packit dd8086
  iso733_t st_mode;       /*! file mode permissions; same as st_mode 
Packit dd8086
                            of POSIX:5.6.1 */
Packit dd8086
  iso733_t st_nlinks;     /*! number of links to file; same as st_nlinks
Packit dd8086
                            of POSIX:5.6.1 */
Packit dd8086
  iso733_t st_uid;        /*! user id owner of file; same as st_uid
Packit dd8086
                            of POSIX:5.6.1 */
Packit dd8086
  iso733_t st_gid;        /*! group id of file; same as st_gid of 
Packit dd8086
                            of POSIX:5.6.1 */
Packit dd8086
} GNUC_PACKED iso_rock_px_t ;
Packit dd8086
Packit dd8086
/*! POSIX device number, PN. A PN is mandatory if the file type
Packit dd8086
  recorded in the "PX" File Mode field for a Directory Record
Packit dd8086
  indicates a character or block device (ISO_ROCK_ISCHR |
Packit dd8086
  ISO_ROCK_ISBLK).  This entry is ignored for other (non-Direcotry)
Packit dd8086
  file types. No more than one "PN" is recorded in the System Use Area
Packit dd8086
  of a Directory Record.
Packit dd8086
Packit dd8086
  See Rock Ridge Section 4.1.2 */
Packit dd8086
typedef struct iso_rock_pn_s {
Packit dd8086
  iso733_t dev_high;     /**< high-order 32 bits of the 64 bit device number.
Packit dd8086
                            7.2.3 encoded */
Packit dd8086
  iso733_t dev_low;      /**< low-order 32 bits of the 64 bit device number.
Packit dd8086
                            7.2.3 encoded */
Packit dd8086
} GNUC_PACKED iso_rock_pn_t ;
Packit dd8086
Packit dd8086
/*! These are the bits and their meanings for flags in the SL structure. */
Packit dd8086
typedef enum {
Packit dd8086
  ISO_ROCK_SL_CONTINUE = 1,
Packit dd8086
  ISO_ROCK_SL_CURRENT  = 2,
Packit dd8086
  ISO_ROCK_SL_PARENT   = 4,
Packit dd8086
  ISO_ROCK_SL_ROOT     = 8
Packit dd8086
} iso_rock_sl_flag_t;
Packit dd8086
Packit dd8086
#define ISO_ROCK_SL_CONTINUE 1
Packit dd8086
#define ISO_ROCK_SL_CURRENT  2
Packit dd8086
#define ISO_ROCK_SL_PARENT   4
Packit dd8086
#define ISO_ROCK_SL_ROOT     8
Packit dd8086
Packit dd8086
typedef struct iso_rock_sl_part_s {
Packit dd8086
  uint8_t flags;
Packit dd8086
  uint8_t len;
Packit dd8086
  char text[EMPTY_ARRAY_SIZE];
Packit dd8086
} GNUC_PACKED iso_rock_sl_part_t ;
Packit dd8086
Packit dd8086
/*! Symbolic link. See Rock Ridge Section 4.1.3 */
Packit dd8086
typedef struct iso_rock_sl_s {
Packit dd8086
  unsigned char flags;
Packit dd8086
  iso_rock_sl_part_t link;
Packit dd8086
} GNUC_PACKED iso_rock_sl_t ;
Packit dd8086
Packit dd8086
/*! Alternate name. See Rock Ridge Section 4.1.4 */
Packit dd8086
Packit dd8086
/*! These are the bits and their meanings for flags in the NM structure. */
Packit dd8086
typedef enum {
Packit dd8086
  ISO_ROCK_NM_CONTINUE = 1,
Packit dd8086
  ISO_ROCK_NM_CURRENT  = 2,
Packit dd8086
  ISO_ROCK_NM_PARENT   = 4,
Packit dd8086
} iso_rock_nm_flag_t;
Packit dd8086
Packit dd8086
#define ISO_ROCK_NM_CONTINUE 1
Packit dd8086
#define ISO_ROCK_NM_CURRENT  2
Packit dd8086
#define ISO_ROCK_NM_PARENT   4
Packit dd8086
Packit dd8086
Packit dd8086
typedef struct iso_rock_nm_s {
Packit dd8086
  unsigned char flags;
Packit dd8086
  char name[EMPTY_ARRAY_SIZE];
Packit dd8086
} GNUC_PACKED iso_rock_nm_t ;
Packit dd8086
Packit dd8086
/*! Child link. See Section 4.1.5.1 */
Packit dd8086
typedef struct iso_rock_cl_s {
Packit dd8086
  char location[1];
Packit dd8086
} GNUC_PACKED iso_rock_cl_t ;
Packit dd8086
Packit dd8086
/*! Parent link. See Section 4.1.5.2 */
Packit dd8086
typedef struct iso_rock_pl_s {
Packit dd8086
  char location[1];
Packit dd8086
} GNUC_PACKED iso_rock_pl_t ;
Packit dd8086
Packit dd8086
/*! These are the bits and their meanings for flags in the TF structure. */
Packit dd8086
typedef enum {
Packit dd8086
  ISO_ROCK_TF_CREATE     =  1,
Packit dd8086
  ISO_ROCK_TF_MODIFY     =  2,
Packit dd8086
  ISO_ROCK_TF_ACCESS     =  4,
Packit dd8086
  ISO_ROCK_TF_ATTRIBUTES =  8,
Packit dd8086
  ISO_ROCK_TF_BACKUP     =  16,
Packit dd8086
  ISO_ROCK_TF_EXPIRATION =  32,
Packit dd8086
  ISO_ROCK_TF_EFFECTIVE  =  64,
Packit dd8086
  ISO_ROCK_TF_LONG_FORM  = 128
Packit dd8086
} iso_rock_tf_flag_t;
Packit dd8086
Packit dd8086
/* These are the bits and their meanings for flags in the TF structure. */
Packit dd8086
#define ISO_ROCK_TF_CREATE      1
Packit dd8086
#define ISO_ROCK_TF_MODIFY      2
Packit dd8086
#define ISO_ROCK_TF_ACCESS      4
Packit dd8086
#define ISO_ROCK_TF_ATTRIBUTES  8
Packit dd8086
#define ISO_ROCK_TF_BACKUP     16
Packit dd8086
#define ISO_ROCK_TF_EXPIRATION 32
Packit dd8086
#define ISO_ROCK_TF_EFFECTIVE  64
Packit dd8086
#define ISO_ROCK_TF_LONG_FORM 128
Packit dd8086
Packit dd8086
/*! Time stamp(s) for a file. See Rock Ridge Section 4.1.6 */
Packit dd8086
typedef struct iso_rock_tf_s {
Packit dd8086
  uint8_t flags; /**< See ISO_ROCK_TF_* bits above. */
Packit dd8086
  uint8_t time_bytes[EMPTY_ARRAY_SIZE]; /**< A homogenious array of
Packit dd8086
                                           iso9660_ltime_t or
Packit dd8086
                                           iso9660_dtime_t entries
Packit dd8086
                                           depending on flags &
Packit dd8086
                                           ISO_ROCK_TF_LONG_FORM. Lacking
Packit dd8086
                                           a better method, we store
Packit dd8086
                                           this as an array of bytes
Packit dd8086
                                           and a cast to the
Packit dd8086
                                           appropriate type will have
Packit dd8086
                                           to be made before
Packit dd8086
                                           extraction.  */
Packit dd8086
} GNUC_PACKED iso_rock_tf_t ;
Packit dd8086
Packit dd8086
/*! File data in sparse format. See Rock Ridge Section 4.1.7 */
Packit dd8086
typedef struct iso_rock_sf_s {
Packit dd8086
  iso733_t virtual_size_high; /**< high-order 32 bits of virtual size */
Packit dd8086
  iso733_t virtual_size_low;  /**< low-order 32 bits of virtual size */
Packit dd8086
  uint8_t   table_depth;
Packit dd8086
} GNUC_PACKED iso_rock_sf_t ;
Packit dd8086
Packit dd8086
typedef struct iso_extension_record_s {
Packit dd8086
  char signature[2];   /**< signature word; either 'SP', 'CE', 'ER', 'RR',
Packit dd8086
                          'PX', 'PN', 'SL', 'NM', 'CL', 'PL', 'TF', or 
Packit dd8086
                          'ZF' */
Packit dd8086
  iso711_t len;        /**< length of system-user area - 44 for PX
Packit dd8086
                          20 for PN, 5+strlen(text) for SL, 21 for 
Packit dd8086
                          SF, etc. */
Packit dd8086
  iso711_t version;    /**< version number - value 1 */
Packit dd8086
  union {
Packit dd8086
    iso_su_sp_t    SP;  /**< system-use-sharing protocol - not
Packit dd8086
                          strictly part of Rock Ridge */
Packit dd8086
    iso_su_er_t    ER;  /**< system-use extension packet - not
Packit dd8086
                           strictly part of Rock Ridge */
Packit dd8086
    iso_su_ce_t    CE;  /**< system-use -  strictly part of Rock Ridge */
Packit dd8086
    iso_rock_px_t  PX;  /**< Rock Ridge POSIX file attributes */
Packit dd8086
    iso_rock_pn_t  PN;  /**< Rock Ridge POSIX device number */
Packit dd8086
    iso_rock_sl_t  SL;  /**< Rock Ridge symbolic link */
Packit dd8086
    iso_rock_nm_t  NM;  /**< Rock Ridge alternate name */
Packit dd8086
    iso_rock_cl_t  CL;  /**< Rock Ridge child link */
Packit dd8086
    iso_rock_pl_t  PL;  /**< Rock Ridge parent link */
Packit dd8086
    iso_rock_tf_t  TF;  /**< Rock Ridge timestamp(s) for a file */
Packit dd8086
  } u;
Packit dd8086
} GNUC_PACKED iso_extension_record_t;
Packit dd8086
Packit dd8086
typedef struct iso_rock_time_s {
Packit dd8086
  bool          b_used;     /**< If true, field has been set and  is valid. 
Packit dd8086
                               Otherwise remaning fields are meaningless. */
Packit dd8086
  bool          b_longdate;  /**< If true date format is a iso9660_ltime_t. 
Packit dd8086
                               Otherwise date is iso9660_dtime_t */
Packit dd8086
  union 
Packit dd8086
  {
Packit dd8086
    iso9660_ltime_t ltime;
Packit dd8086
    iso9660_dtime_t dtime;
Packit dd8086
  } t;
Packit dd8086
} GNUC_PACKED iso_rock_time_t;
Packit dd8086
Packit dd8086
typedef struct iso_rock_statbuf_s {
Packit dd8086
  bool_3way_t   b3_rock;              /**< has Rock Ridge extension. 
Packit dd8086
                                         If "yep", then the fields
Packit dd8086
                                         are used.
Packit dd8086
                                      */
Packit dd8086
  posix_mode_t  st_mode;              /**< protection */
Packit dd8086
  posix_nlink_t st_nlinks;            /**< number of hard links */
Packit dd8086
  posix_uid_t   st_uid;               /**< user ID of owner */
Packit dd8086
  posix_gid_t   st_gid;               /**< group ID of owner */
Packit dd8086
  uint8_t       s_rock_offset;
Packit dd8086
  int           i_symlink;            /**< size of psz_symlink */
Packit dd8086
  int           i_symlink_max;        /**< max allocated to psz_symlink */
Packit dd8086
  char         *psz_symlink;          /**< if symbolic link, name
Packit dd8086
                                         of pointed to file.  */
Packit dd8086
  iso_rock_time_t create;             /**< create time See ISO 9660:9.5.4. */
Packit dd8086
  iso_rock_time_t modify;             /**< time of last modification
Packit dd8086
                                         ISO 9660:9.5.5. st_mtime field of 
Packit dd8086
                                         POSIX:5.6.1. */
Packit dd8086
  iso_rock_time_t access;             /**< time of last file access st_atime 
Packit dd8086
                                         field of POSIX:5.6.1. */
Packit dd8086
  iso_rock_time_t attributes;         /**< time of last attribute change.
Packit dd8086
                                         st_ctime field of POSIX:5.6.1. */
Packit dd8086
  iso_rock_time_t backup;             /**< time of last backup. */
Packit dd8086
  iso_rock_time_t expiration;         /**< time of expiration; See ISO 
Packit dd8086
                                         9660:9.5.6. */
Packit dd8086
  iso_rock_time_t effective;          /**< Effective time; See ISO 9660:9.5.7.
Packit dd8086
                                       */
Packit dd8086
  uint32_t i_rdev;                    /**< the upper 16-bits is major device 
Packit dd8086
                                         number, the lower 16-bits is the
Packit dd8086
                                         minor device number */
Packit dd8086
Packit dd8086
} iso_rock_statbuf_t;
Packit dd8086
  
Packit dd8086
PRAGMA_END_PACKED
Packit dd8086
Packit dd8086
/*! return length of name field; 0: not found, -1: to be ignored */
Packit dd8086
int get_rock_ridge_filename(iso9660_dir_t * de, /*out*/ char * retname, 
Packit dd8086
                            /*out*/ iso9660_stat_t *p_stat);
Packit dd8086
Packit dd8086
  int parse_rock_ridge_stat(iso9660_dir_t *de, /*out*/ iso9660_stat_t *p_stat);
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Returns POSIX mode bitstring for a given file.
Packit dd8086
  */
Packit dd8086
  mode_t 
Packit dd8086
  iso9660_get_posix_filemode_from_rock(const iso_rock_statbuf_t *rr);
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  Returns a string which interpreting the POSIX mode st_mode. 
Packit dd8086
  For example:
Packit dd8086
  \verbatim
Packit dd8086
  drwxrws---
Packit dd8086
  -rw---Sr--
Packit dd8086
  lrwxrwxrwx
Packit dd8086
  \endverbatim
Packit dd8086
  
Packit dd8086
  A description of the characters in the string follows
Packit dd8086
  The 1st character is either "d" if the entry is a directory, "l" is
Packit dd8086
  a symbolic link or "-" if neither.
Packit dd8086
  
Packit dd8086
  The 2nd to 4th characters refer to permissions for a user while the
Packit dd8086
  the 5th to 7th characters refer to permissions for a group while, and 
Packit dd8086
  the 8th to 10h characters refer to permissions for everyone. 
Packit dd8086
  
Packit dd8086
  In each of these triplets the first character (2, 5, 8) is "r" if
Packit dd8086
  the entry is allowed to be read.
Packit dd8086
Packit dd8086
  The second character of a triplet (3, 6, 9) is "w" if the entry is
Packit dd8086
  allowed to be written.
Packit dd8086
Packit dd8086
  The third character of a triplet (4, 7, 10) is "x" if the entry is
Packit dd8086
  executable but not user (for character 4) or group (for characters
Packit dd8086
  6) settable and "s" if the item has the corresponding user/group set.
Packit dd8086
Packit dd8086
  For a directory having an executable property on ("x" or "s") means
Packit dd8086
  the directory is allowed to be listed or "searched". If the execute
Packit dd8086
  property is not allowed for a group or user but the corresponding
Packit dd8086
  group/user is set "S" indicates this. If none of these properties
Packit dd8086
  holds the "-" indicates this.
Packit dd8086
*/
Packit dd8086
const char *iso9660_get_rock_attr_str(posix_mode_t st_mode);
Packit dd8086
Packit dd8086
/** These variables are not used, but are defined to facilatate debugging
Packit dd8086
    by letting us use enumerations values (which also correspond to 
Packit dd8086
    \#define's inside a debugged program.
Packit dd8086
 */
Packit dd8086
extern iso_rock_nm_flag_t iso_rock_nm_flag;
Packit dd8086
extern iso_rock_sl_flag_t iso_rock_sl_flag;
Packit dd8086
extern iso_rock_tf_flag_t iso_rock_tf_flag;
Packit dd8086
Packit dd8086
#ifdef __cplusplus
Packit dd8086
}
Packit dd8086
#endif /* __cplusplus */
Packit dd8086
Packit dd8086
#endif /* CDIO_ROCK_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
 */