www.pudn.com > cdrecord.zip > iso9660.h


/* @(#)iso9660.h	1.2 97/03/04 Copyright 1996 J. Schilling */
/*
 *	Copyright (c) 1996 J. Schilling
 */
/*
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; see the file COPYING.  If not, write to
 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#define	_delta(from, to)	((to) - (from) + 1)

#define	VD_BOOT		0
#define	VD_PRIMARY	1
#define	VD_SUPPLEMENT	2
#define	VD_PARTITION	3
#define	VD_TERM		255

#define	VD_ID		"CD001"

struct	iso9660_voldesc {
	char	vd_type		[_delta(1, 1)];
	char	vd_id		[_delta(2, 6)];
	char	vd_version	[_delta(7, 7)];
	char	vd_fill		[_delta(8, 2048)];
};

struct	iso9660_boot_voldesc {
	char	vd_type		[_delta(1, 1)];
	char	vd_id		[_delta(2, 6)];
	char	vd_version	[_delta(7, 7)];
	char	vd_bootsys	[_delta(8, 39)];
	char	vd_bootid	[_delta(40, 71)];
	char	vd_bootcode	[_delta(72, 2048)];
};

struct	iso9660_pr_voldesc {
	char	vd_type			[_delta(   1,	1)];
	char	vd_id			[_delta(   2,	6)];
	char	vd_version		[_delta(   7,	7)];
	char	vd_unused1		[_delta(   8,	8)];
	char	vd_system_id		[_delta(   9,	40)];
	char	vd_volume_id		[_delta(  41,	72)];
	char	vd_unused2		[_delta(  73,	80)];
	char	vd_volume_space_size	[_delta(  81,	88)];
	char	vd_unused3		[_delta(  89,	120)];
	char	vd_volume_set_size	[_delta( 121,	124)];
	char	vd_volume_seq_number	[_delta( 125,	128)];
	char	vd_lbsize		[_delta( 129,	132)];
	char	vd_path_table_size	[_delta( 133,	140)];
	char	vd_pos_path_table_l	[_delta( 141,	144)];
	char	vd_opt_pos_path_table_l	[_delta( 145,	148)];
	char	vd_pos_path_table_m	[_delta( 149,	152)];
	char	vd_opt_pos_path_table_m	[_delta( 153,	156)];
	char	vd_root_dir		[_delta( 157,	190)];
	char	vd_volume_set_id	[_delta( 191,	318)];
	char	vd_publisher_id		[_delta( 319,	446)];
	char	vd_data_preparer_id	[_delta( 447,	574)];
	char	vd_application_id	[_delta( 575,	702)];
	char	vd_copyr_file_id	[_delta( 703,	739)];
	char	vd_abstr_file_id	[_delta( 740,	776)];
	char	vd_bibl_file_id		[_delta( 777,	813)];
	char	vd_create_time		[_delta( 814,	830)];
	char	vd_mod_time		[_delta( 831,	847)];
	char	vd_expiry_time		[_delta( 848,	864)];
	char	vd_effective_time	[_delta( 865,	881)];
	char	vd_file_struct_vers	[_delta( 882,	882)];
	char	vd_reserved1		[_delta( 883,	883)];
	char	vd_application_use	[_delta( 884,	1395)];
	char	vd_fill			[_delta(1396,	2048)];
};

struct	iso9660_dir {
	char	dr_len			[_delta(   1,	1)];
	char	dr_eattr_len		[_delta(   2,	2)];
	char	dr_eattr_pos		[_delta(   3,	10)];
	char	dr_data_len		[_delta(  11,	18)];
	char	dr_recording_time	[_delta(  19,	25)];
	char	dr_file_flags		[_delta(  26,	26)];
	char	dr_file_unit_size	[_delta(  27,	27)];
	char	dr_interleave_gap	[_delta(  28,	28)];
	char	dr_volume_seq_number	[_delta(  29,	32)];
	char	dr_file_name_len	[_delta(  33,	33)];
	char	dr_file_name		[_delta(  34,	34)];
};

struct	iso9660_dtime {
	unsigned char	dt_year;
	unsigned char	dt_month;
	unsigned char	dt_day;
	unsigned char	dt_hour;
	unsigned char	dt_minute;
	unsigned char	dt_second;
		 char	dt_gmtoff;
};

struct	iso9660_ltime {
	char	lt_year			[_delta(   1,	4)];
	char	lt_month		[_delta(   5,	6)];
	char	lt_day			[_delta(   7,	8)];
	char	lt_hour			[_delta(   9,	10)];
	char	lt_minute		[_delta(  11,	12)];
	char	lt_second		[_delta(  13,	14)];
	char	lt_hsecond		[_delta(  15,	16)];
	char	lt_gmtoff		[_delta(  17,	17)];
};

struct iso9660_path_table {
	char	pt_di_len		[_delta(   1,	1)];
	char	pt_eattr_len		[_delta(   2,	2)];
	char	pt_eattr_pos		[_delta(   3,	6)];
	char	pt_di_parent		[_delta(   7,	8)];
	char	pt_name			[_delta(   9,	9)];
};

struct iso9660_eattr {
	char	ea_owner		[_delta(   1,	4)];
	char	ea_group		[_delta(   5,	8)];
	char	ea_perm			[_delta(   9,	10)];
	char	ea_ctime		[_delta(  11,	27)];
	char	ea_mtime		[_delta(  28,	44)];
	char	ea_extime		[_delta(  45,	61)];
	char	ea_eftime		[_delta(  62,	78)];
	char	ea_record_format	[_delta(  79,	79)];
	char	ea_record_attr		[_delta(  80,	80)];
	char	ea_record_len		[_delta(  81,	84)];
	char	ea_system_id		[_delta(  85,	116)];
	char	ea_system_use		[_delta( 117,	180)];
	char	ea_version		[_delta( 181,	181)];
	char	ea_esc_seq_len		[_delta( 182,	182)];
	char	ea_reserved1		[_delta( 183,	246)];
	char	ea_appl_use_len		[_delta( 247,	250)];
	char	ea_appl_use		[_delta( 251,	251)];	/* actually more */
