817 lines · c
1/*2 * ecma_167.h3 *4 * This file is based on ECMA-167 3rd edition (June 1997)5 * https://www.ecma.ch6 *7 * Copyright (c) 2001-2002 Ben Fennema8 * Copyright (c) 2017-2019 Pali Rohár <pali@kernel.org>9 * All rights reserved.10 *11 * Redistribution and use in source and binary forms, with or without12 * modification, are permitted provided that the following conditions13 * are met:14 * 1. Redistributions of source code must retain the above copyright15 * notice, this list of conditions, and the following disclaimer,16 * without modification.17 * 2. The name of the author may not be used to endorse or promote products18 * derived from this software without specific prior written permission.19 *20 * Alternatively, this software may be distributed under the terms of the21 * GNU Public License ("GPL").22 *23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE26 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR27 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF33 * SUCH DAMAGE.34 */35 36/**37 * @file38 * ECMA-167r3 defines and structure definitions39 */40 41#include <linux/types.h>42 43#ifndef _ECMA_167_H44#define _ECMA_167_H 145 46/* Character sets and coding - d-characters (ECMA 167r3 1/7.2) */47typedef uint8_t dchars;48 49/* Character set specification (ECMA 167r3 1/7.2.1) */50struct charspec {51 uint8_t charSetType;52 uint8_t charSetInfo[63];53} __packed;54 55/* Character Set Type (ECMA 167r3 1/7.2.1.1) */56#define CHARSPEC_TYPE_CS0 0x00 /* (1/7.2.2) */57#define CHARSPEC_TYPE_CS1 0x01 /* (1/7.2.3) */58#define CHARSPEC_TYPE_CS2 0x02 /* (1/7.2.4) */59#define CHARSPEC_TYPE_CS3 0x03 /* (1/7.2.5) */60#define CHARSPEC_TYPE_CS4 0x04 /* (1/7.2.6) */61#define CHARSPEC_TYPE_CS5 0x05 /* (1/7.2.7) */62#define CHARSPEC_TYPE_CS6 0x06 /* (1/7.2.8) */63#define CHARSPEC_TYPE_CS7 0x07 /* (1/7.2.9) */64#define CHARSPEC_TYPE_CS8 0x08 /* (1/7.2.10) */65 66/* Fixed-length character fields - d-string (EMCA 167r3 1/7.2.12) */67typedef uint8_t dstring;68 69/* Timestamp (ECMA 167r3 1/7.3) */70struct timestamp {71 __le16 typeAndTimezone;72 __le16 year;73 uint8_t month;74 uint8_t day;75 uint8_t hour;76 uint8_t minute;77 uint8_t second;78 uint8_t centiseconds;79 uint8_t hundredsOfMicroseconds;80 uint8_t microseconds;81} __packed;82 83/* Type and Time Zone (ECMA 167r3 1/7.3.1) */84#define TIMESTAMP_TYPE_MASK 0xF00085#define TIMESTAMP_TYPE_CUT 0x000086#define TIMESTAMP_TYPE_LOCAL 0x100087#define TIMESTAMP_TYPE_AGREEMENT 0x200088#define TIMESTAMP_TIMEZONE_MASK 0x0FFF89 90/* Entity identifier (ECMA 167r3 1/7.4) */91struct regid {92 uint8_t flags;93 uint8_t ident[23];94 uint8_t identSuffix[8];95} __packed;96 97/* Flags (ECMA 167r3 1/7.4.1) */98#define ENTITYID_FLAGS_DIRTY 0x0199#define ENTITYID_FLAGS_PROTECTED 0x02100 101/* Volume Structure Descriptor (ECMA 167r3 2/9.1) */102#define VSD_STD_ID_LEN 5103struct volStructDesc {104 uint8_t structType;105 uint8_t stdIdent[VSD_STD_ID_LEN];106 uint8_t structVersion;107 uint8_t structData[2041];108} __packed;109 110/* Standard Identifier (EMCA 167r2 2/9.1.2) */111#define VSD_STD_ID_NSR02 "NSR02" /* (3/9.1) */112 113/* Standard Identifier (ECMA 167r3 2/9.1.2) */114#define VSD_STD_ID_BEA01 "BEA01" /* (2/9.2) */115#define VSD_STD_ID_BOOT2 "BOOT2" /* (2/9.4) */116#define VSD_STD_ID_CD001 "CD001" /* (ECMA-119) */117#define VSD_STD_ID_CDW02 "CDW02" /* (ECMA-168) */118#define VSD_STD_ID_NSR03 "NSR03" /* (3/9.1) */119#define VSD_STD_ID_TEA01 "TEA01" /* (2/9.3) */120 121/* Beginning Extended Area Descriptor (ECMA 167r3 2/9.2) */122struct beginningExtendedAreaDesc {123 uint8_t structType;124 uint8_t stdIdent[VSD_STD_ID_LEN];125 uint8_t structVersion;126 uint8_t structData[2041];127} __packed;128 129/* Terminating Extended Area Descriptor (ECMA 167r3 2/9.3) */130struct terminatingExtendedAreaDesc {131 uint8_t structType;132 uint8_t stdIdent[VSD_STD_ID_LEN];133 uint8_t structVersion;134 uint8_t structData[2041];135} __packed;136 137/* Boot Descriptor (ECMA 167r3 2/9.4) */138struct bootDesc {139 uint8_t structType;140 uint8_t stdIdent[VSD_STD_ID_LEN];141 uint8_t structVersion;142 uint8_t reserved1;143 struct regid archType;144 struct regid bootIdent;145 __le32 bootExtLocation;146 __le32 bootExtLength;147 __le64 loadAddress;148 __le64 startAddress;149 struct timestamp descCreationDateAndTime;150 __le16 flags;151 uint8_t reserved2[32];152 uint8_t bootUse[1906];153} __packed;154 155/* Flags (ECMA 167r3 2/9.4.12) */156#define BOOT_FLAGS_ERASE 0x01157 158/* Extent Descriptor (ECMA 167r3 3/7.1) */159struct extent_ad {160 __le32 extLength;161 __le32 extLocation;162} __packed;163 164struct kernel_extent_ad {165 uint32_t extLength;166 uint32_t extLocation;167};168 169/* Descriptor Tag (ECMA 167r3 3/7.2) */170struct tag {171 __le16 tagIdent;172 __le16 descVersion;173 uint8_t tagChecksum;174 uint8_t reserved;175 __le16 tagSerialNum;176 __le16 descCRC;177 __le16 descCRCLength;178 __le32 tagLocation;179} __packed;180 181/* Tag Identifier (ECMA 167r3 3/7.2.1) */182#define TAG_IDENT_PVD 0x0001183#define TAG_IDENT_AVDP 0x0002184#define TAG_IDENT_VDP 0x0003185#define TAG_IDENT_IUVD 0x0004186#define TAG_IDENT_PD 0x0005187#define TAG_IDENT_LVD 0x0006188#define TAG_IDENT_USD 0x0007189#define TAG_IDENT_TD 0x0008190#define TAG_IDENT_LVID 0x0009191 192/* NSR Descriptor (ECMA 167r3 3/9.1) */193struct NSRDesc {194 uint8_t structType;195 uint8_t stdIdent[VSD_STD_ID_LEN];196 uint8_t structVersion;197 uint8_t reserved;198 uint8_t structData[2040];199} __packed;200 201/* Generic Descriptor */202struct genericDesc {203 struct tag descTag;204 __le32 volDescSeqNum;205 uint8_t reserved[492];206} __packed;207 208/* Primary Volume Descriptor (ECMA 167r3 3/10.1) */209struct primaryVolDesc {210 struct tag descTag;211 __le32 volDescSeqNum;212 __le32 primaryVolDescNum;213 dstring volIdent[32];214 __le16 volSeqNum;215 __le16 maxVolSeqNum;216 __le16 interchangeLvl;217 __le16 maxInterchangeLvl;218 __le32 charSetList;219 __le32 maxCharSetList;220 dstring volSetIdent[128];221 struct charspec descCharSet;222 struct charspec explanatoryCharSet;223 struct extent_ad volAbstract;224 struct extent_ad volCopyright;225 struct regid appIdent;226 struct timestamp recordingDateAndTime;227 struct regid impIdent;228 uint8_t impUse[64];229 __le32 predecessorVolDescSeqLocation;230 __le16 flags;231 uint8_t reserved[22];232} __packed;233 234/* Flags (ECMA 167r3 3/10.1.21) */235#define PVD_FLAGS_VSID_COMMON 0x0001236 237/* Anchor Volume Descriptor Pointer (ECMA 167r3 3/10.2) */238struct anchorVolDescPtr {239 struct tag descTag;240 struct extent_ad mainVolDescSeqExt;241 struct extent_ad reserveVolDescSeqExt;242 uint8_t reserved[480];243} __packed;244 245/* Volume Descriptor Pointer (ECMA 167r3 3/10.3) */246struct volDescPtr {247 struct tag descTag;248 __le32 volDescSeqNum;249 struct extent_ad nextVolDescSeqExt;250 uint8_t reserved[484];251} __packed;252 253/* Implementation Use Volume Descriptor (ECMA 167r3 3/10.4) */254struct impUseVolDesc {255 struct tag descTag;256 __le32 volDescSeqNum;257 struct regid impIdent;258 uint8_t impUse[460];259} __packed;260 261/* Partition Descriptor (ECMA 167r3 3/10.5) */262struct partitionDesc {263 struct tag descTag;264 __le32 volDescSeqNum;265 __le16 partitionFlags;266 __le16 partitionNumber;267 struct regid partitionContents;268 uint8_t partitionContentsUse[128];269 __le32 accessType;270 __le32 partitionStartingLocation;271 __le32 partitionLength;272 struct regid impIdent;273 uint8_t impUse[128];274 uint8_t reserved[156];275} __packed;276 277/* Partition Flags (ECMA 167r3 3/10.5.3) */278#define PD_PARTITION_FLAGS_ALLOC 0x0001279 280/* Partition Contents (ECMA 167r2 3/10.5.3) */281#define PD_PARTITION_CONTENTS_NSR02 "+NSR02"282 283/* Partition Contents (ECMA 167r3 3/10.5.5) */284#define PD_PARTITION_CONTENTS_FDC01 "+FDC01"285#define PD_PARTITION_CONTENTS_CD001 "+CD001"286#define PD_PARTITION_CONTENTS_CDW02 "+CDW02"287#define PD_PARTITION_CONTENTS_NSR03 "+NSR03"288 289/* Access Type (ECMA 167r3 3/10.5.7) */290#define PD_ACCESS_TYPE_NONE 0x00000000291#define PD_ACCESS_TYPE_READ_ONLY 0x00000001292#define PD_ACCESS_TYPE_WRITE_ONCE 0x00000002293#define PD_ACCESS_TYPE_REWRITABLE 0x00000003294#define PD_ACCESS_TYPE_OVERWRITABLE 0x00000004295 296/* Logical Volume Descriptor (ECMA 167r3 3/10.6) */297struct logicalVolDesc {298 struct tag descTag;299 __le32 volDescSeqNum;300 struct charspec descCharSet;301 dstring logicalVolIdent[128];302 __le32 logicalBlockSize;303 struct regid domainIdent;304 uint8_t logicalVolContentsUse[16];305 __le32 mapTableLength;306 __le32 numPartitionMaps;307 struct regid impIdent;308 uint8_t impUse[128];309 struct extent_ad integritySeqExt;310 uint8_t partitionMaps[];311} __packed;312 313/* Generic Partition Map (ECMA 167r3 3/10.7.1) */314struct genericPartitionMap {315 uint8_t partitionMapType;316 uint8_t partitionMapLength;317 uint8_t partitionMapping[];318} __packed;319 320/* Partition Map Type (ECMA 167r3 3/10.7.1.1) */321#define GP_PARTITION_MAP_TYPE_UNDEF 0x00322#define GP_PARTITION_MAP_TYPE_1 0x01323#define GP_PARTITION_MAP_TYPE_2 0x02324 325/* Type 1 Partition Map (ECMA 167r3 3/10.7.2) */326struct genericPartitionMap1 {327 uint8_t partitionMapType;328 uint8_t partitionMapLength;329 __le16 volSeqNum;330 __le16 partitionNum;331} __packed;332 333/* Type 2 Partition Map (ECMA 167r3 3/10.7.3) */334struct genericPartitionMap2 {335 uint8_t partitionMapType;336 uint8_t partitionMapLength;337 uint8_t partitionIdent[62];338} __packed;339 340/* Unallocated Space Descriptor (ECMA 167r3 3/10.8) */341struct unallocSpaceDesc {342 struct tag descTag;343 __le32 volDescSeqNum;344 __le32 numAllocDescs;345 struct extent_ad allocDescs[];346} __packed;347 348/* Terminating Descriptor (ECMA 167r3 3/10.9) */349struct terminatingDesc {350 struct tag descTag;351 uint8_t reserved[496];352} __packed;353 354/* Logical Volume Integrity Descriptor (ECMA 167r3 3/10.10) */355struct logicalVolIntegrityDesc {356 struct tag descTag;357 struct timestamp recordingDateAndTime;358 __le32 integrityType;359 struct extent_ad nextIntegrityExt;360 uint8_t logicalVolContentsUse[32];361 __le32 numOfPartitions;362 __le32 lengthOfImpUse;363 __le32 freeSpaceTable[];364 /* __le32 sizeTable[]; */365 /* uint8_t impUse[]; */366} __packed;367 368/* Integrity Type (ECMA 167r3 3/10.10.3) */369#define LVID_INTEGRITY_TYPE_OPEN 0x00000000370#define LVID_INTEGRITY_TYPE_CLOSE 0x00000001371 372/* Recorded Address (ECMA 167r3 4/7.1) */373struct lb_addr {374 __le32 logicalBlockNum;375 __le16 partitionReferenceNum;376} __packed;377 378/* ... and its in-core analog */379struct kernel_lb_addr {380 uint32_t logicalBlockNum;381 uint16_t partitionReferenceNum;382};383 384/* Short Allocation Descriptor (ECMA 167r3 4/14.14.1) */385struct short_ad {386 __le32 extLength;387 __le32 extPosition;388} __packed;389 390/* Long Allocation Descriptor (ECMA 167r3 4/14.14.2) */391struct long_ad {392 __le32 extLength;393 struct lb_addr extLocation;394 uint8_t impUse[6];395} __packed;396 397struct kernel_long_ad {398 uint32_t extLength;399 struct kernel_lb_addr extLocation;400 uint8_t impUse[6];401};402 403/* Extended Allocation Descriptor (ECMA 167r3 4/14.14.3) */404struct ext_ad {405 __le32 extLength;406 __le32 recordedLength;407 __le32 informationLength;408 struct lb_addr extLocation;409} __packed;410 411struct kernel_ext_ad {412 uint32_t extLength;413 uint32_t recordedLength;414 uint32_t informationLength;415 struct kernel_lb_addr extLocation;416};417 418/* Descriptor Tag (ECMA 167r3 4/7.2 - See 3/7.2) */419 420/* Tag Identifier (ECMA 167r3 4/7.2.1) */421#define TAG_IDENT_FSD 0x0100422#define TAG_IDENT_FID 0x0101423#define TAG_IDENT_AED 0x0102424#define TAG_IDENT_IE 0x0103425#define TAG_IDENT_TE 0x0104426#define TAG_IDENT_FE 0x0105427#define TAG_IDENT_EAHD 0x0106428#define TAG_IDENT_USE 0x0107429#define TAG_IDENT_SBD 0x0108430#define TAG_IDENT_PIE 0x0109431#define TAG_IDENT_EFE 0x010A432 433/* File Set Descriptor (ECMA 167r3 4/14.1) */434struct fileSetDesc {435 struct tag descTag;436 struct timestamp recordingDateAndTime;437 __le16 interchangeLvl;438 __le16 maxInterchangeLvl;439 __le32 charSetList;440 __le32 maxCharSetList;441 __le32 fileSetNum;442 __le32 fileSetDescNum;443 struct charspec logicalVolIdentCharSet;444 dstring logicalVolIdent[128];445 struct charspec fileSetCharSet;446 dstring fileSetIdent[32];447 dstring copyrightFileIdent[32];448 dstring abstractFileIdent[32];449 struct long_ad rootDirectoryICB;450 struct regid domainIdent;451 struct long_ad nextExt;452 struct long_ad streamDirectoryICB;453 uint8_t reserved[32];454} __packed;455 456/* Partition Header Descriptor (ECMA 167r3 4/14.3) */457struct partitionHeaderDesc {458 struct short_ad unallocSpaceTable;459 struct short_ad unallocSpaceBitmap;460 struct short_ad partitionIntegrityTable;461 struct short_ad freedSpaceTable;462 struct short_ad freedSpaceBitmap;463 uint8_t reserved[88];464} __packed;465 466/* File Identifier Descriptor (ECMA 167r3 4/14.4) */467struct fileIdentDesc {468 struct tag descTag;469 __le16 fileVersionNum;470 uint8_t fileCharacteristics;471 uint8_t lengthFileIdent;472 struct long_ad icb;473 __le16 lengthOfImpUse;474 /* uint8_t impUse[]; */475 /* uint8_t fileIdent[]; */476 /* uint8_t padding[]; */477} __packed;478 479/* File Characteristics (ECMA 167r3 4/14.4.3) */480#define FID_FILE_CHAR_HIDDEN 0x01481#define FID_FILE_CHAR_DIRECTORY 0x02482#define FID_FILE_CHAR_DELETED 0x04483#define FID_FILE_CHAR_PARENT 0x08484#define FID_FILE_CHAR_METADATA 0x10485 486/* Allocation Ext Descriptor (ECMA 167r3 4/14.5) */487struct allocExtDesc {488 struct tag descTag;489 __le32 previousAllocExtLocation;490 __le32 lengthAllocDescs;491} __packed;492 493/* ICB Tag (ECMA 167r3 4/14.6) */494struct icbtag {495 __le32 priorRecordedNumDirectEntries;496 __le16 strategyType;497 __le16 strategyParameter;498 __le16 numEntries;499 uint8_t reserved;500 uint8_t fileType;501 struct lb_addr parentICBLocation;502 __le16 flags;503} __packed;504 505/* Strategy Type (ECMA 167r3 4/14.6.2) */506#define ICBTAG_STRATEGY_TYPE_UNDEF 0x0000507#define ICBTAG_STRATEGY_TYPE_1 0x0001508#define ICBTAG_STRATEGY_TYPE_2 0x0002509#define ICBTAG_STRATEGY_TYPE_3 0x0003510#define ICBTAG_STRATEGY_TYPE_4 0x0004511 512/* File Type (ECMA 167r3 4/14.6.6) */513#define ICBTAG_FILE_TYPE_UNDEF 0x00514#define ICBTAG_FILE_TYPE_USE 0x01515#define ICBTAG_FILE_TYPE_PIE 0x02516#define ICBTAG_FILE_TYPE_IE 0x03517#define ICBTAG_FILE_TYPE_DIRECTORY 0x04518#define ICBTAG_FILE_TYPE_REGULAR 0x05519#define ICBTAG_FILE_TYPE_BLOCK 0x06520#define ICBTAG_FILE_TYPE_CHAR 0x07521#define ICBTAG_FILE_TYPE_EA 0x08522#define ICBTAG_FILE_TYPE_FIFO 0x09523#define ICBTAG_FILE_TYPE_SOCKET 0x0A524#define ICBTAG_FILE_TYPE_TE 0x0B525#define ICBTAG_FILE_TYPE_SYMLINK 0x0C526#define ICBTAG_FILE_TYPE_STREAMDIR 0x0D527 528/* Flags (ECMA 167r3 4/14.6.8) */529#define ICBTAG_FLAG_AD_MASK 0x0007530#define ICBTAG_FLAG_AD_SHORT 0x0000531#define ICBTAG_FLAG_AD_LONG 0x0001532#define ICBTAG_FLAG_AD_EXTENDED 0x0002533#define ICBTAG_FLAG_AD_IN_ICB 0x0003534#define ICBTAG_FLAG_SORTED 0x0008535#define ICBTAG_FLAG_NONRELOCATABLE 0x0010536#define ICBTAG_FLAG_ARCHIVE 0x0020537#define ICBTAG_FLAG_SETUID 0x0040538#define ICBTAG_FLAG_SETGID 0x0080539#define ICBTAG_FLAG_STICKY 0x0100540#define ICBTAG_FLAG_CONTIGUOUS 0x0200541#define ICBTAG_FLAG_SYSTEM 0x0400542#define ICBTAG_FLAG_TRANSFORMED 0x0800543#define ICBTAG_FLAG_MULTIVERSIONS 0x1000544#define ICBTAG_FLAG_STREAM 0x2000545 546/* Indirect Entry (ECMA 167r3 4/14.7) */547struct indirectEntry {548 struct tag descTag;549 struct icbtag icbTag;550 struct long_ad indirectICB;551} __packed;552 553/* Terminal Entry (ECMA 167r3 4/14.8) */554struct terminalEntry {555 struct tag descTag;556 struct icbtag icbTag;557} __packed;558 559/* File Entry (ECMA 167r3 4/14.9) */560struct fileEntry {561 struct tag descTag;562 struct icbtag icbTag;563 __le32 uid;564 __le32 gid;565 __le32 permissions;566 __le16 fileLinkCount;567 uint8_t recordFormat;568 uint8_t recordDisplayAttr;569 __le32 recordLength;570 __le64 informationLength;571 __le64 logicalBlocksRecorded;572 struct timestamp accessTime;573 struct timestamp modificationTime;574 struct timestamp attrTime;575 __le32 checkpoint;576 struct long_ad extendedAttrICB;577 struct regid impIdent;578 __le64 uniqueID;579 __le32 lengthExtendedAttr;580 __le32 lengthAllocDescs;581 uint8_t extendedAttr[];582 /* uint8_t allocDescs[]; */583} __packed;584 585/* Permissions (ECMA 167r3 4/14.9.5) */586#define FE_PERM_O_EXEC 0x00000001U587#define FE_PERM_O_WRITE 0x00000002U588#define FE_PERM_O_READ 0x00000004U589#define FE_PERM_O_CHATTR 0x00000008U590#define FE_PERM_O_DELETE 0x00000010U591#define FE_PERM_G_EXEC 0x00000020U592#define FE_PERM_G_WRITE 0x00000040U593#define FE_PERM_G_READ 0x00000080U594#define FE_PERM_G_CHATTR 0x00000100U595#define FE_PERM_G_DELETE 0x00000200U596#define FE_PERM_U_EXEC 0x00000400U597#define FE_PERM_U_WRITE 0x00000800U598#define FE_PERM_U_READ 0x00001000U599#define FE_PERM_U_CHATTR 0x00002000U600#define FE_PERM_U_DELETE 0x00004000U601 602/* Record Format (ECMA 167r3 4/14.9.7) */603#define FE_RECORD_FMT_UNDEF 0x00604#define FE_RECORD_FMT_FIXED_PAD 0x01605#define FE_RECORD_FMT_FIXED 0x02606#define FE_RECORD_FMT_VARIABLE8 0x03607#define FE_RECORD_FMT_VARIABLE16 0x04608#define FE_RECORD_FMT_VARIABLE16_MSB 0x05609#define FE_RECORD_FMT_VARIABLE32 0x06610#define FE_RECORD_FMT_PRINT 0x07611#define FE_RECORD_FMT_LF 0x08612#define FE_RECORD_FMT_CR 0x09613#define FE_RECORD_FMT_CRLF 0x0A614#define FE_RECORD_FMT_LFCR 0x0B615 616/* Record Display Attributes (ECMA 167r3 4/14.9.8) */617#define FE_RECORD_DISPLAY_ATTR_UNDEF 0x00618#define FE_RECORD_DISPLAY_ATTR_1 0x01619#define FE_RECORD_DISPLAY_ATTR_2 0x02620#define FE_RECORD_DISPLAY_ATTR_3 0x03621 622/* Extended Attribute Header Descriptor (ECMA 167r3 4/14.10.1) */623struct extendedAttrHeaderDesc {624 struct tag descTag;625 __le32 impAttrLocation;626 __le32 appAttrLocation;627} __packed;628 629/* Generic Format (ECMA 167r3 4/14.10.2) */630struct genericFormat {631 __le32 attrType;632 uint8_t attrSubtype;633 uint8_t reserved[3];634 __le32 attrLength;635 uint8_t attrData[];636} __packed;637 638/* Character Set Information (ECMA 167r3 4/14.10.3) */639struct charSetInfo {640 __le32 attrType;641 uint8_t attrSubtype;642 uint8_t reserved[3];643 __le32 attrLength;644 __le32 escapeSeqLength;645 uint8_t charSetType;646 uint8_t escapeSeq[];647} __packed;648 649/* Alternate Permissions (ECMA 167r3 4/14.10.4) */650struct altPerms {651 __le32 attrType;652 uint8_t attrSubtype;653 uint8_t reserved[3];654 __le32 attrLength;655 __le16 ownerIdent;656 __le16 groupIdent;657 __le16 permission;658} __packed;659 660/* File Times Extended Attribute (ECMA 167r3 4/14.10.5) */661struct fileTimesExtAttr {662 __le32 attrType;663 uint8_t attrSubtype;664 uint8_t reserved[3];665 __le32 attrLength;666 __le32 dataLength;667 __le32 fileTimeExistence;668 uint8_t fileTimes;669} __packed;670 671/* FileTimeExistence (ECMA 167r3 4/14.10.5.6) */672#define FTE_CREATION 0x00000001673#define FTE_DELETION 0x00000004674#define FTE_EFFECTIVE 0x00000008675#define FTE_BACKUP 0x00000002676 677/* Information Times Extended Attribute (ECMA 167r3 4/14.10.6) */678struct infoTimesExtAttr {679 __le32 attrType;680 uint8_t attrSubtype;681 uint8_t reserved[3];682 __le32 attrLength;683 __le32 dataLength;684 __le32 infoTimeExistence;685 uint8_t infoTimes[];686} __packed;687 688/* Device Specification (ECMA 167r3 4/14.10.7) */689struct deviceSpec {690 __le32 attrType;691 uint8_t attrSubtype;692 uint8_t reserved[3];693 __le32 attrLength;694 __le32 impUseLength;695 __le32 majorDeviceIdent;696 __le32 minorDeviceIdent;697 uint8_t impUse[];698} __packed;699 700/* Implementation Use Extended Attr (ECMA 167r3 4/14.10.8) */701struct impUseExtAttr {702 __le32 attrType;703 uint8_t attrSubtype;704 uint8_t reserved[3];705 __le32 attrLength;706 __le32 impUseLength;707 struct regid impIdent;708 uint8_t impUse[];709} __packed;710 711/* Application Use Extended Attribute (ECMA 167r3 4/14.10.9) */712struct appUseExtAttr {713 __le32 attrType;714 uint8_t attrSubtype;715 uint8_t reserved[3];716 __le32 attrLength;717 __le32 appUseLength;718 struct regid appIdent;719 uint8_t appUse[];720} __packed;721 722#define EXTATTR_CHAR_SET 1723#define EXTATTR_ALT_PERMS 3724#define EXTATTR_FILE_TIMES 5725#define EXTATTR_INFO_TIMES 6726#define EXTATTR_DEV_SPEC 12727#define EXTATTR_IMP_USE 2048728#define EXTATTR_APP_USE 65536729#define EXTATTR_SUBTYPE 1730 731/* Unallocated Space Entry (ECMA 167r3 4/14.11) */732struct unallocSpaceEntry {733 struct tag descTag;734 struct icbtag icbTag;735 __le32 lengthAllocDescs;736 uint8_t allocDescs[];737} __packed;738 739/* Space Bitmap Descriptor (ECMA 167r3 4/14.12) */740struct spaceBitmapDesc {741 struct tag descTag;742 __le32 numOfBits;743 __le32 numOfBytes;744 uint8_t bitmap[];745} __packed;746 747/* Partition Integrity Entry (ECMA 167r3 4/14.13) */748struct partitionIntegrityEntry {749 struct tag descTag;750 struct icbtag icbTag;751 struct timestamp recordingDateAndTime;752 uint8_t integrityType;753 uint8_t reserved[175];754 struct regid impIdent;755 uint8_t impUse[256];756} __packed;757 758/* Short Allocation Descriptor (ECMA 167r3 4/14.14.1) */759 760/* Extent Length (ECMA 167r3 4/14.14.1.1) */761#define EXT_LENGTH_MASK 0x3FFFFFFF762#define EXT_TYPE_MASK 0xC0000000763#define EXT_RECORDED_ALLOCATED 0x00000000764#define EXT_NOT_RECORDED_ALLOCATED 0x40000000765#define EXT_NOT_RECORDED_NOT_ALLOCATED 0x80000000766#define EXT_NEXT_EXTENT_ALLOCDESCS 0xC0000000767 768/* Long Allocation Descriptor (ECMA 167r3 4/14.14.2) */769 770/* Extended Allocation Descriptor (ECMA 167r3 4/14.14.3) */771 772/* Logical Volume Header Descriptor (ECMA 167r3 4/14.15) */773struct logicalVolHeaderDesc {774 __le64 uniqueID;775 uint8_t reserved[24];776} __packed;777 778/* Path Component (ECMA 167r3 4/14.16.1) */779struct pathComponent {780 uint8_t componentType;781 uint8_t lengthComponentIdent;782 __le16 componentFileVersionNum;783 dchars componentIdent[];784} __packed;785 786/* File Entry (ECMA 167r3 4/14.17) */787struct extendedFileEntry {788 struct tag descTag;789 struct icbtag icbTag;790 __le32 uid;791 __le32 gid;792 __le32 permissions;793 __le16 fileLinkCount;794 uint8_t recordFormat;795 uint8_t recordDisplayAttr;796 __le32 recordLength;797 __le64 informationLength;798 __le64 objectSize;799 __le64 logicalBlocksRecorded;800 struct timestamp accessTime;801 struct timestamp modificationTime;802 struct timestamp createTime;803 struct timestamp attrTime;804 __le32 checkpoint;805 __le32 reserved;806 struct long_ad extendedAttrICB;807 struct long_ad streamDirectoryICB;808 struct regid impIdent;809 __le64 uniqueID;810 __le32 lengthExtendedAttr;811 __le32 lengthAllocDescs;812 uint8_t extendedAttr[];813 /* uint8_t allocDescs[]; */814} __packed;815 816#endif /* _ECMA_167_H */817