/* @(#)mkisofs.h 1.153 20/03/24 joerg */ /* * Header file mkisofs.h - assorted structure definitions and typecasts. * * Written by Eric Youngdale (1993). * * Copyright 1993 Yggdrasil Computing, Incorporated * Copyright (c) 1999,2000-2020 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; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* APPLE_HYB James Pearson j.pearson@ge.ucl.ac.uk 23/2/2000 */ /* DUPLICATES_ONCE Alex Kopylov cdrtools@bootcd.ru 19.06.2004 */ #include /* Must be before stdio.h for LARGEFILE support */ #include #include #include #include #include #include /* Needed for for LARGEFILE support */ #include #include #include #include #include #include #include /* Define missing prototypes */ #include "scsi.h" #ifdef DVD_AUD_VID #ifndef UDF #define UDF #endif #endif #ifdef USE_LARGEFILES /* * XXX Hack until fseeko()/ftello() are available everywhere or until * XXX we know a secure way to let autoconf ckeck for fseeko()/ftello() * XXX without defining FILE_OFFSETBITS to 64 in confdefs.h */ # define fseek fseeko # define ftell ftello #endif #ifndef HAVE_LSTAT #ifndef VMS #define lstat stat #endif #endif #include "iso9660.h" #include "defaults.h" #include extern siconvt_t *in_nls; /* input UNICODE conversion table */ extern siconvt_t *out_nls; /* output UNICODE conversion table */ extern siconvt_t *hfs_inls; /* input HFS UNICODE conversion table */ extern siconvt_t *hfs_onls; /* output HFS UNICODE conversion table */ /* * Structure used to pass arguments via trewalk() to walkfun(). */ struct wargs { void *dir; /* Pointer to struct directory *root */ char *name; /* NULL or alternative short name */ }; #ifdef APPLE_HYB #include "mactypes.h" #include "hfs.h" struct hfs_info { unsigned char finderinfo[32]; char name[HFS_MAX_FLEN + 1]; /* should have fields for dates here as well */ char *keyname; struct hfs_info *next; }; #endif /* APPLE_HYB */ /* * Our version of "struct timespec". * Currently only used with UDF. */ typedef struct timesp { time_t tv_sec; Int32_t tv_nsec; } timesp; struct directory_entry { struct directory_entry *next; struct directory_entry *jnext; struct iso_directory_record isorec; unsigned int starting_block; off_t size; int mxpart; /* Extent number */ unsigned short priority; unsigned char jreclen; /* Joliet record len */ char *name; char *table; char *whole_name; struct directory *filedir; struct directory_entry *parent_rec; struct directory_entry *mxroot; /* Pointer to orig entry */ unsigned int de_flags; #ifdef UDF mode_t mode; /* used for udf */ dev_t rdev; /* used for udf devices */ uid_t uid; /* used for udf */ gid_t gid; /* used for udf */ timesp atime; /* timespec for atime */ timesp mtime; /* timespec for mtime */ timesp ctime; /* timespec for ctime */ #endif ino_t inode; /* Used in the hash table */ dev_t dev; /* Used in the hash table */ unsigned char *rr_attributes; unsigned int rr_attr_size; unsigned int total_rr_attr_size; unsigned int got_rr_name; #ifdef APPLE_HYB struct directory_entry *assoc; /* entry has a resource fork */ hfsdirent *hfs_ent; /* HFS parameters */ off_t hfs_off; /* offset to real start of fork */ int hfs_type; /* type of HFS Unix file */ #endif /* APPLE_HYB */ #ifdef SORTING int sort; /* sort weight for entry */ #endif /* SORTING */ #ifdef UDF int udf_file_entry_sector; /* also used as UDF unique ID */ #endif #ifdef DUPLICATES_ONCE unsigned char *digest_fast; unsigned char *digest_full; #endif }; struct file_hash { struct file_hash *next; ino_t inode; /* Used in the hash table */ dev_t dev; /* Used in the hash table */ nlink_t nlink; /* Used to compute new link count */ unsigned int starting_block; off_t size; #if defined(SORTING) || defined(DUPLICATES_ONCE) struct directory_entry *de; #endif /* SORTING */ }; /* * This structure is used to control the output of fragments to the cdrom * image. Everything that will be written to the output image will eventually * go through this structure. There are two pieces - first is the sizing where * we establish extent numbers for everything, and the second is when we actually * generate the contents and write it to the output image. * * This makes it trivial to extend mkisofs to write special things in the image. * All you need to do is hook an additional structure in the list, and the rest * works like magic. * * The three passes each do the following: * * The 'size' pass determines the size of each component and assigns the extent number * for that component. * * The 'generate' pass will adjust the contents and pointers as required now that extent * numbers are assigned. In some cases, the contents of the record are also generated. * * The 'write' pass actually writes the data to the disc. */ struct output_fragment { struct output_fragment *of_next; int (*of_size) __PR((UInt32_t)); int (*of_generate) __PR((void)); int (*of_write) __PR((FILE *)); char *of_name; /* Textual description */ unsigned int of_start_extent; /* For consist check */ }; extern struct output_fragment *out_list; extern struct output_fragment *out_tail; extern struct output_fragment startpad_desc; extern struct output_fragment voldesc_desc; extern struct output_fragment xvoldesc_desc; extern struct output_fragment joliet_desc; extern struct output_fragment torito_desc; extern struct output_fragment end_vol; extern struct output_fragment version_desc; extern struct output_fragment pathtable_desc; extern struct output_fragment jpathtable_desc; extern struct output_fragment dirtree_desc; extern struct output_fragment dirtree_clean; extern struct output_fragment jdirtree_desc; extern struct output_fragment extension_desc; extern struct output_fragment files_desc; extern struct output_fragment interpad_desc; extern struct output_fragment endpad_desc; extern struct output_fragment sunboot_desc; extern struct output_fragment sunlabel_desc; extern struct output_fragment genboot_desc; extern struct output_fragment strfile_desc; extern struct output_fragment strdir_desc; extern struct output_fragment strpath_desc; #ifdef APPLE_HYB extern struct output_fragment hfs_desc; #endif /* APPLE_HYB */ #ifdef DVD_AUD_VID /* * This structure holds the information necessary to create a valid * DVD-Video image. Basically it's how much to pad the files so the * file offsets described in the video_ts.ifo and vts_xx_0.ifo are * the correct one in the image that we create. */ typedef struct { int realsize_ifo; int realsize_menu; int realsize_bup; int size_ifo; int size_menu; int size_title; int size_bup; int pad_ifo; int pad_menu; int pad_title; int pad_bup; int number_of_vob_files; int realsize_vob[10]; } title_set_t; typedef struct { int num_titles; title_set_t *title_set; } title_set_info_t; #endif /* DVD_AUD_VID */ /* * This structure describes one complete directory. It has pointers * to other directories in the overall tree so that it is clear where * this directory lives in the tree, and it also must contain pointers * to the contents of the directory. Note that subdirectories of this * directory exist twice in this stucture. Once in the subdir chain, * and again in the contents chain. */ struct directory { struct directory *next; /* Next directory at same level as this one */ struct directory *subdir; /* First subdirectory in this directory */ struct directory *parent; struct directory_entry *contents; struct directory_entry *jcontents; struct directory_entry *self; char *whole_name; /* Entire source path */ char *de_path; /* Entire path iside ISO-9660 */ char *de_name; /* Last path name component */ unsigned int ce_bytes; /* Number of bytes of CE entries read */ /* for this dir */ unsigned int depth; unsigned int size; unsigned int extent; unsigned int jsize; unsigned int jextent; unsigned int path_index; unsigned int jpath_index; unsigned short dir_flags; unsigned short dir_nlink; #ifdef APPLE_HYB hfsdirent *hfs_ent; /* HFS parameters */ struct hfs_info *hfs_info; /* list of info for all entries in dir */ #endif /* APPLE_HYB */ #ifdef SORTING int sort; /* sort weight for child files */ #endif /* SORTING */ }; struct deferred_write { struct deferred_write *next; char *table; unsigned int extent; off_t size; char *name; struct directory_entry *s_entry; unsigned int pad; off_t off; unsigned int dw_flags; #ifdef APPLE_HYB int hfstype; #endif }; struct eltorito_boot_entry_info { struct eltorito_boot_entry_info *next; char *boot_image; int not_bootable; int no_emul_boot; int hard_disk_boot; int boot_info_table; int load_size; int load_addr; #define ELTORITO_BOOT_ID 1 #define ELTORITO_SECTION_HEADER 2 int type; /* * Valid if (type & ELTORITO_BOOT_ID) != 0 */ int boot_platform; }; typedef struct ldate { time_t l_sec; int l_usec; int l_gmtoff; } ldate; extern int goof; extern struct directory *root; extern struct directory *reloc_dir; extern UInt32_t next_extent; extern UInt32_t last_extent; extern UInt32_t last_extent_written; extern UInt32_t session_start; extern unsigned int path_table_size; extern unsigned int path_table[4]; extern unsigned int path_blocks; extern char *path_table_l; extern char *path_table_m; extern unsigned int jpath_table_size; extern unsigned int jpath_table[4]; extern unsigned int jpath_blocks; extern char *jpath_table_l; extern char *jpath_table_m; extern struct iso_directory_record root_record; extern struct iso_directory_record jroot_record; extern int check_oldnames; extern int check_session; extern int use_eltorito; extern int hard_disk_boot; extern int not_bootable; extern int no_emul_boot; extern int load_addr; extern int load_size; extern int boot_info_table; extern int use_RockRidge; extern int osecsize; extern int use_XA; extern int use_Joliet; extern int rationalize; extern int rationalize_uid; extern int rationalize_gid; extern int rationalize_filemode; extern int rationalize_dirmode; extern uid_t uid_to_use; extern gid_t gid_to_use; extern int filemode_to_use; extern int dirmode_to_use; extern int new_dir_mode; extern int follow_links; extern int cache_inodes; #ifdef DUPLICATES_ONCE extern int duplicates_once; #endif extern int verbose; extern int debug; extern int gui; extern int all_files; extern int generate_tables; extern int print_size; extern int split_output; extern int use_graft_ptrs; extern int jhide_trans_tbl; extern int hide_rr_moved; extern int omit_period; extern int omit_version_number; extern int no_rr; extern int transparent_compression; extern Uint RR_relocation_depth; extern int do_largefiles; extern off_t maxnonlarge; extern int iso9660_level; extern int iso9660_namelen; extern int full_iso9660_filenames; extern int nolimitpathtables; extern int relaxed_filenames; extern int allow_lowercase; extern int allow_multidot; extern int iso_translate; extern int allow_leading_dots; extern int use_fileversion; extern int split_SL_component; extern int split_SL_field; extern char *trans_tbl; #define JMAX 64 /* maximum Joliet file name length (spec) */ #define JLONGMAX 103 /* out of spec Joliet file name length */ extern int jlen; /* selected maximum Joliet file name length */ #ifdef DVD_AUD_VID #define DVD_SPEC_NONE 0x0 #define DVD_SPEC_VIDEO 0x1 #define DVD_SPEC_AUDIO 0x2 #define DVD_SPEC_HYBRD (DVD_SPEC_VIDEO | DVD_SPEC_AUDIO) extern int dvd_audio; extern int dvd_hybrid; extern int dvd_video; extern int dvd_aud_vid_flag; #endif /* DVD_AUD_VID */ extern int donotwrite_macpart; #ifdef APPLE_HYB extern int apple_hyb; /* create HFS hybrid */ extern int apple_ext; /* use Apple extensions */ extern int apple_both; /* common flag (for above) */ extern int hfs_extra; /* extra ISO extents (hfs_ce_size) */ extern hce_mem *hce; /* libhfs/mkisofs extras */ extern int use_mac_name; /* use Mac name for ISO9660/Joliet/RR */ extern int create_dt; /* create the Desktp files */ extern char *hfs_boot_file; /* name of HFS boot file */ extern char *magic_file; /* magic file for CREATOR/TYPE matching */ extern int hfs_last; /* order in which to process map/magic files */ extern char *deftype; /* default Apple TYPE */ extern char *defcreator; /* default Apple CREATOR */ extern int gen_pt; /* generate HFS partition table */ extern char *autoname; /* Autostart filename */ extern int afe_size; /* Apple File Exchange block size */ extern char *hfs_volume_id; /* HFS volume ID */ extern int icon_pos; /* Keep Icon position */ extern int hfs_lock; /* lock HFS volume (read-only) */ extern char *hfs_bless; /* name of folder to 'bless' (System Folder) */ extern char *hfs_parms; /* low level HFS parameters */ #define MAP_LAST 1 /* process magic then map file */ #define MAG_LAST 2 /* process map then magic file */ #ifndef PREP_BOOT #define PREP_BOOT #endif /* PREP_BOOT */ #ifdef PREP_BOOT extern char *prep_boot_image[4]; extern int use_prep_boot; extern int use_chrp_boot; #endif /* PREP_BOOT */ #endif /* APPLE_HYB */ #ifdef SORTING extern int do_sort; #endif /* SORTING */ /* tree.c */ extern int stat_filter __PR((char *, struct stat *)); extern int lstat_filter __PR((char *, struct stat *)); extern int sort_tree __PR((struct directory *)); extern void attach_dot_entries __PR((struct directory * dirnode, struct stat * this_stat, struct stat * parent_stat)); extern struct directory * find_or_create_directory __PR((struct directory *, char *, struct directory_entry * self, int)); extern void finish_cl_pl_entries __PR((void)); extern int scan_directory_tree __PR((struct directory * this_dir, char *path, struct directory_entry * self)); extern int insert_file_entry __PR((struct directory *, char *, char *, struct stat *, int)); extern struct directory_entry * dup_directory_entry __PR((struct directory_entry *s_entry)); extern void generate_iso9660_directories __PR((struct directory *, FILE *)); extern void dump_tree __PR((struct directory * node)); extern struct directory_entry *search_tree_file __PR((struct directory * node, char *filename)); extern void init_fstatbuf __PR((void)); extern struct stat root_statbuf; extern struct stat fstatbuf; /* eltorito.c */ extern void init_boot_catalog __PR((const char *path)); extern void insert_boot_cat __PR((void)); extern void get_boot_entry __PR((void)); extern int new_boot_entry __PR((void)); extern void ex_boot_enoent __PR((char *msg, char *pname)); /* boot.c */ extern int sparc_boot_label __PR((char *label)); extern int sunx86_boot_label __PR((char *label)); extern int scan_sparc_boot __PR((char *files)); extern int scan_sunx86_boot __PR((char *files)); extern int make_sun_label __PR((void)); extern int make_sunx86_label __PR((void)); /* isonum.c */ extern void set_721 __PR((void *, UInt32_t)); extern void set_722 __PR((void *, UInt32_t)); extern void set_723 __PR((void *, UInt32_t)); extern void set_731 __PR((void *, UInt32_t)); extern void set_732 __PR((void *, UInt32_t)); extern void set_733 __PR((void *, UInt32_t)); extern UInt32_t get_711 __PR((void *)); extern UInt32_t get_721 __PR((void *)); extern UInt32_t get_723 __PR((void *)); extern UInt32_t get_731 __PR((void *)); extern UInt32_t get_732 __PR((void *)); extern UInt32_t get_733 __PR((void *)); /* write.c */ extern int sort_directory __PR((struct directory_entry **, int)); extern void generate_one_directory __PR((struct directory *, FILE *)); extern void memcpy_max __PR((char *, char *, int)); extern int oneblock_size __PR((UInt32_t starting_extent)); extern struct iso_primary_descriptor vol_desc; extern void xfwrite __PR((void *buffer, int size, int count, FILE * file, int submode, BOOL islast)); extern void outputlist_insert __PR((struct output_fragment * frag)); #ifdef APPLE_HYB extern Ulong get_adj_size __PR((int Csize)); extern int adj_size __PR((int Csize, UInt32_t start_extent, int extra)); extern void adj_size_other __PR((struct directory * dpnt)); extern int insert_padding_file __PR((int size)); extern int gen_mac_label __PR((struct deferred_write *)); #ifdef PREP_BOOT extern void gen_prepboot_label __PR((unsigned char *)); #endif /* PREP_BOOT */ #endif /* APPLE_HYB */ /* multi.c */ extern FILE *in_image; extern BOOL ignerr; extern int open_merge_image __PR((char *path)); extern int close_merge_image __PR((void)); extern struct iso_directory_record * merge_isofs __PR((char *path)); extern unsigned char *parse_xa __PR((unsigned char *pnt, int *lenp, struct directory_entry * dpnt)); extern int rr_flags __PR((struct iso_directory_record *idr)); extern int merge_previous_session __PR((struct directory *, struct iso_directory_record *, char *, char *)); extern int get_session_start __PR((int *)); /* joliet.c */ #ifdef UDF extern void convert_to_unicode __PR((unsigned char *buffer, int size, char *source, siconvt_t *inls)); extern int joliet_strlen __PR((const char *string, size_t maxlen, siconvt_t *inls)); #endif extern void conv_charset __PR((unsigned char *to, size_t *tosizep, unsigned char *from, size_t *fromsizep, siconvt_t *, siconvt_t *)); extern int joliet_sort_tree __PR((struct directory * node)); /* match.c */ extern int matches __PR((char *)); extern int add_match __PR((char *)); /* files.c */ struct dirent *readdir_add_files __PR((char **, char *, DIR *)); /* name.c */ extern void iso9660_check __PR((struct iso_directory_record *idr, struct directory_entry *ndr)); extern int iso9660_file_length __PR((const char *name, struct directory_entry * sresult, int flag)); /* various */ extern int iso9660_date __PR((char *, time_t)); extern int iso9660_ldate __PR((char *, time_t, int, int)); extern void add_hash __PR((struct directory_entry *)); extern struct file_hash *find_hash __PR((struct directory_entry *spnt)); extern void flush_hash __PR((void)); extern void add_directory_hash __PR((dev_t, ino_t)); extern struct file_hash *find_directory_hash __PR((dev_t, ino_t)); extern void flush_file_hash __PR((void)); extern int delete_file_hash __PR((struct directory_entry *)); extern struct directory_entry *find_file_hash __PR((char *)); extern void add_file_hash __PR((struct directory_entry *)); extern int generate_xa_rr_attributes __PR((char *, char *, struct directory_entry *, struct stat *, struct stat *, int deep_flag)); extern char *generate_rr_extension_record __PR((char *id, char *descriptor, char *source, int *size)); extern int check_prev_session __PR((struct directory_entry **, int len, struct directory_entry *, struct stat *, struct stat *, struct directory_entry **)); extern void match_cl_re_entries __PR((void)); extern void finish_cl_pl_for_prev_session __PR((void)); extern char *find_rr_attribute __PR((unsigned char *pnt, int len, char *attr_type)); extern void udf_set_extattr_macresfork __PR((unsigned char *buf, off_t size, unsigned rba)); extern void udf_set_extattr_freespace __PR((unsigned char *buf, off_t size, unsigned rba)); extern int udf_get_symlinkcontents __PR((char *, char *, off_t *)); /* inode.c */ extern void do_inode __PR((struct directory *dpnt)); extern void do_dir_nlink __PR((struct directory *dpnt)); #ifdef APPLE_HYB /* volume.c */ extern int make_mac_volume __PR((struct directory * dpnt, UInt32_t start_extent)); extern int write_fork __PR((hfsfile * hfp, long tot)); /* apple.c */ extern void del_hfs_info __PR((struct hfs_info *)); extern int get_hfs_dir __PR((char *, char *, struct directory_entry *)); extern int get_hfs_info __PR((char *, char *, struct directory_entry *)); extern int get_hfs_rname __PR((char *, char *, char *)); extern int hfs_exclude __PR((char *)); extern void print_hfs_info __PR((struct directory_entry *)); extern void hfs_init __PR((char *, unsigned short, unsigned int)); extern void delete_rsrc_ent __PR((struct directory_entry *)); extern void clean_hfs __PR((void)); extern void perr __PR((char *)); extern void set_root_info __PR((char *)); extern int file_is_resource __PR((char *fname, int hfstype)); extern int hfs_excludepath __PR((char *)); /* desktop.c */ extern int make_desktop __PR((hfsvol *, int)); /* mac_label.c */ #ifdef _MAC_LABEL_H #ifdef PREP_BOOT extern void gen_prepboot_label __PR((MacLabel * mac_label)); #endif extern int gen_mac_label __PR((defer *)); #endif extern int autostart __PR((void)); /* libfile */ extern char *get_magic_match __PR((const char *)); extern void clean_magic __PR((void)); #endif /* APPLE_HYB */ #ifdef USE_FIND /* * The callback function for treewalk() from walk.c */ #ifdef _SCHILY_WALK_H EXPORT int walkfunc __PR((char *nm, struct stat *fs, int type, struct WALK *state)); #endif #endif extern char *extension_record; extern UInt32_t extension_record_extent; /*extern int n_data_extents;*/ extern BOOL archive_isreg; extern dev_t archive_dev; extern ino_t archive_ino; /* * These are a few goodies that can be specified on the command line, and are * filled into the root record */ extern char *preparer; extern char *publisher; extern char *copyright; extern char *biblio; extern char *abstract; extern char *appid; extern char *volset_id; extern char *system_id; extern char *volume_id; extern char *boot_catalog; extern char *boot_image; extern char *genboot_image; extern int ucs_level; extern int volume_set_size; extern int volume_sequence_number; extern struct eltorito_boot_entry_info *first_boot_entry; extern struct eltorito_boot_entry_info *last_boot_entry; extern struct eltorito_boot_entry_info *current_boot_entry; extern UInt32_t null_inodes; extern BOOL correct_inodes; extern BOOL rrip112; extern BOOL long_rr_time; /* TRUE: use long (17 Byte) time format */ extern BOOL noatime; /* Whether not to include file access time */ extern char *findgequal __PR((char *)); extern void *e_malloc __PR((size_t)); extern char *e_strdup __PR((const char *)); /* * Note: always use these macros to avoid problems. * * ISO_ROUND_UP(X) may cause an integer overflow and thus give * incorrect results. So avoid it if possible. * * ISO_BLOCKS(X) is overflow safe. Prefer this when ever it is possible. */ #define SECTOR_SIZE (2048) #define ISO_ROUND_UP(X) (((X) + (SECTOR_SIZE - 1)) & ~(SECTOR_SIZE - 1)) #define ISO_BLOCKS(X) (((X) / SECTOR_SIZE) + (((X)%SECTOR_SIZE)?1:0)) #define ROUND_UP(X, Y) (((X + (Y - 1)) / Y) * Y) #ifdef APPLE_HYB /* * ISO blocks == 2048, HFS blocks == 512 */ #define HFS_BLK_CONV (SECTOR_SIZE/HFS_BLOCKSZ) #define HFS_ROUND_UP(X) ISO_ROUND_UP(((X)*HFS_BLOCKSZ)) /* XXX ??? */ #define HFS_BLOCKS(X) (ISO_BLOCKS(X) * HFS_BLK_CONV) #define USE_MAC_NAME(E) (use_mac_name && ((E)->hfs_ent != NULL) && (E)->hfs_type) #endif /* APPLE_HYB */ /* * Inode and device values for special purposes. */ #define PREV_SESS_DEV ((dev_t)-2) #define TABLE_INODE ((ino_t)-2) #define UNCACHED_INODE ((ino_t)-1) #define UNCACHED_DEVICE ((dev_t)-1) /* * The highest value used for the inodes we assign to files that do not have * a starting block address (zero length files, symlinks, dev nodes, pipes, * socket). * We need to make sure that these numbers are valid ISO-9660 block addresses, * this is why we use unsigned 32-bit integer values. * We need to make sure that the inode numbers assigned for zero sized files * is in a proper range, this is why we use numbers above the range of block * addresses we use in the image. We start counting backwards from 0xFFFFFFF0 * to leave enough space for special numbers from the range listed above. */ #define NULL_INO_MAX ((UInt32_t)0xFFFFFFF0) #ifdef VMS #define STAT_INODE(X) (X.st_ino[0]) #define PATH_SEPARATOR ']' #define SPATH_SEPARATOR "" #else #define STAT_INODE(X) (X.st_ino) #define PATH_SEPARATOR '/' #define SPATH_SEPARATOR "/" #endif /* * When using multi-session, indicates that we can reuse the * TRANS.TBL information for this directory entry. If this flag * is set for all entries in a directory, it means we can just * reuse the TRANS.TBL and not generate a new one. */ #define SAFE_TO_REUSE_TABLE_ENTRY 0x01 /* de_flags only */ #define DIR_HAS_DOT 0x02 /* dir_flags only */ #define DIR_HAS_DOTDOT 0x04 /* dir_flags only */ #define INHIBIT_JOLIET_ENTRY 0x08 #define INHIBIT_RR_ENTRY 0x10 /* not used */ #define RELOCATED_DIRECTORY 0x20 /* de_flags only */ #define INHIBIT_ISO9660_ENTRY 0x40 #define MEMORY_FILE 0x80 /* de_flags only */ #define HIDDEN_FILE 0x100 /* de_flags only */ #define DIR_WAS_SCANNED 0x200 /* dir_flags only */ #define RESOURCE_FORK 0x400 /* de_flags only */ #define IS_SYMLINK 0x800 /* de_flags only */ #define MULTI_EXTENT 0x1000 /* de_flags only */ #define INHIBIT_UDF_ENTRY 0x2000 /* * Volume sequence number to use in all of the iso directory records. */ #define DEF_VSN 1 /* * Make sure we have a definition for this. If not, take a very conservative * guess. * POSIX requires the max pathname component lenght to be defined in limits.h * If variable, it may be undefined. If undefined, there should be * a definition for _POSIX_NAME_MAX in limits.h or in unistd.h * As _POSIX_NAME_MAX is defined to 14, we cannot use it. * XXX Eric's wrong comment: * XXX From what I can tell SunOS is the only one with this trouble. */ #include #ifndef NAME_MAX #ifdef FILENAME_MAX #define NAME_MAX FILENAME_MAX #else #define NAME_MAX 256 #endif #endif #ifndef PATH_MAX #ifdef FILENAME_MAX #define PATH_MAX FILENAME_MAX #else #define PATH_MAX 1024 #endif #endif /* * Cygwin seems to have PATH_MAX == 260 which is less than the usable * path length. We raise PATH_MAX to at least 1024 for now for all platforms * unless someone reports problems with mkisofs memory size. */ #if PATH_MAX < 1024 #undef PATH_MAX #define PATH_MAX 1024 #endif /* * XXX JS: Some structures have odd lengths! * Some compilers (e.g. on Sun3/mc68020) padd the structures to even length. * For this reason, we cannot use sizeof (struct iso_path_table) or * sizeof (struct iso_directory_record) to compute on disk sizes. * Instead, we use offsetof(..., name) and add the name size. * See iso9660.h */ #ifndef offsetof #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) #endif #ifdef UDF extern int use_udf; #endif extern int create_udfsymlinks; #if !defined(HAVE_MEMSET) && !defined(memset) #define memset(s, c, n) fillbytes(s, n, c) #endif #if !defined(HAVE_MEMCHR) && !defined(memchr) #define memchr(s, c, n) findbytes(s, n, c) #endif #if !defined(HAVE_MEMCPY) && !defined(memcpy) #define memcpy(s1, s2, n) movebytes(s2, s1, n) #endif #if !defined(HAVE_MEMMOVE) && !defined(memmove) #define memmove(s1, s2, n) movebytes(s2, s1, n) #endif