/*	char	ea_esc_seq		[_delta( xxx,	xxx)];	*/

};

#define	PERM_MB_ONE	0xAAAA

#define	PERM_RSYS	0x0001
#define	PERM_XSYS	0x0004

#define	PERM_RUSR	0x0010
#define	PERM_XUSR	0x0040

#define	PERM_RGRP	0x0100
#define	PERM_XGRP	0x0400

#define	PERM_ROTH	0x1000
#define	PERM_XOTH	0x4000


#define	i_to_long(a, i)		(((u_char *)(a))[0] = ((i) >> 24)& 0xFF,\
				 ((u_char *)(a))[1] = ((i) >> 16)& 0xFF,\
				 ((u_char *)(a))[2] = ((i) >> 8) & 0xFF,\
				 ((u_char *)(a))[3] = (i) & 0xFF)

#define	i_to_3_byte(a, i)	(((u_char *)(a))[0] = ((i) >> 16)& 0xFF,\
				 ((u_char *)(a))[1] = ((i) >> 8) & 0xFF,\
				 ((u_char *)(a))[2] = (i) & 0xFF)

#define	i_to_short(a, i)	(((u_char *)(a))[0] = ((i) >> 8) & 0xFF,\
				 ((u_char *)(a))[1] = (i) & 0xFF)


#define	a_to_c(a)	(((char*) a)[0])


#define	a_to_u_c(a)	((unsigned char) \
			(((unsigned char*) a)[0]       & 0xFF))


#define	a_to_u_short(a)	((unsigned short) \
			((((unsigned char*) a)[1]       & 0xFF) | \
			 (((unsigned char*) a)[0] << 8  & 0xFF00)))

#define	a_to_3_byte(a)	((unsigned long) \
			((((unsigned char*) a)[2]       & 0xFF) | \
			 (((unsigned char*) a)[1] << 8  & 0xFF00) | \
			 (((unsigned char*) a)[0] << 16 & 0xFF0000)))

#ifdef	__STDC__
#	define	__TOP_BYTE	0xFF000000UL
#else
#	define	__TOP_BYTE	0xFF000000
#endif

#define	a_to_u_long(a)	((unsigned long) \
			((((unsigned char*) a)[3]       & 0xFF) | \
			 (((unsigned char*) a)[2] << 8  & 0xFF00) | \
			 (((unsigned char*) a)[1] << 16 & 0xFF0000) | \
			 (((unsigned char*) a)[0] << 24 & __TOP_BYTE)))

#define	la_to_u_long(a)	((unsigned long) \
			((((unsigned char*) a)[0]       & 0xFF) | \
			 (((unsigned char*) a)[1] << 8  & 0xFF00) | \
			 (((unsigned char*) a)[2] << 16 & 0xFF0000) | \
			 (((unsigned char*) a)[3] << 24 & __TOP_BYTE)))


#define	GET_UBYTE(a)	a_to_u_c(a)
#define	GET_SBYTE(a)	a_to_c(a)
#define	GET_SHORT(a)	a_to_u_short(&((unsigned char *) (a))[0])
#define	GET_BSHORT(a)	a_to_u_short(&((unsigned char *) (a))[2])
#define	GET_INT(a)	a_to_u_long(&((unsigned char *) (a))[0])
#define	GET_LINT(a)	la_to_u_long(&((unsigned char *) (a))[0])
#define	GET_BINT(a)	a_to_u_long(&((unsigned char *) (a))[4])