linux/fs/udf/ecma_167.h
<<
>>
Prefs
   1/*
   2 * ecma_167.h
   3 *
   4 * This file is based on ECMA-167 3rd edition (June 1997)
   5 * http://www.ecma.ch
   6 *
   7 * Copyright (c) 2001-2002  Ben Fennema <bfennema@falcon.csc.calpoly.edu>
   8 * All rights reserved.
   9 *
  10 * Redistribution and use in source and binary forms, with or without
  11 * modification, are permitted provided that the following conditions
  12 * are met:
  13 * 1. Redistributions of source code must retain the above copyright
  14 *    notice, this list of conditions, and the following disclaimer,
  15 *    without modification.
  16 * 2. The name of the author may not be used to endorse or promote products
  17 *    derived from this software without specific prior written permission.
  18 *
  19 * Alternatively, this software may be distributed under the terms of the
  20 * GNU Public License ("GPL").
  21 *
  22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
  26 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32 * SUCH DAMAGE.
  33 */
  34
  35#include <linux/types.h>
  36
  37#ifndef _ECMA_167_H
  38#define _ECMA_167_H 1
  39
  40/* Character set specification (ECMA 167r3 1/7.2.1) */
  41struct charspec {
  42        uint8_t         charSetType;
  43        uint8_t         charSetInfo[63];
  44} __attribute__ ((packed));
  45
  46/* Character Set Type (ECMA 167r3 1/7.2.1.1) */
  47#define CHARSPEC_TYPE_CS0               0x00    /* (1/7.2.2) */
  48#define CHARSPEC_TYPE_CS1               0x01    /* (1/7.2.3) */
  49#define CHARSPEC_TYPE_CS2               0x02    /* (1/7.2.4) */
  50#define CHARSPEC_TYPE_CS3               0x03    /* (1/7.2.5) */
  51#define CHARSPEC_TYPE_CS4               0x04    /* (1/7.2.6) */
  52#define CHARSPEC_TYPE_CS5               0x05    /* (1/7.2.7) */
  53#define CHARSPEC_TYPE_CS6               0x06    /* (1/7.2.8) */
  54#define CHARSPEC_TYPE_CS7               0x07    /* (1/7.2.9) */
  55#define CHARSPEC_TYPE_CS8               0x08    /* (1/7.2.10) */
  56
  57typedef uint8_t         dstring;
  58
  59/* Timestamp (ECMA 167r3 1/7.3) */
  60struct timestamp {
  61        __le16          typeAndTimezone;
  62        __le16          year;
  63        uint8_t         month;
  64        uint8_t         day;
  65        uint8_t         hour;
  66        uint8_t         minute;
  67        uint8_t         second;
  68        uint8_t         centiseconds;
  69        uint8_t         hundredsOfMicroseconds;
  70        uint8_t         microseconds;
  71} __attribute__ ((packed));
  72
  73/* Type and Time Zone (ECMA 167r3 1/7.3.1) */
  74#define TIMESTAMP_TYPE_MASK             0xF000
  75#define TIMESTAMP_TYPE_CUT              0x0000
  76#define TIMESTAMP_TYPE_LOCAL            0x1000
  77#define TIMESTAMP_TYPE_AGREEMENT        0x2000
  78#define TIMESTAMP_TIMEZONE_MASK         0x0FFF
  79
  80/* Entity identifier (ECMA 167r3 1/7.4) */
  81struct regid {
  82        uint8_t         flags;
  83        uint8_t         ident[23];
  84        uint8_t         identSuffix[8];
  85} __attribute__ ((packed));
  86
  87/* Flags (ECMA 167r3 1/7.4.1) */
  88#define ENTITYID_FLAGS_DIRTY            0x00
  89#define ENTITYID_FLAGS_PROTECTED        0x01
  90
  91/* Volume Structure Descriptor (ECMA 167r3 2/9.1) */
  92#define VSD_STD_ID_LEN                  5
  93struct volStructDesc {
  94        uint8_t         structType;
  95        uint8_t         stdIdent[VSD_STD_ID_LEN];
  96        uint8_t         structVersion;
  97        uint8_t         structData[2041];
  98} __attribute__ ((packed));
  99
 100/* Standard Identifier (EMCA 167r2 2/9.1.2) */
 101#define VSD_STD_ID_NSR02                "NSR02" /* (3/9.1) */
 102
 103/* Standard Identifier (ECMA 167r3 2/9.1.2) */
 104#define VSD_STD_ID_BEA01                "BEA01" /* (2/9.2) */
 105#define VSD_STD_ID_BOOT2                "BOOT2" /* (2/9.4) */
 106#define VSD_STD_ID_CD001                "CD001" /* (ECMA-119) */
 107#define VSD_STD_ID_CDW02                "CDW02" /* (ECMA-168) */
 108#define VSD_STD_ID_NSR03                "NSR03" /* (3/9.1) */
 109#define VSD_STD_ID_TEA01                "TEA01" /* (2/9.3) */
 110
 111/* Beginning Extended Area Descriptor (ECMA 167r3 2/9.2) */
 112struct beginningExtendedAreaDesc {
 113        uint8_t         structType;
 114        uint8_t         stdIdent[VSD_STD_ID_LEN];
 115        uint8_t         structVersion;
 116        uint8_t         structData[2041];
 117} __attribute__ ((packed));
 118
 119/* Terminating Extended Area Descriptor (ECMA 167r3 2/9.3) */
 120struct terminatingExtendedAreaDesc {
 121        uint8_t         structType;
 122        uint8_t         stdIdent[VSD_STD_ID_LEN];
 123        uint8_t         structVersion;
 124        uint8_t         structData[2041];
 125} __attribute__ ((packed));
 126
 127/* Boot Descriptor (ECMA 167r3 2/9.4) */
 128struct bootDesc {
 129        uint8_t                 structType;
 130        uint8_t                 stdIdent[VSD_STD_ID_LEN];
 131        uint8_t                 structVersion;
 132        uint8_t                 reserved1;
 133        struct regid            archType;
 134        struct regid            bootIdent;
 135        __le32                  bootExtLocation;
 136        __le32                  bootExtLength;
 137        __le64                  loadAddress;
 138        __le64                  startAddress;
 139        struct timestamp        descCreationDateAndTime;
 140        __le16                  flags;
 141        uint8_t                 reserved2[32];
 142        uint8_t                 bootUse[1906];
 143} __attribute__ ((packed));
 144
 145/* Flags (ECMA 167r3 2/9.4.12) */
 146#define BOOT_FLAGS_ERASE                0x01
 147
 148/* Extent Descriptor (ECMA 167r3 3/7.1) */
 149struct extent_ad {
 150        __le32          extLength;
 151        __le32          extLocation;
 152} __attribute__ ((packed));
 153
 154struct kernel_extent_ad {
 155        uint32_t        extLength;
 156        uint32_t        extLocation;
 157};
 158
 159/* Descriptor Tag (ECMA 167r3 3/7.2) */
 160struct tag {
 161        __le16          tagIdent;
 162        __le16          descVersion;
 163        uint8_t         tagChecksum;
 164        uint8_t         reserved;
 165        __le16          tagSerialNum;
 166        __le16          descCRC;
 167        __le16          descCRCLength;
 168        __le32          tagLocation;
 169} __attribute__ ((packed));
 170
 171/* Tag Identifier (ECMA 167r3 3/7.2.1) */
 172#define TAG_IDENT_PVD                   0x0001
 173#define TAG_IDENT_AVDP                  0x0002
 174#define TAG_IDENT_VDP                   0x0003
 175#define TAG_IDENT_IUVD                  0x0004
 176#define TAG_IDENT_PD                    0x0005
 177#define TAG_IDENT_LVD                   0x0006
 178#define TAG_IDENT_USD                   0x0007
 179#define TAG_IDENT_TD                    0x0008
 180#define TAG_IDENT_LVID                  0x0009
 181
 182/* NSR Descriptor (ECMA 167r3 3/9.1) */
 183struct NSRDesc {
 184        uint8_t         structType;
 185        uint8_t         stdIdent[VSD_STD_ID_LEN];
 186        uint8_t         structVersion;
 187        uint8_t         reserved;
 188        uint8_t         structData[2040];
 189} __attribute__ ((packed));
 190
 191/* Primary Volume Descriptor (ECMA 167r3 3/10.1) */
 192struct primaryVolDesc {
 193        struct tag              descTag;
 194        __le32                  volDescSeqNum;
 195        __le32                  primaryVolDescNum;
 196        dstring                 volIdent[32];
 197        __le16                  volSeqNum;
 198        __le16                  maxVolSeqNum;
 199        __le16                  interchangeLvl;
 200        __le16                  maxInterchangeLvl;
 201        __le32                  charSetList;
 202        __le32                  maxCharSetList;
 203        dstring                 volSetIdent[128];
 204        struct charspec         descCharSet;
 205        struct charspec         explanatoryCharSet;
 206        struct extent_ad        volAbstract;
 207        struct extent_ad        volCopyright;
 208        struct regid            appIdent;
 209        struct timestamp        recordingDateAndTime;
 210        struct regid            impIdent;
 211        uint8_t                 impUse[64];
 212        __le32                  predecessorVolDescSeqLocation;
 213        __le16                  flags;
 214        uint8_t                 reserved[22];
 215} __attribute__ ((packed));
 216
 217/* Flags (ECMA 167r3 3/10.1.21) */
 218#define PVD_FLAGS_VSID_COMMON           0x0001
 219
 220/* Anchor Volume Descriptor Pointer (ECMA 167r3 3/10.2) */
 221struct anchorVolDescPtr {
 222        struct tag              descTag;
 223        struct extent_ad        mainVolDescSeqExt;
 224        struct extent_ad        reserveVolDescSeqExt;
 225        uint8_t                 reserved[480];
 226} __attribute__ ((packed));
 227
 228/* Volume Descriptor Pointer (ECMA 167r3 3/10.3) */
 229struct volDescPtr {
 230        struct tag              descTag;
 231        __le32                  volDescSeqNum;
 232        struct extent_ad        nextVolDescSeqExt;
 233        uint8_t                 reserved[484];
 234} __attribute__ ((packed));
 235
 236/* Implementation Use Volume Descriptor (ECMA 167r3 3/10.4) */
 237struct impUseVolDesc {
 238        struct tag      descTag;
 239        __le32          volDescSeqNum;
 240        struct regid    impIdent;
 241        uint8_t         impUse[460];
 242} __attribute__ ((packed));
 243
 244/* Partition Descriptor (ECMA 167r3 3/10.5) */
 245struct partitionDesc {
 246        struct tag descTag;
 247        __le32 volDescSeqNum;
 248        __le16 partitionFlags;
 249        __le16 partitionNumber;
 250        struct regid partitionContents;
 251        uint8_t partitionContentsUse[128];
 252        __le32 accessType;
 253        __le32 partitionStartingLocation;
 254        __le32 partitionLength;
 255        struct regid impIdent;
 256        uint8_t impUse[128];
 257        uint8_t reserved[156];
 258} __attribute__ ((packed));
 259
 260/* Partition Flags (ECMA 167r3 3/10.5.3) */
 261#define PD_PARTITION_FLAGS_ALLOC        0x0001
 262
 263/* Partition Contents (ECMA 167r2 3/10.5.3) */
 264#define PD_PARTITION_CONTENTS_NSR02     "+NSR02"
 265
 266/* Partition Contents (ECMA 167r3 3/10.5.5) */
 267#define PD_PARTITION_CONTENTS_FDC01     "+FDC01"
 268#define PD_PARTITION_CONTENTS_CD001     "+CD001"
 269#define PD_PARTITION_CONTENTS_CDW02     "+CDW02"
 270#define PD_PARTITION_CONTENTS_NSR03     "+NSR03"
 271
 272/* Access Type (ECMA 167r3 3/10.5.7) */
 273#define PD_ACCESS_TYPE_NONE             0x00000000
 274#define PD_ACCESS_TYPE_READ_ONLY        0x00000001
 275#define PD_ACCESS_TYPE_WRITE_ONCE       0x00000002
 276#define PD_ACCESS_TYPE_REWRITABLE       0x00000003
 277#define PD_ACCESS_TYPE_OVERWRITABLE     0x00000004
 278
 279/* Logical Volume Descriptor (ECMA 167r3 3/10.6) */
 280struct logicalVolDesc {
 281        struct tag              descTag;
 282        __le32                  volDescSeqNum;
 283        struct charspec         descCharSet;
 284        dstring                 logicalVolIdent[128];
 285        __le32                  logicalBlockSize;
 286        struct regid            domainIdent;
 287        uint8_t                 logicalVolContentsUse[16];
 288        __le32                  mapTableLength;
 289        __le32                  numPartitionMaps;
 290        struct regid            impIdent;
 291        uint8_t                 impUse[128];
 292        struct extent_ad        integritySeqExt;
 293        uint8_t                 partitionMaps[0];
 294} __attribute__ ((packed));
 295
 296/* Generic Partition Map (ECMA 167r3 3/10.7.1) */
 297struct genericPartitionMap {
 298        uint8_t         partitionMapType;
 299        uint8_t         partitionMapLength;
 300        uint8_t         partitionMapping[0];
 301} __attribute__ ((packed));
 302
 303/* Partition Map Type (ECMA 167r3 3/10.7.1.1) */
 304#define GP_PARTITION_MAP_TYPE_UNDEF     0x00
 305#define GP_PARTIITON_MAP_TYPE_1         0x01
 306#define GP_PARTITION_MAP_TYPE_2         0x02
 307
 308/* Type 1 Partition Map (ECMA 167r3 3/10.7.2) */
 309struct genericPartitionMap1 {
 310        uint8_t         partitionMapType;
 311        uint8_t         partitionMapLength;
 312        __le16          volSeqNum;
 313        __le16          partitionNum;
 314} __attribute__ ((packed));
 315
 316/* Type 2 Partition Map (ECMA 167r3 3/10.7.3) */
 317struct genericPartitionMap2 {
 318        uint8_t         partitionMapType;
 319        uint8_t         partitionMapLength;
 320        uint8_t         partitionIdent[62];
 321} __attribute__ ((packed));
 322
 323/* Unallocated Space Descriptor (ECMA 167r3 3/10.8) */
 324struct unallocSpaceDesc {
 325        struct tag              descTag;
 326        __le32                  volDescSeqNum;
 327        __le32                  numAllocDescs;
 328        struct extent_ad        allocDescs[0];
 329} __attribute__ ((packed));
 330
 331/* Terminating Descriptor (ECMA 167r3 3/10.9) */
 332struct terminatingDesc {
 333        struct tag      descTag;
 334        uint8_t         reserved[496];
 335} __attribute__ ((packed));
 336
 337/* Logical Volume Integrity Descriptor (ECMA 167r3 3/10.10) */
 338struct logicalVolIntegrityDesc {
 339        struct tag              descTag;
 340        struct timestamp        recordingDateAndTime;
 341        __le32                  integrityType;
 342        struct extent_ad        nextIntegrityExt;
 343        uint8_t                 logicalVolContentsUse[32];
 344        __le32                  numOfPartitions;
 345        __le32                  lengthOfImpUse;
 346        __le32                  freeSpaceTable[0];
 347        __le32                  sizeTable[0];
 348        uint8_t                 impUse[0];
 349} __attribute__ ((packed));
 350
 351/* Integrity Type (ECMA 167r3 3/10.10.3) */
 352#define LVID_INTEGRITY_TYPE_OPEN        0x00000000
 353#define LVID_INTEGRITY_TYPE_CLOSE       0x00000001
 354
 355/* Recorded Address (ECMA 167r3 4/7.1) */
 356struct lb_addr {
 357        __le32          logicalBlockNum;
 358        __le16          partitionReferenceNum;
 359} __attribute__ ((packed));
 360
 361/* ... and its in-core analog */
 362struct kernel_lb_addr {
 363        uint32_t                logicalBlockNum;
 364        uint16_t                partitionReferenceNum;
 365};
 366
 367/* Short Allocation Descriptor (ECMA 167r3 4/14.14.1) */
 368struct short_ad {
 369        __le32          extLength;
 370        __le32          extPosition;
 371} __attribute__ ((packed));
 372
 373/* Long Allocation Descriptor (ECMA 167r3 4/14.14.2) */
 374struct long_ad {
 375        __le32          extLength;
 376        struct lb_addr  extLocation;
 377        uint8_t         impUse[6];
 378} __attribute__ ((packed));
 379
 380struct kernel_long_ad {
 381        uint32_t                extLength;
 382        struct kernel_lb_addr   extLocation;
 383        uint8_t                 impUse[6];
 384};
 385
 386/* Extended Allocation Descriptor (ECMA 167r3 4/14.14.3) */
 387struct ext_ad {
 388        __le32          extLength;
 389        __le32          recordedLength;
 390        __le32          informationLength;
 391        struct lb_addr  extLocation;
 392} __attribute__ ((packed));
 393
 394struct kernel_ext_ad {
 395        uint32_t                extLength;
 396        uint32_t                recordedLength;
 397        uint32_t                informationLength;
 398        struct kernel_lb_addr   extLocation;
 399};
 400
 401/* Descriptor Tag (ECMA 167r3 4/7.2 - See 3/7.2) */
 402
 403/* Tag Identifier (ECMA 167r3 4/7.2.1) */
 404#define TAG_IDENT_FSD                   0x0100
 405#define TAG_IDENT_FID                   0x0101
 406#define TAG_IDENT_AED                   0x0102
 407#define TAG_IDENT_IE                    0x0103
 408#define TAG_IDENT_TE                    0x0104
 409#define TAG_IDENT_FE                    0x0105
 410#define TAG_IDENT_EAHD                  0x0106
 411#define TAG_IDENT_USE                   0x0107
 412#define TAG_IDENT_SBD                   0x0108
 413#define TAG_IDENT_PIE                   0x0109
 414#define TAG_IDENT_EFE                   0x010A
 415
 416/* File Set Descriptor (ECMA 167r3 4/14.1) */
 417struct fileSetDesc {
 418        struct tag              descTag;
 419        struct timestamp        recordingDateAndTime;
 420        __le16                  interchangeLvl;
 421        __le16                  maxInterchangeLvl;
 422        __le32                  charSetList;
 423        __le32                  maxCharSetList;
 424        __le32                  fileSetNum;
 425        __le32                  fileSetDescNum;
 426        struct charspec         logicalVolIdentCharSet;
 427        dstring                 logicalVolIdent[128];
 428        struct charspec         fileSetCharSet;
 429        dstring                 fileSetIdent[32];
 430        dstring                 copyrightFileIdent[32];
 431        dstring                 abstractFileIdent[32];
 432        struct long_ad          rootDirectoryICB;
 433        struct regid            domainIdent;
 434        struct long_ad          nextExt;
 435        struct long_ad          streamDirectoryICB;
 436        uint8_t                 reserved[32];
 437} __attribute__ ((packed));
 438
 439/* Partition Header Descriptor (ECMA 167r3 4/14.3) */
 440struct partitionHeaderDesc {
 441        struct short_ad unallocSpaceTable;
 442        struct short_ad unallocSpaceBitmap;
 443        struct short_ad partitionIntegrityTable;
 444        struct short_ad freedSpaceTable;
 445        struct short_ad freedSpaceBitmap;
 446        uint8_t         reserved[88];
 447} __attribute__ ((packed));
 448
 449/* File Identifier Descriptor (ECMA 167r3 4/14.4) */
 450struct fileIdentDesc {
 451        struct tag      descTag;
 452        __le16          fileVersionNum;
 453        uint8_t         fileCharacteristics;
 454        uint8_t         lengthFileIdent;
 455        struct long_ad  icb;
 456        __le16          lengthOfImpUse;
 457        uint8_t         impUse[0];
 458        uint8_t         fileIdent[0];
 459        uint8_t         padding[0];
 460} __attribute__ ((packed));
 461
 462/* File Characteristics (ECMA 167r3 4/14.4.3) */
 463#define FID_FILE_CHAR_HIDDEN            0x01
 464#define FID_FILE_CHAR_DIRECTORY         0x02
 465#define FID_FILE_CHAR_DELETED           0x04
 466#define FID_FILE_CHAR_PARENT            0x08
 467#define FID_FILE_CHAR_METADATA          0x10
 468
 469/* Allocation Ext Descriptor (ECMA 167r3 4/14.5) */
 470struct allocExtDesc {
 471        struct tag      descTag;
 472        __le32          previousAllocExtLocation;
 473        __le32          lengthAllocDescs;
 474} __attribute__ ((packed));
 475
 476/* ICB Tag (ECMA 167r3 4/14.6) */
 477struct icbtag {
 478        __le32          priorRecordedNumDirectEntries;
 479        __le16          strategyType;
 480        __le16          strategyParameter;
 481        __le16          numEntries;
 482        uint8_t         reserved;
 483        uint8_t         fileType;
 484        struct lb_addr  parentICBLocation;
 485        __le16          flags;
 486} __attribute__ ((packed));
 487
 488/* Strategy Type (ECMA 167r3 4/14.6.2) */
 489#define ICBTAG_STRATEGY_TYPE_UNDEF      0x0000
 490#define ICBTAG_STRATEGY_TYPE_1          0x0001
 491#define ICBTAG_STRATEGY_TYPE_2          0x0002
 492#define ICBTAG_STRATEGY_TYPE_3          0x0003
 493#define ICBTAG_STRATEGY_TYPE_4          0x0004
 494
 495/* File Type (ECMA 167r3 4/14.6.6) */
 496#define ICBTAG_FILE_TYPE_UNDEF          0x00
 497#define ICBTAG_FILE_TYPE_USE            0x01
 498#define ICBTAG_FILE_TYPE_PIE            0x02
 499#define ICBTAG_FILE_TYPE_IE             0x03
 500#define ICBTAG_FILE_TYPE_DIRECTORY      0x04
 501#define ICBTAG_FILE_TYPE_REGULAR        0x05
 502#define ICBTAG_FILE_TYPE_BLOCK          0x06
 503#define ICBTAG_FILE_TYPE_CHAR           0x07
 504#define ICBTAG_FILE_TYPE_EA             0x08
 505#define ICBTAG_FILE_TYPE_FIFO           0x09
 506#define ICBTAG_FILE_TYPE_SOCKET         0x0A
 507#define ICBTAG_FILE_TYPE_TE             0x0B
 508#define ICBTAG_FILE_TYPE_SYMLINK        0x0C
 509#define ICBTAG_FILE_TYPE_STREAMDIR      0x0D
 510
 511/* Flags (ECMA 167r3 4/14.6.8) */
 512#define ICBTAG_FLAG_AD_MASK             0x0007
 513#define ICBTAG_FLAG_AD_SHORT            0x0000
 514#define ICBTAG_FLAG_AD_LONG             0x0001
 515#define ICBTAG_FLAG_AD_EXTENDED         0x0002
 516#define ICBTAG_FLAG_AD_IN_ICB           0x0003
 517#define ICBTAG_FLAG_SORTED              0x0008
 518#define ICBTAG_FLAG_NONRELOCATABLE      0x0010
 519#define ICBTAG_FLAG_ARCHIVE             0x0020
 520#define ICBTAG_FLAG_SETUID              0x0040
 521#define ICBTAG_FLAG_SETGID              0x0080
 522#define ICBTAG_FLAG_STICKY              0x0100
 523#define ICBTAG_FLAG_CONTIGUOUS          0x0200
 524#define ICBTAG_FLAG_SYSTEM              0x0400
 525#define ICBTAG_FLAG_TRANSFORMED         0x0800
 526#define ICBTAG_FLAG_MULTIVERSIONS       0x1000
 527#define ICBTAG_FLAG_STREAM              0x2000
 528
 529/* Indirect Entry (ECMA 167r3 4/14.7) */
 530struct indirectEntry {
 531        struct tag      descTag;
 532        struct icbtag   icbTag;
 533        struct long_ad  indirectICB;
 534} __attribute__ ((packed));
 535
 536/* Terminal Entry (ECMA 167r3 4/14.8) */
 537struct terminalEntry {
 538        struct tag      descTag;
 539        struct icbtag   icbTag;
 540} __attribute__ ((packed));
 541
 542/* File Entry (ECMA 167r3 4/14.9) */
 543struct fileEntry {
 544        struct tag              descTag;
 545        struct icbtag           icbTag;
 546        __le32                  uid;
 547        __le32                  gid;
 548        __le32                  permissions;
 549        __le16                  fileLinkCount;
 550        uint8_t                 recordFormat;
 551        uint8_t                 recordDisplayAttr;
 552        __le32                  recordLength;
 553        __le64                  informationLength;
 554        __le64                  logicalBlocksRecorded;
 555        struct timestamp        accessTime;
 556        struct timestamp        modificationTime;
 557        struct timestamp        attrTime;
 558        __le32                  checkpoint;
 559        struct long_ad          extendedAttrICB;
 560        struct regid            impIdent;
 561        __le64                  uniqueID;
 562        __le32                  lengthExtendedAttr;
 563        __le32                  lengthAllocDescs;
 564        uint8_t                 extendedAttr[0];
 565        uint8_t                 allocDescs[0];
 566} __attribute__ ((packed));
 567
 568/* Permissions (ECMA 167r3 4/14.9.5) */
 569#define FE_PERM_O_EXEC                  0x00000001U
 570#define FE_PERM_O_WRITE                 0x00000002U
 571#define FE_PERM_O_READ                  0x00000004U
 572#define FE_PERM_O_CHATTR                0x00000008U
 573#define FE_PERM_O_DELETE                0x00000010U
 574#define FE_PERM_G_EXEC                  0x00000020U
 575#define FE_PERM_G_WRITE                 0x00000040U
 576#define FE_PERM_G_READ                  0x00000080U
 577#define FE_PERM_G_CHATTR                0x00000100U
 578#define FE_PERM_G_DELETE                0x00000200U
 579#define FE_PERM_U_EXEC                  0x00000400U
 580#define FE_PERM_U_WRITE                 0x00000800U
 581#define FE_PERM_U_READ                  0x00001000U
 582#define FE_PERM_U_CHATTR                0x00002000U
 583#define FE_PERM_U_DELETE                0x00004000U
 584
 585/* Record Format (ECMA 167r3 4/14.9.7) */
 586#define FE_RECORD_FMT_UNDEF             0x00
 587#define FE_RECORD_FMT_FIXED_PAD         0x01
 588#define FE_RECORD_FMT_FIXED             0x02
 589#define FE_RECORD_FMT_VARIABLE8         0x03
 590#define FE_RECORD_FMT_VARIABLE16        0x04
 591#define FE_RECORD_FMT_VARIABLE16_MSB    0x05
 592#define FE_RECORD_FMT_VARIABLE32        0x06
 593#define FE_RECORD_FMT_PRINT             0x07
 594#define FE_RECORD_FMT_LF                0x08
 595#define FE_RECORD_FMT_CR                0x09
 596#define FE_RECORD_FMT_CRLF              0x0A
 597#define FE_RECORD_FMT_LFCR              0x0B
 598
 599/* Record Display Attributes (ECMA 167r3 4/14.9.8) */
 600#define FE_RECORD_DISPLAY_ATTR_UNDEF    0x00
 601#define FE_RECORD_DISPLAY_ATTR_1        0x01
 602#define FE_RECORD_DISPLAY_ATTR_2        0x02
 603#define FE_RECORD_DISPLAY_ATTR_3        0x03
 604
 605/* Extended Attribute Header Descriptor (ECMA 167r3 4/14.10.1) */
 606struct extendedAttrHeaderDesc {
 607        struct tag      descTag;
 608        __le32          impAttrLocation;
 609        __le32          appAttrLocation;
 610} __attribute__ ((packed));
 611
 612/* Generic Format (ECMA 167r3 4/14.10.2) */
 613struct genericFormat {
 614        __le32          attrType;
 615        uint8_t         attrSubtype;
 616        uint8_t         reserved[3];
 617        __le32          attrLength;
 618        uint8_t         attrData[0];
 619} __attribute__ ((packed));
 620
 621/* Character Set Information (ECMA 167r3 4/14.10.3) */
 622struct charSetInfo {
 623        __le32          attrType;
 624        uint8_t         attrSubtype;
 625        uint8_t         reserved[3];
 626        __le32          attrLength;
 627        __le32          escapeSeqLength;
 628        uint8_t         charSetType;
 629        uint8_t         escapeSeq[0];
 630} __attribute__ ((packed));
 631
 632/* Alternate Permissions (ECMA 167r3 4/14.10.4) */
 633struct altPerms {
 634        __le32          attrType;
 635        uint8_t         attrSubtype;
 636        uint8_t         reserved[3];
 637        __le32          attrLength;
 638        __le16          ownerIdent;
 639        __le16          groupIdent;
 640        __le16          permission;
 641} __attribute__ ((packed));
 642
 643/* File Times Extended Attribute (ECMA 167r3 4/14.10.5) */
 644struct fileTimesExtAttr {
 645        __le32          attrType;
 646        uint8_t         attrSubtype;
 647        uint8_t         reserved[3];
 648        __le32          attrLength;
 649        __le32          dataLength;
 650        __le32          fileTimeExistence;
 651        uint8_t         fileTimes;
 652} __attribute__ ((packed));
 653
 654/* FileTimeExistence (ECMA 167r3 4/14.10.5.6) */
 655#define FTE_CREATION                    0x00000001
 656#define FTE_DELETION                    0x00000004
 657#define FTE_EFFECTIVE                   0x00000008
 658#define FTE_BACKUP                      0x00000002
 659
 660/* Information Times Extended Attribute (ECMA 167r3 4/14.10.6) */
 661struct infoTimesExtAttr {
 662        __le32          attrType;
 663        uint8_t         attrSubtype;
 664        uint8_t         reserved[3];
 665        __le32          attrLength;
 666        __le32          dataLength;
 667        __le32          infoTimeExistence;
 668        uint8_t         infoTimes[0];
 669} __attribute__ ((packed));
 670
 671/* Device Specification (ECMA 167r3 4/14.10.7) */
 672struct deviceSpec {
 673        __le32          attrType;
 674        uint8_t         attrSubtype;
 675        uint8_t         reserved[3];
 676        __le32          attrLength;
 677        __le32          impUseLength;
 678        __le32          majorDeviceIdent;
 679        __le32          minorDeviceIdent;
 680        uint8_t         impUse[0];
 681} __attribute__ ((packed));
 682
 683/* Implementation Use Extended Attr (ECMA 167r3 4/14.10.8) */
 684struct impUseExtAttr {
 685        __le32          attrType;
 686        uint8_t         attrSubtype;
 687        uint8_t         reserved[3];
 688        __le32          attrLength;
 689        __le32          impUseLength;
 690        struct regid    impIdent;
 691        uint8_t         impUse[0];
 692} __attribute__ ((packed));
 693
 694/* Application Use Extended Attribute (ECMA 167r3 4/14.10.9) */
 695struct appUseExtAttr {
 696        __le32          attrType;
 697        uint8_t         attrSubtype;
 698        uint8_t         reserved[3];
 699        __le32          attrLength;
 700        __le32          appUseLength;
 701        struct regid    appIdent;
 702        uint8_t         appUse[0];
 703} __attribute__ ((packed));
 704
 705#define EXTATTR_CHAR_SET                1
 706#define EXTATTR_ALT_PERMS               3
 707#define EXTATTR_FILE_TIMES              5
 708#define EXTATTR_INFO_TIMES              6
 709#define EXTATTR_DEV_SPEC                12
 710#define EXTATTR_IMP_USE                 2048
 711#define EXTATTR_APP_USE                 65536
 712
 713/* Unallocated Space Entry (ECMA 167r3 4/14.11) */
 714struct unallocSpaceEntry {
 715        struct tag      descTag;
 716        struct icbtag   icbTag;
 717        __le32          lengthAllocDescs;
 718        uint8_t         allocDescs[0];
 719} __attribute__ ((packed));
 720
 721/* Space Bitmap Descriptor (ECMA 167r3 4/14.12) */
 722struct spaceBitmapDesc {
 723        struct tag      descTag;
 724        __le32          numOfBits;
 725        __le32          numOfBytes;
 726        uint8_t         bitmap[0];
 727} __attribute__ ((packed));
 728
 729/* Partition Integrity Entry (ECMA 167r3 4/14.13) */
 730struct partitionIntegrityEntry {
 731        struct tag              descTag;
 732        struct icbtag           icbTag;
 733        struct timestamp        recordingDateAndTime;
 734        uint8_t                 integrityType;
 735        uint8_t                 reserved[175];
 736        struct regid            impIdent;
 737        uint8_t                 impUse[256];
 738} __attribute__ ((packed));
 739
 740/* Short Allocation Descriptor (ECMA 167r3 4/14.14.1) */
 741
 742/* Extent Length (ECMA 167r3 4/14.14.1.1) */
 743#define EXT_RECORDED_ALLOCATED          0x00000000
 744#define EXT_NOT_RECORDED_ALLOCATED      0x40000000
 745#define EXT_NOT_RECORDED_NOT_ALLOCATED  0x80000000
 746#define EXT_NEXT_EXTENT_ALLOCDECS       0xC0000000
 747
 748/* Long Allocation Descriptor (ECMA 167r3 4/14.14.2) */
 749
 750/* Extended Allocation Descriptor (ECMA 167r3 4/14.14.3) */
 751
 752/* Logical Volume Header Descriptor (ECMA 167r3 4/14.15) */
 753struct logicalVolHeaderDesc {
 754        __le64          uniqueID;
 755        uint8_t         reserved[24];
 756} __attribute__ ((packed));
 757
 758/* Path Component (ECMA 167r3 4/14.16.1) */
 759struct pathComponent {
 760        uint8_t         componentType;
 761        uint8_t         lengthComponentIdent;
 762        __le16          componentFileVersionNum;
 763        dstring         componentIdent[0];
 764} __attribute__ ((packed));
 765
 766/* File Entry (ECMA 167r3 4/14.17) */
 767struct extendedFileEntry {
 768        struct tag              descTag;
 769        struct icbtag           icbTag;
 770        __le32                  uid;
 771        __le32                  gid;
 772        __le32                  permissions;
 773        __le16                  fileLinkCount;
 774        uint8_t                 recordFormat;
 775        uint8_t                 recordDisplayAttr;
 776        __le32                  recordLength;
 777        __le64                  informationLength;
 778        __le64                  objectSize;
 779        __le64                  logicalBlocksRecorded;
 780        struct timestamp        accessTime;
 781        struct timestamp        modificationTime;
 782        struct timestamp        createTime;
 783        struct timestamp        attrTime;
 784        __le32                  checkpoint;
 785        __le32                  reserved;
 786        struct long_ad          extendedAttrICB;
 787        struct long_ad          streamDirectoryICB;
 788        struct regid            impIdent;
 789        __le64                  uniqueID;
 790        __le32                  lengthExtendedAttr;
 791        __le32                  lengthAllocDescs;
 792        uint8_t                 extendedAttr[0];
 793        uint8_t                 allocDescs[0];
 794} __attribute__ ((packed));
 795
 796#endif /* _ECMA_167_H */
 797