123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533 |
- /*
- * Header file mkisofs.h - assorted structure definitions and typecasts.
- Written by Eric Youngdale (1993).
- Copyright 1993 Yggdrasil Computing, Incorporated
- Copyright (C) 2009,2010 Free Software Foundation, Inc.
- 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 3, 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, see <http://www.gnu.org/licenses/>.
- */
- /*
- * $Id: mkisofs.h,v 1.20 1999/03/02 04:16:41 eric Exp $
- */
- #include <stdio.h>
- #ifdef HAVE_STDINT_H
- #include <stdint.h>
- #endif
- #include <prototyp.h>
- #include <sys/stat.h>
- #if (defined(ENABLE_NLS) && ENABLE_NLS)
- # include <locale.h>
- # include <libintl.h>
- #else /* ! (defined(ENABLE_NLS) && ENABLE_NLS) */
- /* Disabled NLS.
- The casts to 'const char *' serve the purpose of producing warnings
- for invalid uses of the value returned from these functions.
- On pre-ANSI systems without 'const', the config.h file is supposed to
- contain "#define const". */
- # define gettext(Msgid) ((const char *) (Msgid))
- #endif /* (defined(ENABLE_NLS) && ENABLE_NLS) */
- #define _(str) gettext(str)
- #define N_(str) str
- /* This symbol is used to indicate that we do not have things like
- symlinks, devices, and so forth available. Just files and dirs */
- #ifdef VMS
- #define NON_UNIXFS
- #endif
- #ifdef DJGPP
- #define NON_UNIXFS
- #endif
- #ifdef VMS
- #include <sys/dir.h>
- #define dirent direct
- #endif
- #ifdef _WIN32
- #define NON_UNIXFS
- #endif /* _WIN32 */
- #ifndef S_IROTH
- #define S_IROTH 0
- #endif
- #ifndef S_IRGRP
- #define S_IRGRP 0
- #endif
- #ifndef HAVE_GETUID
- static inline int
- getuid ()
- {
- return 0;
- }
- #endif
- #ifndef HAVE_GETGID
- static inline int
- getgid ()
- {
- return 0;
- }
- #endif
- #ifndef HAVE_LSTAT
- static inline int
- lstat (const char *filename, struct stat *buf)
- {
- return stat (filename, buf);
- }
- #endif
- #include <string.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #if defined(HAVE_DIRENT_H)
- # include <dirent.h>
- # define NAMLEN(dirent) strlen((dirent)->d_name)
- #else
- # define dirent direct
- # define NAMLEN(dirent) (dirent)->d_namlen
- # if defined(HAVE_SYS_NDIR_H)
- # include <sys/ndir.h>
- # endif
- # if defined(HAVE_SYS_DIR_H)
- # include <sys/dir.h>
- # endif
- # if defined(HAVE_NDIR_H)
- # include <ndir.h>
- # endif
- #endif
- #if defined(HAVE_STRING_H)
- #include <string.h>
- #else
- #if defined(HAVE_STRINGS_H)
- #include <strings.h>
- #endif
- #endif
- #ifdef ultrix
- extern char *strdup();
- #endif
- #ifdef __STDC__
- #define DECL(NAME,ARGS) NAME ARGS
- #define FDECL1(NAME,TYPE0, ARG0) \
- NAME(TYPE0 ARG0)
- #define FDECL2(NAME,TYPE0, ARG0,TYPE1, ARG1) \
- NAME(TYPE0 ARG0, TYPE1 ARG1)
- #define FDECL3(NAME,TYPE0, ARG0,TYPE1, ARG1, TYPE2, ARG2) \
- NAME(TYPE0 ARG0, TYPE1 ARG1, TYPE2 ARG2)
- #define FDECL4(NAME,TYPE0, ARG0,TYPE1, ARG1, TYPE2, ARG2, TYPE3, ARG3) \
- NAME(TYPE0 ARG0, TYPE1 ARG1, TYPE2 ARG2, TYPE3 ARG3)
- #define FDECL5(NAME,TYPE0, ARG0,TYPE1, ARG1, TYPE2, ARG2, TYPE3, ARG3, TYPE4, ARG4) \
- NAME(TYPE0 ARG0, TYPE1 ARG1, TYPE2 ARG2, TYPE3 ARG3, TYPE4 ARG4)
- #define FDECL6(NAME,TYPE0, ARG0,TYPE1, ARG1, TYPE2, ARG2, TYPE3, ARG3, TYPE4, ARG4, TYPE5, ARG5) \
- NAME(TYPE0 ARG0, TYPE1 ARG1, TYPE2 ARG2, TYPE3 ARG3, TYPE4 ARG4, TYPE5 ARG5)
- #else
- #define DECL(NAME,ARGS) NAME()
- #define FDECL1(NAME,TYPE0, ARG0) NAME(ARG0) TYPE0 ARG0;
- #define FDECL2(NAME,TYPE0, ARG0,TYPE1, ARG1) NAME(ARG0, ARG1) TYPE0 ARG0; TYPE1 ARG1;
- #define FDECL3(NAME,TYPE0, ARG0,TYPE1, ARG1, TYPE2, ARG2) \
- NAME(ARG0, ARG1, ARG2) TYPE0 ARG0; TYPE1 ARG1; TYPE2 ARG2;
- #define FDECL4(NAME,TYPE0, ARG0,TYPE1, ARG1, TYPE2, ARG2, TYPE3, ARG3) \
- NAME(ARG0, ARG1, ARG2, ARG3, ARG4) TYPE0 ARG0; TYPE1 ARG1; TYPE2 ARG2; TYPE3 ARG3;
- #define FDECL5(NAME,TYPE0, ARG0,TYPE1, ARG1, TYPE2, ARG2, TYPE3, ARG3, TYPE4, ARG4) \
- NAME(ARG0, ARG1, ARG2, ARG3, ARG4) TYPE0 ARG0; TYPE1 ARG1; TYPE2 ARG2; TYPE3 ARG3; TYPE4 ARG4;
- #define FDECL6(NAME,TYPE0, ARG0,TYPE1, ARG1, TYPE2, ARG2, TYPE3, ARG3, TYPE4, ARG4, TYPE5, ARG5) \
- NAME(ARG0, ARG1, ARG2, ARG3, ARG4, ARG5) TYPE0 ARG0; TYPE1 ARG1; TYPE2 ARG2; TYPE3 ARG3; TYPE4 ARG4; TYPE5 ARG5;
- #define const
- #endif
- #ifdef __SVR4
- #include <stdlib.h>
- #else
- extern int optind;
- extern char *optarg;
- /* extern int getopt (int __argc, char **__argv, char *__optstring); */
- #endif
- #include "iso9660.h"
- #include "defaults.h"
- struct directory_entry{
- struct directory_entry * next;
- struct directory_entry * jnext;
- struct iso_directory_record isorec;
- uint64_t starting_block;
- uint64_t size;
- unsigned short priority;
- unsigned char jreclen; /* Joliet record len */
- char * name;
- char * table;
- char * whole_name;
- struct directory * filedir;
- struct directory_entry * parent_rec;
- unsigned int de_flags;
- 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;
- };
- struct file_hash{
- struct file_hash * next;
- ino_t inode; /* Used in the hash table */
- dev_t dev; /* Used in the hash table */
- unsigned int starting_block;
- unsigned int size;
- };
- /*
- * 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;
- #ifdef __STDC__
- int (*of_size)(int);
- int (*of_generate)(void);
- int (*of_write)(FILE *);
- #else
- int (*of_size)();
- int (*of_generate)();
- int (*of_write)();
- #endif
- };
- extern struct output_fragment * out_list;
- extern struct output_fragment * out_tail;
- extern struct output_fragment padblock_desc;
- extern struct output_fragment voldesc_desc;
- extern struct output_fragment joliet_desc;
- extern struct output_fragment torito_desc;
- extern struct output_fragment end_vol;
- 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;
- /*
- * 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 path */
- char * de_name; /* Entire path */
- unsigned int ce_bytes; /* Number of bytes of CE entries reqd for this dir */
- unsigned int depth;
- unsigned int size;
- unsigned int extent;
- unsigned int jsize;
- unsigned int jextent;
- unsigned short path_index;
- unsigned short jpath_index;
- unsigned short dir_flags;
- unsigned short dir_nlink;
- };
- extern int goof;
- extern struct directory * root;
- extern struct directory * reloc_dir;
- extern uint64_t next_extent;
- extern uint64_t last_extent;
- extern uint64_t last_extent_written;
- extern uint64_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 use_eltorito;
- extern int use_embedded_boot;
- extern int use_protective_msdos_label;
- extern int use_eltorito_emul_floppy;
- extern int use_boot_info_table;
- extern int use_RockRidge;
- extern int use_Joliet;
- extern int rationalize;
- extern int follow_links;
- extern int verbose;
- extern int all_files;
- extern int generate_tables;
- extern int print_size;
- extern int split_output;
- extern int omit_period;
- extern int omit_version_number;
- extern int transparent_compression;
- extern unsigned int RR_relocation_depth;
- extern int full_iso9660_filenames;
- extern int split_SL_component;
- extern int split_SL_field;
- /* tree.c */
- extern int DECL(stat_filter, (char *, struct stat *));
- extern int DECL(lstat_filter, (char *, struct stat *));
- extern int DECL(sort_tree,(struct directory *));
- extern struct directory *
- DECL(find_or_create_directory,(struct directory *, const char *,
- struct directory_entry * self, int));
- extern void DECL (finish_cl_pl_entries, (void));
- extern int DECL(scan_directory_tree,(struct directory * this_dir,
- char * path,
- struct directory_entry * self));
- extern int DECL(insert_file_entry,(struct directory *, char *,
- char *));
- extern void DECL(generate_iso9660_directories,(struct directory *, FILE*));
- extern void DECL(dump_tree,(struct directory * node));
- extern struct directory_entry * DECL(search_tree_file, (struct
- directory * node,char * filename));
- extern void DECL(update_nlink_field,(struct directory * node));
- extern void DECL (init_fstatbuf, (void));
- extern struct stat root_statbuf;
- /* eltorito.c */
- extern void DECL(init_boot_catalog, (const char * path ));
- extern void DECL(get_torito_desc, (struct eltorito_boot_descriptor * path ));
- /* write.c */
- extern int DECL(get_731,(char *));
- extern int DECL(get_733,(char *));
- extern int DECL(isonum_733,(unsigned char *));
- extern void DECL(set_723,(char *, unsigned int));
- extern void DECL(set_731,(char *, unsigned int));
- extern void DECL(set_721,(char *, unsigned int));
- extern void DECL(set_733,(char *, unsigned int));
- extern int DECL(sort_directory,(struct directory_entry **));
- extern void DECL(generate_one_directory,(struct directory *, FILE*));
- extern void DECL(memcpy_max, (char *, char *, int));
- extern int DECL(oneblock_size, (int starting_extent));
- extern struct iso_primary_descriptor vol_desc;
- extern void DECL(xfwrite, (void * buffer, uint64_t count, uint64_t size, FILE * file));
- extern void DECL(set_732, (char * pnt, unsigned int i));
- extern void DECL(set_722, (char * pnt, unsigned int i));
- extern void DECL(outputlist_insert, (struct output_fragment * frag));
- /*
- * Set by user command-line to override default date values
- */
- extern char *creation_date;
- extern char *modification_date;
- extern char *expiration_date;
- extern char *effective_date;
- /* multi.c */
- extern FILE * in_image;
- extern struct iso_directory_record *
- DECL(merge_isofs,(char * path));
- extern int DECL(free_mdinfo, (struct directory_entry **, int len));
- extern struct directory_entry **
- DECL(read_merging_directory,(struct iso_directory_record *, int*));
- extern void
- DECL(merge_remaining_entries, (struct directory *,
- struct directory_entry **, int));
- extern int
- DECL(merge_previous_session, (struct directory *,
- struct iso_directory_record *));
- extern int DECL(get_session_start, (int *));
- /* joliet.c */
- int DECL(joliet_sort_tree, (struct directory * node));
- /* match.c */
- extern int DECL(matches, (char *));
- extern void DECL(add_match, (char *));
- /* files.c */
- struct dirent * DECL(readdir_add_files, (char **, char *, DIR *));
- /* */
- extern int DECL(iso9660_file_length,(const char* name,
- struct directory_entry * sresult, int flag));
- extern int DECL(iso9660_date,(char *, time_t));
- extern void DECL(add_hash,(struct directory_entry *));
- extern struct file_hash * DECL(find_hash,(dev_t, ino_t));
- extern void DECL(add_directory_hash,(dev_t, ino_t));
- extern struct file_hash * DECL(find_directory_hash,(dev_t, ino_t));
- extern void DECL (flush_file_hash, (void));
- extern int DECL(delete_file_hash,(struct directory_entry *));
- extern struct directory_entry * DECL(find_file_hash,(char *));
- extern void DECL(add_file_hash,(struct directory_entry *));
- extern int DECL(generate_rock_ridge_attributes,(char *, char *,
- struct directory_entry *,
- struct stat *, struct stat *,
- int deep_flag));
- extern char * DECL(generate_rr_extension_record,(char * id, char * descriptor,
- char * source, int * size));
- extern int DECL(check_prev_session, (struct directory_entry **, int len,
- struct directory_entry *,
- struct stat *,
- struct stat *,
- struct directory_entry **));
- #ifdef USE_SCG
- /* scsi.c */
- #ifdef __STDC__
- extern int readsecs(int startsecno, void *buffer, int sectorcount);
- extern int scsidev_open(char *path);
- #else
- extern int readsecs();
- extern int scsidev_open();
- #endif
- #endif
- extern char * extension_record;
- extern int extension_record_extent;
- extern int n_data_extents;
- /* 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 *boot_image_embed;
- extern int volume_set_size;
- extern int volume_sequence_number;
- extern void * DECL(e_malloc,(size_t));
- #define SECTOR_SIZE (2048)
- #define ROUND_UP(X) ((X + (SECTOR_SIZE - 1)) & ~(SECTOR_SIZE - 1))
- #define NEED_RE 1
- #define NEED_PL 2
- #define NEED_CL 4
- #define NEED_CE 8
- #define NEED_SP 16
- #define PREV_SESS_DEV (sizeof(dev_t) >= 4 ? 0x7ffffffd : 0x7ffd)
- #define TABLE_INODE (sizeof(ino_t) >= 4 ? 0x7ffffffe : 0x7ffe)
- #define UNCACHED_INODE (sizeof(ino_t) >= 4 ? 0x7fffffff : 0x7fff)
- #define UNCACHED_DEVICE (sizeof(dev_t) >= 4 ? 0x7fffffff : 0x7fff)
- #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
- #define DIR_HAS_DOT 0x02
- #define DIR_HAS_DOTDOT 0x04
- #define INHIBIT_JOLIET_ENTRY 0x08
- #define INHIBIT_RR_ENTRY 0x10
- #define RELOCATED_DIRECTORY 0x20
- #define INHIBIT_ISO9660_ENTRY 0x40
- /*
- * 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. From what I can tell SunOS is the only one with this trouble.
- */
- #ifndef NAME_MAX
- #ifdef FILENAME_MAX
- #define NAME_MAX FILENAME_MAX
- #else
- #define NAME_MAX 128
- #endif
- #endif
|