1 /* @(#)mkisofs.h 1.152 16/12/13 joerg */ 2 /* 3 * Header file mkisofs.h - assorted structure definitions and typecasts. 4 * 5 * Written by Eric Youngdale (1993). 6 * 7 * Copyright 1993 Yggdrasil Computing, Incorporated 8 * Copyright (c) 1999,2000-2016 J. Schilling 9 * 10 * This program is free software; you can redistribute it and/or modify 11 * it under the terms of the GNU General Public License as published by 12 * the Free Software Foundation; either version 2, or (at your option) 13 * any later version. 14 * 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 * 20 * You should have received a copy of the GNU General Public License 21 * along with this program; if not, write to the Free Software 22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 23 */ 24 25 /* APPLE_HYB James Pearson j.pearson@ge.ucl.ac.uk 23/2/2000 */ 26 27 /* DUPLICATES_ONCE Alex Kopylov cdrtools@bootcd.ru 19.06.2004 */ 28 29 #include <schily/mconfig.h> /* Must be before stdio.h for LARGEFILE support */ 30 #include <schily/stdio.h> 31 #include <schily/types.h> 32 #include <schily/time.h> 33 #include <schily/stat.h> 34 #include <schily/stdlib.h> 35 #include <schily/unistd.h> /* Needed for for LARGEFILE support */ 36 #include <schily/string.h> 37 #include <schily/dirent.h> 38 #include <schily/utypes.h> 39 #include <schily/standard.h> 40 #include <schily/nlsdefs.h> 41 #include <schily/ctype.h> 42 #include <schily/libport.h> /* Define missing prototypes */ 43 #include "scsi.h" 44 45 #ifdef DVD_AUD_VID 46 #ifndef UDF 47 #define UDF 48 #endif 49 #endif 50 51 #ifdef USE_LARGEFILES 52 /* 53 * XXX Hack until fseeko()/ftello() are available everywhere or until 54 * XXX we know a secure way to let autoconf ckeck for fseeko()/ftello() 55 * XXX without defining FILE_OFFSETBITS to 64 in confdefs.h 56 */ 57 # define fseek fseeko 58 # define ftell ftello 59 #endif 60 61 #ifndef HAVE_LSTAT 62 #ifndef VMS 63 #define lstat stat 64 #endif 65 #endif 66 67 #include "iso9660.h" 68 #include "defaults.h" 69 #include <schily/siconv.h> 70 71 extern siconvt_t *in_nls; /* input UNICODE conversion table */ 72 extern siconvt_t *out_nls; /* output UNICODE conversion table */ 73 extern siconvt_t *hfs_inls; /* input HFS UNICODE conversion table */ 74 extern siconvt_t *hfs_onls; /* output HFS UNICODE conversion table */ 75 76 /* 77 * Structure used to pass arguments via trewalk() to walkfun(). 78 */ 79 struct wargs { 80 void *dir; /* Pointer to struct directory *root */ 81 char *name; /* NULL or alternative short name */ 82 }; 83 84 #ifdef APPLE_HYB 85 #include "mactypes.h" 86 #include "hfs.h" 87 88 struct hfs_info { 89 unsigned char finderinfo[32]; 90 char name[HFS_MAX_FLEN + 1]; 91 /* should have fields for dates here as well */ 92 char *keyname; 93 struct hfs_info *next; 94 }; 95 96 #endif /* APPLE_HYB */ 97 98 /* 99 * Our version of "struct timespec". 100 * Currently only used with UDF. 101 */ 102 typedef struct timesp { 103 time_t tv_sec; 104 Int32_t tv_nsec; 105 } timesp; 106 107 struct directory_entry { 108 struct directory_entry *next; 109 struct directory_entry *jnext; 110 struct iso_directory_record isorec; 111 unsigned int starting_block; 112 off_t size; 113 int mxpart; /* Extent number */ 114 unsigned short priority; 115 unsigned char jreclen; /* Joliet record len */ 116 char *name; 117 char *table; 118 char *whole_name; 119 struct directory *filedir; 120 struct directory_entry *parent_rec; 121 struct directory_entry *mxroot; /* Pointer to orig entry */ 122 unsigned int de_flags; 123 #ifdef UDF 124 mode_t mode; /* used for udf */ 125 dev_t rdev; /* used for udf devices */ 126 uid_t uid; /* used for udf */ 127 gid_t gid; /* used for udf */ 128 timesp atime; /* timespec for atime */ 129 timesp mtime; /* timespec for mtime */ 130 timesp ctime; /* timespec for ctime */ 131 #endif 132 ino_t inode; /* Used in the hash table */ 133 dev_t dev; /* Used in the hash table */ 134 unsigned char *rr_attributes; 135 unsigned int rr_attr_size; 136 unsigned int total_rr_attr_size; 137 unsigned int got_rr_name; 138 #ifdef APPLE_HYB 139 struct directory_entry *assoc; /* entry has a resource fork */ 140 hfsdirent *hfs_ent; /* HFS parameters */ 141 off_t hfs_off; /* offset to real start of fork */ 142 int hfs_type; /* type of HFS Unix file */ 143 #endif /* APPLE_HYB */ 144 #ifdef SORTING 145 int sort; /* sort weight for entry */ 146 #endif /* SORTING */ 147 #ifdef UDF 148 int udf_file_entry_sector; /* also used as UDF unique ID */ 149 #endif 150 #ifdef DUPLICATES_ONCE 151 unsigned char *digest_fast; 152 unsigned char *digest_full; 153 #endif 154 }; 155 156 struct file_hash { 157 struct file_hash *next; 158 ino_t inode; /* Used in the hash table */ 159 dev_t dev; /* Used in the hash table */ 160 nlink_t nlink; /* Used to compute new link count */ 161 unsigned int starting_block; 162 off_t size; 163 #if defined(SORTING) || defined(DUPLICATES_ONCE) 164 struct directory_entry *de; 165 #endif /* SORTING */ 166 }; 167 168 169 /* 170 * This structure is used to control the output of fragments to the cdrom 171 * image. Everything that will be written to the output image will eventually 172 * go through this structure. There are two pieces - first is the sizing where 173 * we establish extent numbers for everything, and the second is when we actually 174 * generate the contents and write it to the output image. 175 * 176 * This makes it trivial to extend mkisofs to write special things in the image. 177 * All you need to do is hook an additional structure in the list, and the rest 178 * works like magic. 179 * 180 * The three passes each do the following: 181 * 182 * The 'size' pass determines the size of each component and assigns the extent number 183 * for that component. 184 * 185 * The 'generate' pass will adjust the contents and pointers as required now that extent 186 * numbers are assigned. In some cases, the contents of the record are also generated. 187 * 188 * The 'write' pass actually writes the data to the disc. 189 */ 190 struct output_fragment { 191 struct output_fragment *of_next; 192 int (*of_size) __PR((UInt32_t)); 193 int (*of_generate) __PR((void)); 194 int (*of_write) __PR((FILE *)); 195 char *of_name; /* Textual description */ 196 unsigned int of_start_extent; /* For consist check */ 197 }; 198 199 extern struct output_fragment *out_list; 200 extern struct output_fragment *out_tail; 201 202 extern struct output_fragment startpad_desc; 203 extern struct output_fragment voldesc_desc; 204 extern struct output_fragment xvoldesc_desc; 205 extern struct output_fragment joliet_desc; 206 extern struct output_fragment torito_desc; 207 extern struct output_fragment end_vol; 208 extern struct output_fragment version_desc; 209 extern struct output_fragment pathtable_desc; 210 extern struct output_fragment jpathtable_desc; 211 extern struct output_fragment dirtree_desc; 212 extern struct output_fragment dirtree_clean; 213 extern struct output_fragment jdirtree_desc; 214 extern struct output_fragment extension_desc; 215 extern struct output_fragment files_desc; 216 extern struct output_fragment interpad_desc; 217 extern struct output_fragment endpad_desc; 218 extern struct output_fragment sunboot_desc; 219 extern struct output_fragment sunlabel_desc; 220 extern struct output_fragment genboot_desc; 221 extern struct output_fragment strfile_desc; 222 extern struct output_fragment strdir_desc; 223 extern struct output_fragment strpath_desc; 224 225 #ifdef APPLE_HYB 226 extern struct output_fragment hfs_desc; 227 228 #endif /* APPLE_HYB */ 229 #ifdef DVD_AUD_VID 230 /* 231 * This structure holds the information necessary to create a valid 232 * DVD-Video image. Basically it's how much to pad the files so the 233 * file offsets described in the video_ts.ifo and vts_xx_0.ifo are 234 * the correct one in the image that we create. 235 */ 236 typedef struct { 237 int realsize_ifo; 238 int realsize_menu; 239 int realsize_bup; 240 int size_ifo; 241 int size_menu; 242 int size_title; 243 int size_bup; 244 int pad_ifo; 245 int pad_menu; 246 int pad_title; 247 int pad_bup; 248 int number_of_vob_files; 249 int realsize_vob[10]; 250 } title_set_t; 251 252 typedef struct { 253 int num_titles; 254 title_set_t *title_set; 255 } title_set_info_t; 256 #endif /* DVD_AUD_VID */ 257 258 /* 259 * This structure describes one complete directory. It has pointers 260 * to other directories in the overall tree so that it is clear where 261 * this directory lives in the tree, and it also must contain pointers 262 * to the contents of the directory. Note that subdirectories of this 263 * directory exist twice in this stucture. Once in the subdir chain, 264 * and again in the contents chain. 265 */ 266 struct directory { 267 struct directory *next; /* Next directory at same level as this one */ 268 struct directory *subdir; /* First subdirectory in this directory */ 269 struct directory *parent; 270 struct directory_entry *contents; 271 struct directory_entry *jcontents; 272 struct directory_entry *self; 273 char *whole_name; /* Entire source path */ 274 char *de_path; /* Entire path iside ISO-9660 */ 275 char *de_name; /* Last path name component */ 276 unsigned int ce_bytes; /* Number of bytes of CE entries read */ 277 /* for this dir */ 278 unsigned int depth; 279 unsigned int size; 280 unsigned int extent; 281 unsigned int jsize; 282 unsigned int jextent; 283 unsigned int path_index; 284 unsigned int jpath_index; 285 unsigned short dir_flags; 286 unsigned short dir_nlink; 287 #ifdef APPLE_HYB 288 hfsdirent *hfs_ent; /* HFS parameters */ 289 struct hfs_info *hfs_info; /* list of info for all entries in dir */ 290 #endif /* APPLE_HYB */ 291 #ifdef SORTING 292 int sort; /* sort weight for child files */ 293 #endif /* SORTING */ 294 }; 295 296 struct deferred_write { 297 struct deferred_write *next; 298 char *table; 299 unsigned int extent; 300 off_t size; 301 char *name; 302 struct directory_entry *s_entry; 303 unsigned int pad; 304 off_t off; 305 unsigned int dw_flags; 306 #ifdef APPLE_HYB 307 int hfstype; 308 #endif 309 }; 310 311 struct eltorito_boot_entry_info { 312 struct eltorito_boot_entry_info *next; 313 char *boot_image; 314 int not_bootable; 315 int no_emul_boot; 316 int hard_disk_boot; 317 int boot_info_table; 318 int load_size; 319 int load_addr; 320 321 #define ELTORITO_BOOT_ID 1 322 #define ELTORITO_SECTION_HEADER 2 323 int type; 324 /* 325 * Valid if (type & ELTORITO_BOOT_ID) != 0 326 */ 327 int boot_platform; 328 329 }; 330 331 typedef struct ldate { 332 time_t l_sec; 333 int l_usec; 334 int l_gmtoff; 335 } ldate; 336 337 extern int goof; 338 extern struct directory *root; 339 extern struct directory *reloc_dir; 340 extern UInt32_t next_extent; 341 extern UInt32_t last_extent; 342 extern UInt32_t last_extent_written; 343 extern UInt32_t session_start; 344 345 extern unsigned int path_table_size; 346 extern unsigned int path_table[4]; 347 extern unsigned int path_blocks; 348 extern char *path_table_l; 349 extern char *path_table_m; 350 351 extern unsigned int jpath_table_size; 352 extern unsigned int jpath_table[4]; 353 extern unsigned int jpath_blocks; 354 extern char *jpath_table_l; 355 extern char *jpath_table_m; 356 357 extern struct iso_directory_record root_record; 358 extern struct iso_directory_record jroot_record; 359 360 extern int check_oldnames; 361 extern int check_session; 362 extern int use_eltorito; 363 extern int hard_disk_boot; 364 extern int not_bootable; 365 extern int no_emul_boot; 366 extern int load_addr; 367 extern int load_size; 368 extern int boot_info_table; 369 extern int use_RockRidge; 370 extern int osecsize; 371 extern int use_XA; 372 extern int use_Joliet; 373 extern int rationalize; 374 extern int rationalize_uid; 375 extern int rationalize_gid; 376 extern int rationalize_filemode; 377 extern int rationalize_dirmode; 378 extern uid_t uid_to_use; 379 extern gid_t gid_to_use; 380 extern int filemode_to_use; 381 extern int dirmode_to_use; 382 extern int new_dir_mode; 383 extern int follow_links; 384 extern int cache_inodes; 385 #ifdef DUPLICATES_ONCE 386 extern int duplicates_once; 387 #endif 388 extern int verbose; 389 extern int debug; 390 extern int gui; 391 extern int all_files; 392 extern int generate_tables; 393 extern int print_size; 394 extern int split_output; 395 extern int use_graft_ptrs; 396 extern int jhide_trans_tbl; 397 extern int hide_rr_moved; 398 extern int omit_period; 399 extern int omit_version_number; 400 extern int no_rr; 401 extern int transparent_compression; 402 extern Uint RR_relocation_depth; 403 extern int do_largefiles; 404 extern off_t maxnonlarge; 405 extern int iso9660_level; 406 extern int iso9660_namelen; 407 extern int full_iso9660_filenames; 408 extern int nolimitpathtables; 409 extern int relaxed_filenames; 410 extern int allow_lowercase; 411 extern int allow_multidot; 412 extern int iso_translate; 413 extern int allow_leading_dots; 414 extern int use_fileversion; 415 extern int split_SL_component; 416 extern int split_SL_field; 417 extern char *trans_tbl; 418 419 #define JMAX 64 /* maximum Joliet file name length (spec) */ 420 #define JLONGMAX 103 /* out of spec Joliet file name length */ 421 extern int jlen; /* selected maximum Joliet file name length */ 422 423 #ifdef DVD_AUD_VID 424 425 #define DVD_SPEC_NONE 0x0 426 #define DVD_SPEC_VIDEO 0x1 427 #define DVD_SPEC_AUDIO 0x2 428 #define DVD_SPEC_HYBRD (DVD_SPEC_VIDEO | DVD_SPEC_AUDIO) 429 extern int dvd_audio; 430 extern int dvd_hybrid; 431 extern int dvd_video; 432 extern int dvd_aud_vid_flag; 433 #endif /* DVD_AUD_VID */ 434 435 436 extern int donotwrite_macpart; 437 438 #ifdef APPLE_HYB 439 extern int apple_hyb; /* create HFS hybrid */ 440 extern int apple_ext; /* use Apple extensions */ 441 extern int apple_both; /* common flag (for above) */ 442 extern int hfs_extra; /* extra ISO extents (hfs_ce_size) */ 443 extern hce_mem *hce; /* libhfs/mkisofs extras */ 444 extern int use_mac_name; /* use Mac name for ISO9660/Joliet/RR */ 445 extern int create_dt; /* create the Desktp files */ 446 extern char *hfs_boot_file; /* name of HFS boot file */ 447 extern char *magic_file; /* magic file for CREATOR/TYPE matching */ 448 extern int hfs_last; /* order in which to process map/magic files */ 449 extern char *deftype; /* default Apple TYPE */ 450 extern char *defcreator; /* default Apple CREATOR */ 451 extern int gen_pt; /* generate HFS partition table */ 452 extern char *autoname; /* Autostart filename */ 453 extern int afe_size; /* Apple File Exchange block size */ 454 extern char *hfs_volume_id; /* HFS volume ID */ 455 extern int icon_pos; /* Keep Icon position */ 456 extern int hfs_lock; /* lock HFS volume (read-only) */ 457 extern char *hfs_bless; /* name of folder to 'bless' (System Folder) */ 458 extern char *hfs_parms; /* low level HFS parameters */ 459 460 #define MAP_LAST 1 /* process magic then map file */ 461 #define MAG_LAST 2 /* process map then magic file */ 462 463 #ifndef PREP_BOOT 464 #define PREP_BOOT 465 #endif /* PREP_BOOT */ 466 467 #ifdef PREP_BOOT 468 extern char *prep_boot_image[4]; 469 extern int use_prep_boot; 470 extern int use_chrp_boot; 471 472 #endif /* PREP_BOOT */ 473 #endif /* APPLE_HYB */ 474 475 #ifdef SORTING 476 extern int do_sort; 477 #endif /* SORTING */ 478 479 /* tree.c */ 480 extern int stat_filter __PR((char *, struct stat *)); 481 extern int lstat_filter __PR((char *, struct stat *)); 482 extern int sort_tree __PR((struct directory *)); 483 extern void attach_dot_entries __PR((struct directory * dirnode, 484 struct stat * this_stat, 485 struct stat * parent_stat)); 486 extern struct directory * 487 find_or_create_directory __PR((struct directory *, 488 char *, 489 struct directory_entry * self, int)); 490 extern void finish_cl_pl_entries __PR((void)); 491 extern int scan_directory_tree __PR((struct directory * this_dir, 492 char *path, 493 struct directory_entry * self)); 494 495 extern int insert_file_entry __PR((struct directory *, char *, 496 char *, struct stat *, int)); 497 498 extern struct directory_entry * 499 dup_directory_entry __PR((struct directory_entry *s_entry)); 500 extern void generate_iso9660_directories __PR((struct directory *, FILE *)); 501 extern void dump_tree __PR((struct directory * node)); 502 extern struct directory_entry *search_tree_file __PR((struct 503 directory * node, char *filename)); 504 extern void init_fstatbuf __PR((void)); 505 extern struct stat root_statbuf; 506 extern struct stat fstatbuf; 507 508 /* eltorito.c */ 509 extern void init_boot_catalog __PR((const char *path)); 510 extern void insert_boot_cat __PR((void)); 511 extern void get_boot_entry __PR((void)); 512 extern int new_boot_entry __PR((void)); 513 extern void ex_boot_enoent __PR((char *msg, char *pname)); 514 515 /* boot.c */ 516 extern int sparc_boot_label __PR((char *label)); 517 extern int sunx86_boot_label __PR((char *label)); 518 extern int scan_sparc_boot __PR((char *files)); 519 extern int scan_sunx86_boot __PR((char *files)); 520 extern int make_sun_label __PR((void)); 521 extern int make_sunx86_label __PR((void)); 522 523 /* isonum.c */ 524 extern void set_721 __PR((void *, UInt32_t)); 525 extern void set_722 __PR((void *, UInt32_t)); 526 extern void set_723 __PR((void *, UInt32_t)); 527 extern void set_731 __PR((void *, UInt32_t)); 528 extern void set_732 __PR((void *, UInt32_t)); 529 extern void set_733 __PR((void *, UInt32_t)); 530 531 extern UInt32_t get_711 __PR((void *)); 532 extern UInt32_t get_721 __PR((void *)); 533 extern UInt32_t get_723 __PR((void *)); 534 extern UInt32_t get_731 __PR((void *)); 535 extern UInt32_t get_732 __PR((void *)); 536 extern UInt32_t get_733 __PR((void *)); 537 538 /* write.c */ 539 extern int sort_directory __PR((struct directory_entry **, int)); 540 extern void generate_one_directory __PR((struct directory *, FILE *)); 541 extern void memcpy_max __PR((char *, char *, int)); 542 extern int oneblock_size __PR((UInt32_t starting_extent)); 543 extern struct iso_primary_descriptor vol_desc; 544 extern void xfwrite __PR((void *buffer, int size, int count, FILE * file, int submode, BOOL islast)); 545 extern void outputlist_insert __PR((struct output_fragment * frag)); 546 547 #ifdef APPLE_HYB 548 extern Ulong get_adj_size __PR((int Csize)); 549 extern int adj_size __PR((int Csize, UInt32_t start_extent, int extra)); 550 extern void adj_size_other __PR((struct directory * dpnt)); 551 extern int insert_padding_file __PR((int size)); 552 extern int gen_mac_label __PR((struct deferred_write *)); 553 554 #ifdef PREP_BOOT 555 extern void gen_prepboot_label __PR((unsigned char *)); 556 557 #endif /* PREP_BOOT */ 558 #endif /* APPLE_HYB */ 559 560 /* multi.c */ 561 562 extern FILE *in_image; 563 extern BOOL ignerr; 564 extern int open_merge_image __PR((char *path)); 565 extern int close_merge_image __PR((void)); 566 extern struct iso_directory_record * 567 merge_isofs __PR((char *path)); 568 extern unsigned char *parse_xa __PR((unsigned char *pnt, int *lenp, 569 struct directory_entry * dpnt)); 570 extern int rr_flags __PR((struct iso_directory_record *idr)); 571 extern int merge_previous_session __PR((struct directory *, 572 struct iso_directory_record *, char *, char *)); 573 extern int get_session_start __PR((int *)); 574 575 /* joliet.c */ 576 #ifdef UDF 577 extern void convert_to_unicode __PR((unsigned char *buffer, 578 int size, char *source, siconvt_t *inls)); 579 extern int joliet_strlen __PR((const char *string, size_t maxlen, 580 siconvt_t *inls)); 581 #endif 582 extern void conv_charset __PR((unsigned char *to, size_t *tosizep, 583 unsigned char *from, size_t *fromsizep, 584 siconvt_t *, 585 siconvt_t *)); 586 extern int joliet_sort_tree __PR((struct directory * node)); 587 588 /* match.c */ 589 extern int matches __PR((char *)); 590 extern int add_match __PR((char *)); 591 592 /* files.c */ 593 struct dirent *readdir_add_files __PR((char **, char *, DIR *)); 594 595 /* name.c */ 596 597 extern void iso9660_check __PR((struct iso_directory_record *idr, struct directory_entry *ndr)); 598 extern int iso9660_file_length __PR((const char *name, 599 struct directory_entry * sresult, int flag)); 600 601 /* various */ 602 extern int iso9660_date __PR((char *, time_t)); 603 extern int iso9660_ldate __PR((char *, time_t, int, int)); 604 extern void add_hash __PR((struct directory_entry *)); 605 extern struct file_hash *find_hash __PR((struct directory_entry *spnt)); 606 607 extern void flush_hash __PR((void)); 608 extern void add_directory_hash __PR((dev_t, ino_t)); 609 extern struct file_hash *find_directory_hash __PR((dev_t, ino_t)); 610 extern void flush_file_hash __PR((void)); 611 extern int delete_file_hash __PR((struct directory_entry *)); 612 extern struct directory_entry *find_file_hash __PR((char *)); 613 extern void add_file_hash __PR((struct directory_entry *)); 614 615 extern int generate_xa_rr_attributes __PR((char *, char *, 616 struct directory_entry *, 617 struct stat *, struct stat *, 618 int deep_flag)); 619 extern char *generate_rr_extension_record __PR((char *id, 620 char *descriptor, 621 char *source, int *size)); 622 623 extern int check_prev_session __PR((struct directory_entry **, int len, 624 struct directory_entry *, 625 struct stat *, 626 struct stat *, 627 struct directory_entry **)); 628 629 extern void match_cl_re_entries __PR((void)); 630 extern void finish_cl_pl_for_prev_session __PR((void)); 631 extern char *find_rr_attribute __PR((unsigned char *pnt, int len, char *attr_type)); 632 633 extern void udf_set_extattr_macresfork __PR((unsigned char *buf, off_t size, unsigned rba)); 634 extern void udf_set_extattr_freespace __PR((unsigned char *buf, off_t size, unsigned rba)); 635 extern int udf_get_symlinkcontents __PR((char *, char *, off_t *)); 636 637 /* inode.c */ 638 extern void do_inode __PR((struct directory *dpnt)); 639 extern void do_dir_nlink __PR((struct directory *dpnt)); 640 641 #ifdef APPLE_HYB 642 /* volume.c */ 643 extern int make_mac_volume __PR((struct directory * dpnt, UInt32_t start_extent)); 644 extern int write_fork __PR((hfsfile * hfp, long tot)); 645 646 /* apple.c */ 647 648 extern void del_hfs_info __PR((struct hfs_info *)); 649 extern int get_hfs_dir __PR((char *, char *, struct directory_entry *)); 650 extern int get_hfs_info __PR((char *, char *, struct directory_entry *)); 651 extern int get_hfs_rname __PR((char *, char *, char *)); 652 extern int hfs_exclude __PR((char *)); 653 extern void print_hfs_info __PR((struct directory_entry *)); 654 extern void hfs_init __PR((char *, unsigned short, unsigned int)); 655 extern void delete_rsrc_ent __PR((struct directory_entry *)); 656 extern void clean_hfs __PR((void)); 657 extern void perr __PR((char *)); 658 extern void set_root_info __PR((char *)); 659 extern int file_is_resource __PR((char *fname, int hfstype)); 660 extern int hfs_excludepath __PR((char *)); 661 662 /* desktop.c */ 663 664 extern int make_desktop __PR((hfsvol *, int)); 665 666 /* mac_label.c */ 667 668 #ifdef _MAC_LABEL_H 669 #ifdef PREP_BOOT 670 extern void gen_prepboot_label __PR((MacLabel * mac_label)); 671 #endif 672 extern int gen_mac_label __PR((defer *)); 673 #endif 674 extern int autostart __PR((void)); 675 676 /* libfile */ 677 678 extern char *get_magic_match __PR((const char *)); 679 extern void clean_magic __PR((void)); 680 681 #endif /* APPLE_HYB */ 682 683 #ifdef USE_FIND 684 /* 685 * The callback function for treewalk() from walk.c 686 */ 687 #ifdef _SCHILY_WALK_H 688 EXPORT int walkfunc __PR((char *nm, struct stat *fs, int type, 689 struct WALK *state)); 690 #endif 691 #endif 692 693 extern char *extension_record; 694 extern UInt32_t extension_record_extent; 695 /*extern int n_data_extents;*/ 696 extern BOOL archive_isreg; 697 extern dev_t archive_dev; 698 extern ino_t archive_ino; 699 700 /* 701 * These are a few goodies that can be specified on the command line, and are 702 * filled into the root record 703 */ 704 extern char *preparer; 705 extern char *publisher; 706 extern char *copyright; 707 extern char *biblio; 708 extern char *abstract; 709 extern char *appid; 710 extern char *volset_id; 711 extern char *system_id; 712 extern char *volume_id; 713 extern char *boot_catalog; 714 extern char *boot_image; 715 extern char *genboot_image; 716 extern int ucs_level; 717 extern int volume_set_size; 718 extern int volume_sequence_number; 719 720 extern struct eltorito_boot_entry_info *first_boot_entry; 721 extern struct eltorito_boot_entry_info *last_boot_entry; 722 extern struct eltorito_boot_entry_info *current_boot_entry; 723 724 extern UInt32_t null_inodes; 725 extern BOOL correct_inodes; 726 extern BOOL rrip112; 727 extern BOOL long_rr_time; /* TRUE: use long (17 Byte) time format */ 728 729 extern char *findgequal __PR((char *)); 730 extern void *e_malloc __PR((size_t)); 731 extern char *e_strdup __PR((const char *)); 732 733 /* 734 * Note: always use these macros to avoid problems. 735 * 736 * ISO_ROUND_UP(X) may cause an integer overflow and thus give 737 * incorrect results. So avoid it if possible. 738 * 739 * ISO_BLOCKS(X) is overflow safe. Prefer this when ever it is possible. 740 */ 741 #define SECTOR_SIZE (2048) 742 #define ISO_ROUND_UP(X) (((X) + (SECTOR_SIZE - 1)) & ~(SECTOR_SIZE - 1)) 743 #define ISO_BLOCKS(X) (((X) / SECTOR_SIZE) + (((X)%SECTOR_SIZE)?1:0)) 744 745 #define ROUND_UP(X, Y) (((X + (Y - 1)) / Y) * Y) 746 747 #ifdef APPLE_HYB 748 /* 749 * ISO blocks == 2048, HFS blocks == 512 750 */ 751 #define HFS_BLK_CONV (SECTOR_SIZE/HFS_BLOCKSZ) 752 753 #define HFS_ROUND_UP(X) ISO_ROUND_UP(((X)*HFS_BLOCKSZ)) /* XXX ??? */ 754 #define HFS_BLOCKS(X) (ISO_BLOCKS(X) * HFS_BLK_CONV) 755 756 #define USE_MAC_NAME(E) (use_mac_name && ((E)->hfs_ent != NULL) && (E)->hfs_type) 757 #endif /* APPLE_HYB */ 758 759 /* 760 * Inode and device values for special purposes. 761 */ 762 #define PREV_SESS_DEV ((dev_t)-2) 763 #define TABLE_INODE ((ino_t)-2) 764 #define UNCACHED_INODE ((ino_t)-1) 765 #define UNCACHED_DEVICE ((dev_t)-1) 766 767 /* 768 * The highest value used for the inodes we assign to files that do not have 769 * a starting block address (zero length files, symlinks, dev nodes, pipes, 770 * socket). 771 * We need to make sure that these numbers are valid ISO-9660 block addresses, 772 * this is why we use unsigned 32-bit integer values. 773 * We need to make sure that the inode numbers assigned for zero sized files 774 * is in a proper range, this is why we use numbers above the range of block 775 * addresses we use in the image. We start counting backwards from 0xFFFFFFF0 776 * to leave enough space for special numbers from the range listed above. 777 */ 778 #define NULL_INO_MAX ((UInt32_t)0xFFFFFFF0) 779 780 #ifdef VMS 781 #define STAT_INODE(X) (X.st_ino[0]) 782 #define PATH_SEPARATOR ']' 783 #define SPATH_SEPARATOR "" 784 #else 785 #define STAT_INODE(X) (X.st_ino) 786 #define PATH_SEPARATOR '/' 787 #define SPATH_SEPARATOR "/" 788 #endif 789 790 /* 791 * When using multi-session, indicates that we can reuse the 792 * TRANS.TBL information for this directory entry. If this flag 793 * is set for all entries in a directory, it means we can just 794 * reuse the TRANS.TBL and not generate a new one. 795 */ 796 #define SAFE_TO_REUSE_TABLE_ENTRY 0x01 /* de_flags only */ 797 #define DIR_HAS_DOT 0x02 /* dir_flags only */ 798 #define DIR_HAS_DOTDOT 0x04 /* dir_flags only */ 799 #define INHIBIT_JOLIET_ENTRY 0x08 800 #define INHIBIT_RR_ENTRY 0x10 /* not used */ 801 #define RELOCATED_DIRECTORY 0x20 /* de_flags only */ 802 #define INHIBIT_ISO9660_ENTRY 0x40 803 #define MEMORY_FILE 0x80 /* de_flags only */ 804 #define HIDDEN_FILE 0x100 /* de_flags only */ 805 #define DIR_WAS_SCANNED 0x200 /* dir_flags only */ 806 #define RESOURCE_FORK 0x400 /* de_flags only */ 807 #define IS_SYMLINK 0x800 /* de_flags only */ 808 #define MULTI_EXTENT 0x1000 /* de_flags only */ 809 #define INHIBIT_UDF_ENTRY 0x2000 810 811 /* 812 * Volume sequence number to use in all of the iso directory records. 813 */ 814 #define DEF_VSN 1 815 816 /* 817 * Make sure we have a definition for this. If not, take a very conservative 818 * guess. 819 * POSIX requires the max pathname component lenght to be defined in limits.h 820 * If variable, it may be undefined. If undefined, there should be 821 * a definition for _POSIX_NAME_MAX in limits.h or in unistd.h 822 * As _POSIX_NAME_MAX is defined to 14, we cannot use it. 823 * XXX Eric's wrong comment: 824 * XXX From what I can tell SunOS is the only one with this trouble. 825 */ 826 #include <schily/limits.h> 827 828 #ifndef NAME_MAX 829 #ifdef FILENAME_MAX 830 #define NAME_MAX FILENAME_MAX 831 #else 832 #define NAME_MAX 256 833 #endif 834 #endif 835 836 #ifndef PATH_MAX 837 #ifdef FILENAME_MAX 838 #define PATH_MAX FILENAME_MAX 839 #else 840 #define PATH_MAX 1024 841 #endif 842 #endif 843 844 /* 845 * Cygwin seems to have PATH_MAX == 260 which is less than the usable 846 * path length. We raise PATH_MAX to at least 1024 for now for all platforms 847 * unless someone reports problems with mkisofs memory size. 848 */ 849 #if PATH_MAX < 1024 850 #undef PATH_MAX 851 #define PATH_MAX 1024 852 #endif 853 854 /* 855 * XXX JS: Some structures have odd lengths! 856 * Some compilers (e.g. on Sun3/mc68020) padd the structures to even length. 857 * For this reason, we cannot use sizeof (struct iso_path_table) or 858 * sizeof (struct iso_directory_record) to compute on disk sizes. 859 * Instead, we use offsetof(..., name) and add the name size. 860 * See iso9660.h 861 */ 862 #ifndef offsetof 863 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 864 #endif 865 866 #ifdef UDF 867 extern int use_udf; 868 #endif 869 extern int create_udfsymlinks; 870 871 #if !defined(HAVE_MEMSET) && !defined(memset) 872 #define memset(s, c, n) fillbytes(s, n, c) 873 #endif 874 #if !defined(HAVE_MEMCHR) && !defined(memchr) 875 #define memchr(s, c, n) findbytes(s, n, c) 876 #endif 877 #if !defined(HAVE_MEMCPY) && !defined(memcpy) 878 #define memcpy(s1, s2, n) movebytes(s2, s1, n) 879 #endif 880 #if !defined(HAVE_MEMMOVE) && !defined(memmove) 881 #define memmove(s1, s2, n) movebytes(s2, s1, n) 882 #endif 883