mkisofs.h
上传用户:xiejiait
上传日期:2007-01-06
资源大小:881k
文件大小:16k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /*
  2.  * Header file mkisofs.h - assorted structure definitions and typecasts.
  3.    Written by Eric Youngdale (1993).
  4.    Copyright 1993 Yggdrasil Computing, Incorporated
  5.    This program is free software; you can redistribute it and/or modify
  6.    it under the terms of the GNU General Public License as published by
  7.    the Free Software Foundation; either version 2, or (at your option)
  8.    any later version.
  9.    This program is distributed in the hope that it will be useful,
  10.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.    GNU General Public License for more details.
  13.    You should have received a copy of the GNU General Public License
  14.    along with this program; if not, write to the Free Software
  15.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  16. /*
  17.  *  $Id: mkisofs.h,v 1.20 1999/03/02 04:16:41 eric Exp $
  18.  */
  19. #include <stdio.h>
  20. #include <prototyp.h>
  21. /* This symbol is used to indicate that we do not have things like
  22.    symlinks, devices, and so forth available.  Just files and dirs */
  23. #ifdef VMS
  24. #define NON_UNIXFS
  25. #endif
  26. #ifdef DJGPP
  27. #define NON_UNIXFS
  28. #endif
  29. #ifdef VMS
  30. #include <sys/dir.h>
  31. #define dirent direct
  32. #endif
  33. #ifdef _WIN32
  34. #define NON_UNIXFS
  35. #endif /* _WIN32 */
  36. #include <string.h>
  37. #include <sys/types.h>
  38. #include <sys/stat.h>
  39. #include <statdefs.h>
  40. #ifndef HAVE_LSTAT
  41. #ifndef VMS
  42. # define lstat stat
  43. #endif
  44. #endif
  45. #if defined(HAVE_DIRENT_H)
  46. # include <dirent.h>
  47. # define NAMLEN(dirent) strlen((dirent)->d_name)
  48. #else
  49. # define dirent direct
  50. # define NAMLEN(dirent) (dirent)->d_namlen
  51. # if defined(HAVE_SYS_NDIR_H)
  52. #  include <sys/ndir.h>
  53. # endif
  54. # if defined(HAVE_SYS_DIR_H)
  55. #  include <sys/dir.h>
  56. # endif
  57. # if defined(HAVE_NDIR_H)
  58. #  include <ndir.h>
  59. # endif
  60. #endif
  61. #if defined(HAVE_STRING_H)
  62. #include <string.h>
  63. #else
  64. #if defined(HAVE_STRINGS_H)
  65. #include <strings.h>
  66. #endif
  67. #endif
  68. #ifdef ultrix
  69. extern char *strdup();
  70. #endif
  71. #ifdef __STDC__
  72. #define DECL(NAME,ARGS) NAME ARGS
  73. #define FDECL1(NAME,TYPE0, ARG0) 
  74. NAME(TYPE0 ARG0)
  75. #define FDECL2(NAME,TYPE0, ARG0,TYPE1, ARG1) 
  76. NAME(TYPE0 ARG0, TYPE1 ARG1)
  77. #define FDECL3(NAME,TYPE0, ARG0,TYPE1, ARG1, TYPE2, ARG2) 
  78. NAME(TYPE0 ARG0, TYPE1 ARG1, TYPE2 ARG2)
  79. #define FDECL4(NAME,TYPE0, ARG0,TYPE1, ARG1, TYPE2, ARG2, TYPE3, ARG3) 
  80. NAME(TYPE0 ARG0, TYPE1 ARG1, TYPE2 ARG2, TYPE3 ARG3)
  81. #define FDECL5(NAME,TYPE0, ARG0,TYPE1, ARG1, TYPE2, ARG2, TYPE3, ARG3, TYPE4, ARG4) 
  82. NAME(TYPE0 ARG0, TYPE1 ARG1, TYPE2 ARG2, TYPE3 ARG3, TYPE4 ARG4)
  83. #define FDECL6(NAME,TYPE0, ARG0,TYPE1, ARG1, TYPE2, ARG2, TYPE3, ARG3, TYPE4, ARG4, TYPE5, ARG5) 
  84. NAME(TYPE0 ARG0, TYPE1 ARG1, TYPE2 ARG2, TYPE3 ARG3, TYPE4 ARG4, TYPE5 ARG5)
  85. #else
  86. #define DECL(NAME,ARGS) NAME()
  87. #define FDECL1(NAME,TYPE0, ARG0) NAME(ARG0) TYPE0 ARG0;
  88. #define FDECL2(NAME,TYPE0, ARG0,TYPE1, ARG1) NAME(ARG0, ARG1) TYPE0 ARG0; TYPE1 ARG1;
  89. #define FDECL3(NAME,TYPE0, ARG0,TYPE1, ARG1, TYPE2, ARG2) 
  90. NAME(ARG0, ARG1, ARG2) TYPE0 ARG0; TYPE1 ARG1; TYPE2 ARG2;
  91. #define FDECL4(NAME,TYPE0, ARG0,TYPE1, ARG1, TYPE2, ARG2, TYPE3, ARG3) 
  92. NAME(ARG0, ARG1, ARG2, ARG3, ARG4) TYPE0 ARG0; TYPE1 ARG1; TYPE2 ARG2; TYPE3 ARG3;
  93. #define FDECL5(NAME,TYPE0, ARG0,TYPE1, ARG1, TYPE2, ARG2, TYPE3, ARG3, TYPE4, ARG4) 
  94. NAME(ARG0, ARG1, ARG2, ARG3, ARG4) TYPE0 ARG0; TYPE1 ARG1; TYPE2 ARG2; TYPE3 ARG3; TYPE4 ARG4;
  95. #define FDECL6(NAME,TYPE0, ARG0,TYPE1, ARG1, TYPE2, ARG2, TYPE3, ARG3, TYPE4, ARG4, TYPE5, ARG5) 
  96. NAME(ARG0, ARG1, ARG2, ARG3, ARG4, ARG5) TYPE0 ARG0; TYPE1 ARG1; TYPE2 ARG2; TYPE3 ARG3; TYPE4 ARG4; TYPE5 ARG5;
  97. #define const
  98. #endif
  99. #ifdef __SVR4
  100. #include <stdlib.h>
  101. #else
  102. extern int optind;
  103. extern char *optarg;
  104. /* extern int getopt (int __argc, char **__argv, char *__optstring); */
  105. #endif
  106. #include "iso9660.h"
  107. #include "defaults.h"
  108. struct directory_entry{
  109.   struct directory_entry * next;
  110.   struct directory_entry * jnext;
  111.   struct iso_directory_record isorec;
  112.   unsigned int starting_block;
  113.   unsigned int size;
  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.   unsigned int de_flags;
  122.   ino_t inode;  /* Used in the hash table */
  123.   dev_t dev;  /* Used in the hash table */
  124.   unsigned char * rr_attributes;
  125.   unsigned int rr_attr_size;
  126.   unsigned int total_rr_attr_size;
  127.   unsigned int got_rr_name;
  128. };
  129. struct file_hash{
  130.   struct file_hash * next;
  131.   ino_t inode;  /* Used in the hash table */
  132.   dev_t dev;  /* Used in the hash table */
  133.   unsigned int starting_block;
  134.   unsigned int size;
  135. };
  136.   
  137. /*
  138.  * This structure is used to control the output of fragments to the cdrom
  139.  * image.  Everything that will be written to the output image will eventually
  140.  * go through this structure.   There are two pieces - first is the sizing where
  141.  * we establish extent numbers for everything, and the second is when we actually
  142.  * generate the contents and write it to the output image.
  143.  *
  144.  * This makes it trivial to extend mkisofs to write special things in the image.
  145.  * All you need to do is hook an additional structure in the list, and the rest
  146.  * works like magic.
  147.  *
  148.  * The three passes each do the following:
  149.  *
  150.  * The 'size' pass determines the size of each component and assigns the extent number
  151.  * for that component.
  152.  *
  153.  * The 'generate' pass will adjust the contents and pointers as required now that extent
  154.  * numbers are assigned.   In some cases, the contents of the record are also generated.
  155.  *
  156.  * The 'write' pass actually writes the data to the disc.
  157.  */
  158. struct output_fragment
  159. {
  160.   struct output_fragment * of_next;
  161. #ifdef __STDC__
  162.   int                      (*of_size)(int);
  163.   int                    (*of_generate)(void);
  164.   int                    (*of_write)(FILE *);
  165. #else
  166.   int                      (*of_size)();
  167.   int                    (*of_generate)();
  168.   int                    (*of_write)();
  169. #endif
  170. };
  171. extern struct output_fragment * out_list;
  172. extern struct output_fragment * out_tail;
  173. extern struct output_fragment padblock_desc;
  174. extern struct output_fragment voldesc_desc;
  175. extern struct output_fragment joliet_desc;
  176. extern struct output_fragment torito_desc;
  177. extern struct output_fragment end_vol;
  178. extern struct output_fragment pathtable_desc;
  179. extern struct output_fragment jpathtable_desc;
  180. extern struct output_fragment dirtree_desc;
  181. extern struct output_fragment dirtree_clean;
  182. extern struct output_fragment jdirtree_desc;
  183. extern struct output_fragment extension_desc;
  184. extern struct output_fragment files_desc;
  185. extern struct output_fragment sunboot_desc;
  186. extern struct output_fragment sunlabel_desc;
  187. extern struct output_fragment genboot_desc;
  188. /* 
  189.  * This structure describes one complete directory.  It has pointers
  190.  * to other directories in the overall tree so that it is clear where
  191.  * this directory lives in the tree, and it also must contain pointers
  192.  * to the contents of the directory.  Note that subdirectories of this
  193.  * directory exist twice in this stucture.  Once in the subdir chain,
  194.  * and again in the contents chain.
  195.  */
  196. struct directory{
  197.   struct directory * next;  /* Next directory at same level as this one */
  198.   struct directory * subdir; /* First subdirectory in this directory */
  199.   struct directory * parent;
  200.   struct directory_entry * contents;
  201.   struct directory_entry * jcontents;
  202.   struct directory_entry * self;
  203.   char * whole_name;  /* Entire path */
  204.   char * de_name;  /* Entire path */
  205.   unsigned int ce_bytes;  /* Number of bytes of CE entries reqd for this dir */
  206.   unsigned int depth;
  207.   unsigned int size;
  208.   unsigned int extent;
  209.   unsigned int jsize;
  210.   unsigned int jextent;
  211.   unsigned short path_index;
  212.   unsigned short jpath_index;
  213.   unsigned short dir_flags;
  214.   unsigned short dir_nlink;
  215. };
  216. struct deferred{
  217.   struct deferred * next;
  218.   unsigned int starting_block;
  219.   char * name;
  220.   struct directory * filedir;
  221.   unsigned int flags;
  222. };
  223. extern int goof;
  224. extern struct directory * root;
  225. extern struct directory * reloc_dir;
  226. extern unsigned int next_extent;
  227. extern unsigned int last_extent;
  228. extern unsigned int last_extent_written;
  229. extern unsigned int session_start;
  230. extern unsigned int path_table_size;
  231. extern unsigned int path_table[4];
  232. extern unsigned int path_blocks;
  233. extern char * path_table_l;
  234. extern char * path_table_m;
  235. extern unsigned int jpath_table_size;
  236. extern unsigned int jpath_table[4];
  237. extern unsigned int jpath_blocks;
  238. extern char * jpath_table_l;
  239. extern char * jpath_table_m;
  240. extern struct iso_directory_record root_record;
  241. extern struct iso_directory_record jroot_record;
  242. extern int use_eltorito;
  243. extern int hard_disk_boot;
  244. extern int not_bootable;
  245. extern int no_emul_boot;
  246. extern int load_addr;
  247. extern int load_size;
  248. extern int boot_info_table;
  249. extern int use_RockRidge;
  250. extern int use_Joliet;
  251. extern int rationalize;
  252. extern int follow_links;
  253. extern int verbose;
  254. extern int gui;
  255. extern int all_files;
  256. extern int generate_tables;
  257. extern int print_size;
  258. extern int split_output;
  259. extern int jhide_trans_tbl;
  260. extern int hide_rr_moved;
  261. extern int omit_period;
  262. extern int omit_version_number;
  263. extern int no_rr;
  264. extern int transparent_compression;
  265. extern int RR_relocation_depth;
  266. extern int full_iso9660_filenames;
  267. extern int allow_untranslated;
  268. extern int split_SL_component;
  269. extern int split_SL_field;
  270. extern char *trans_tbl;
  271. /* tree.c */
  272. extern int DECL(stat_filter, (char *, struct stat *));
  273. extern int DECL(lstat_filter, (char *, struct stat *));
  274. extern int DECL(sort_tree,(struct directory *));
  275. extern struct directory *
  276.            DECL(find_or_create_directory,(struct directory *, const char *,
  277.   struct directory_entry * self, int));
  278. extern void DECL (finish_cl_pl_entries, (void));
  279. extern int DECL(scan_directory_tree,(struct directory * this_dir,
  280.      char * path, 
  281.      struct directory_entry * self));
  282. extern int DECL(insert_file_entry,(struct directory *, char *, 
  283.    char *));
  284. extern void DECL(generate_iso9660_directories,(struct directory *, FILE*));
  285. extern void DECL(dump_tree,(struct directory * node));
  286. extern struct directory_entry * DECL(search_tree_file, (struct 
  287. directory * node,char * filename));
  288. extern void DECL(update_nlink_field,(struct directory * node));
  289. extern void DECL (init_fstatbuf, (void));
  290. extern struct stat root_statbuf;
  291. extern struct stat fstatbuf;
  292. /* eltorito.c */
  293. extern void DECL(init_boot_catalog, (const char * path ));
  294. extern void DECL(get_torito_desc, (struct eltorito_boot_descriptor * path ));
  295. extern void DECL (insert_boot_cat, (void));
  296. /* boot.c */
  297. extern void sparc_boot_label __PR((char *label));
  298. extern void scan_sparc_boot __PR((char *files));
  299. extern int make_sun_label __PR((void));
  300. /* write.c */
  301. extern int DECL(get_731,(char *));
  302. extern int DECL(get_732,(char *));
  303. extern int DECL(get_733,(char *));
  304. extern int DECL(isonum_733,(unsigned char *));
  305. extern void DECL(set_723,(char *, unsigned int));
  306. extern void DECL(set_731,(char *, unsigned int));
  307. extern void DECL(set_721,(char *, unsigned int));
  308. extern void DECL(set_733,(char *, unsigned int));
  309. extern int  DECL(sort_directory,(struct directory_entry **, int));
  310. extern void DECL(generate_one_directory,(struct directory *, FILE*));
  311. extern void DECL(memcpy_max, (char *, char *, int));
  312. extern int DECL(oneblock_size, (int starting_extent));
  313. extern struct iso_primary_descriptor vol_desc;
  314. extern void DECL(xfwrite, (void * buffer, int count, int size, FILE * file));
  315. extern void DECL(set_732, (char * pnt, unsigned int i));
  316. extern void DECL(set_722, (char * pnt, unsigned int i));
  317. extern void DECL(outputlist_insert, (struct output_fragment * frag));
  318. /* multi.c */
  319. extern FILE * in_image;
  320. extern int
  321. DECL(open_merge_image,(char * path)); 
  322. extern struct iso_directory_record *
  323. DECL(merge_isofs,(char * path)); 
  324. extern int DECL(free_mdinfo, (struct directory_entry **, int len));
  325. extern struct directory_entry ** 
  326. DECL(read_merging_directory,(struct iso_directory_record *, int*));
  327. extern void 
  328. DECL(merge_remaining_entries, (struct directory *, 
  329.        struct directory_entry **, int));
  330. extern int 
  331. DECL(merge_previous_session, (struct directory *, 
  332.       struct iso_directory_record *));
  333. extern int  DECL(get_session_start, (int *));
  334. /* joliet.c */
  335. int DECL(joliet_sort_tree, (struct directory * node));
  336. /* match.c */
  337. extern int DECL(matches, (char *));
  338. extern int DECL(add_match, (char *));
  339. /* files.c */
  340. struct dirent * DECL(readdir_add_files, (char **, char *, DIR *));
  341. /* */
  342. extern int DECL(iso9660_file_length,(const char* name, 
  343.        struct directory_entry * sresult, int flag));
  344. extern int DECL(iso9660_date,(char *, time_t));
  345. extern void DECL(add_hash,(struct directory_entry *));
  346. extern struct file_hash * DECL(find_hash,(dev_t, ino_t));
  347. extern void DECL(add_directory_hash,(dev_t, ino_t));
  348. extern struct file_hash * DECL(find_directory_hash,(dev_t, ino_t));
  349. extern void DECL (flush_file_hash, (void));
  350. extern int DECL(delete_file_hash,(struct directory_entry *));
  351. extern struct directory_entry * DECL(find_file_hash,(char *));
  352. extern void DECL(add_file_hash,(struct directory_entry *));
  353. extern int DECL(generate_rock_ridge_attributes,(char *, char *,
  354.   struct directory_entry *, 
  355.   struct stat *, struct stat *,
  356.   int  deep_flag));
  357. extern char * DECL(generate_rr_extension_record,(char * id,  char  * descriptor,
  358.     char * source, int  * size));
  359. extern int    DECL(check_prev_session, (struct directory_entry **, int len,
  360.      struct directory_entry *,
  361.      struct stat *,
  362.      struct stat *,
  363.      struct directory_entry **));
  364. #ifdef USE_SCG
  365. /* scsi.c */
  366. #ifdef __STDC__
  367. extern int readsecs(int startsecno, void *buffer, int sectorcount);
  368. extern int scsidev_open(char *path);
  369. #else
  370. extern int readsecs();
  371. extern int scsidev_open();
  372. #endif
  373. #endif
  374. extern char * extension_record;
  375. extern int extension_record_extent;
  376. extern int n_data_extents;
  377. /* These are a few goodies that can be specified on the command line, and  are
  378.    filled into the root record */
  379. extern char * preparer;
  380. extern char * publisher;
  381. extern char * copyright;
  382. extern char * biblio;
  383. extern char * abstract;
  384. extern char * appid;
  385. extern char * volset_id;
  386. extern char * system_id;
  387. extern char * volume_id;
  388. extern char * boot_catalog;
  389. extern char * boot_image;
  390. extern char * genboot_image;
  391. extern int volume_set_size;
  392. extern int volume_sequence_number;
  393. extern void * DECL(e_malloc,(size_t));
  394. #define SECTOR_SIZE (2048)
  395. #define ROUND_UP(X)    ((X + (SECTOR_SIZE - 1)) & ~(SECTOR_SIZE - 1))
  396. #define NEED_RE 1
  397. #define NEED_PL  2
  398. #define NEED_CL 4
  399. #define NEED_CE 8
  400. #define NEED_SP 16
  401. #define PREV_SESS_DEV (sizeof(dev_t) >= 4 ? 0x7ffffffd : 0x7ffd)
  402. #define TABLE_INODE (sizeof(ino_t) >= 4 ? 0x7ffffffe : 0x7ffe)
  403. #define UNCACHED_INODE (sizeof(ino_t) >= 4 ? 0x7fffffff : 0x7fff)
  404. #define UNCACHED_DEVICE (sizeof(dev_t) >= 4 ? 0x7fffffff : 0x7fff)
  405. #ifdef VMS
  406. #define STAT_INODE(X) (X.st_ino[0])
  407. #define PATH_SEPARATOR ']'
  408. #define SPATH_SEPARATOR ""
  409. #else
  410. #define STAT_INODE(X) (X.st_ino)
  411. #define PATH_SEPARATOR '/'
  412. #define SPATH_SEPARATOR "/"
  413. #endif
  414. /*
  415.  * When using multi-session, indicates that we can reuse the
  416.  * TRANS.TBL information for this directory entry.  If this flag
  417.  * is set for all entries in a directory, it means we can just
  418.  * reuse the TRANS.TBL and not generate a new one.
  419.  */
  420. #define SAFE_TO_REUSE_TABLE_ENTRY  0x01
  421. #define DIR_HAS_DOT    0x02
  422. #define DIR_HAS_DOTDOT    0x04
  423. #define INHIBIT_JOLIET_ENTRY    0x08
  424. #define INHIBIT_RR_ENTRY    0x10
  425. #define RELOCATED_DIRECTORY    0x20
  426. #define INHIBIT_ISO9660_ENTRY    0x40
  427. #define MEMORY_FILE    0x80
  428. /*
  429.  * Volume sequence number to use in all of the iso directory records.
  430.  */
  431. #define DEF_VSN 1
  432. /*
  433.  * Make sure we have a definition for this.  If not, take a very conservative
  434.  * guess.  From what I can tell SunOS is the only one with this trouble.
  435.  */
  436. #ifndef NAME_MAX
  437. #ifdef FILENAME_MAX
  438. #define NAME_MAX FILENAME_MAX
  439. #else
  440. #define NAME_MAX 128
  441. #endif
  442. #endif
  443. /*
  444.  * XXX JS: Some structures have odd lengths!
  445.  * Some compilers (e.g. on Sun3/mc68020) padd the structures to even length.
  446.  * For this reason, we cannot use sizeof (struct iso_path_table) or
  447.  * sizeof (struct iso_directory_record) to compute on disk sizes.
  448.  * Instead, we use offsetof(..., name) and add the name size.
  449.  * See iso9660.h
  450.  */
  451. #ifndef offsetof
  452. #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
  453. #endif