ReactOS 0.4.15-dev-7953-g1f49173
mkisofs.c
Go to the documentation of this file.
1/* @(#)mkisofs.c 1.289 17/01/05 joerg */
2#include <schily/mconfig.h>
3#ifndef lint
4static UConst char sccsid[] =
5 "@(#)mkisofs.c 1.289 17/01/05 joerg";
6#endif
7/*
8 * Program mkisofs.c - generate iso9660 filesystem based upon directory
9 * tree on hard disk.
10 *
11 * Written by Eric Youngdale (1993).
12 *
13 * Copyright 1993 Yggdrasil Computing, Incorporated
14 * Copyright (c) 1997-2017 J. Schilling
15 *
16 * This program is free software; you can redistribute it and/or modify
17 * it under the terms of the GNU General Public License as published by
18 * the Free Software Foundation; either version 2, or (at your option)
19 * any later version.
20 *
21 * This program is distributed in the hope that it will be useful,
22 * but WITHOUT ANY WARRANTY; without even the implied warranty of
23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 * GNU General Public License for more details.
25 *
26 * You should have received a copy of the GNU General Public License
27 * along with this program; if not, write to the Free Software
28 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
29 */
30
31/* APPLE_HYB James Pearson j.pearson@ge.ucl.ac.uk 22/2/2000 */
32/* MAC UDF images by HELIOS Software GmbH support@helios.de */
33/* HFS+ by HELIOS Software GmbH support@helios.de */
34
35/* DUPLICATES_ONCE Alex Kopylov cdrtools@bootcd.ru 19.06.2004 */
36
37#ifdef USE_FIND
38#include <schily/walk.h>
39#include <schily/find.h>
40#endif
41#include "mkisofs.h"
42#include "rock.h"
43#include <schily/errno.h>
44#include <schily/time.h>
45#include <schily/fcntl.h>
46#include <schily/ctype.h>
47#include "match.h"
48#include <schily/schily.h>
49#include <schily/nlsdefs.h>
50#include <schily/checkerr.h>
51#ifdef UDF
52#include "udf.h"
53#endif
54
55#include <schily/io.h> /* for setmode() prototype */
56#include <schily/getargs.h>
57
58#ifdef VMS
59#include "vms.h"
60#endif
61
62#ifdef no_more_needed
63#include <schily/resource.h>
64#endif /* no_more_needed */
65
66#include "../cdrecord/version.h"
67
70
72
73char *outfile;
75UInt32_t next_extent = 0;
76UInt32_t last_extent = 0;
77UInt32_t session_start = 0;
78unsigned int path_table_size = 0;
79unsigned int path_table[4] = {0, };
80unsigned int path_blocks = 0;
81
82
83unsigned int jpath_table_size = 0;
84unsigned int jpath_table[4] = {0, };
85unsigned int jpath_blocks = 0;
86
89
96
97/* These variables are associated with command line options */
104int load_addr = 0;
105int load_size = 0;
111int use_XA = 0;
112int osecsize = 0; /* Output-sector size, 0 means default secsize 2048 */
114int jlen = JMAX; /* maximum Joliet file name length */
115/*
116 * Verbose levels currently used:
117 *
118 * 1+ Boot information
119 * 1+ Rcfile information
120 * 1+ Name mapping information
121 * 1+ Progress information
122 * 2+ Version informaton
123 * 2+ Output Extent (of_write) information
124 * 2+ PReP boot information
125 * 3+ HFS warnings
126 * 3+ Dump dirtree
127 */
128int verbose = 1;
129int debug = 0;
130int gui = 0;
131BOOL legacy = FALSE; /* Implement legacy support for historic CLI */
132int all_files = 1; /* New default is to include all files */
133BOOL Hflag = FALSE; /* Follow links on cmdline (-H) */
134BOOL follow_links = FALSE; /* Follow all links (-L) */
135#if defined(__MINGW32__) || defined(_MSC_VER)
136/*
137 * Never cache inodes on DOS or Win-DOS.
138 */
139int cache_inodes = 0;
140#else
141int cache_inodes = -1; /* Cache inodes if OS has unique inodes */
142#endif
143int rationalize = 0; /* Need to call stat_fix() */
148uid_t uid_to_use = 0; /* when rationalizing uid */
149gid_t gid_to_use = 0; /* when rationalizing gid */
150int filemode_to_use = 0; /* if non-zero, when rationalizing file mode */
151int dirmode_to_use = 0; /* if non-zero, when rationalizing dir mode */
152int new_dir_mode = 0555; /* neither -new-dir-mode nor -dir-mode used */
154int dopad = 1; /* Now default to do padding */
157char *icharset = NULL; /* input charset to convert to UNICODE */
158char *ocharset = NULL; /* output charset to convert from UNICODE */
171int ucs_level = 3; /* We now have Unicode tables so use level 3 */
174/* -------------------------------------------------------------------------- */
175char *merge_image; /* CLI Parameter for -M option */
176char *check_image; /* CLI Parameter for -check-session option */
177char *reloc_root = NULL; /* CLI Parameter for -root option */
178char *reloc_old_root = NULL; /* CLI Parameter for -oldroot option */
179extern char *cdrecord_data; /* CLI Parameter for -C option */
180int disable_deep_reloc; /* CLI Parameter for -D option */
181char *dirmode_str; /* CLI Parameter for -dir-mode option */
182char *filemode_str; /* CLI Parameter for -file-mode option */
183char *gid_str; /* CLI Parameter for -gid option */
184int help; /* CLI Parameter for -help option */
185int joliet_long; /* CLI Parameter for -joliet-long option */
186char *jcharset; /* CLI Parameter for -jcharset option */
187int max_filenames; /* CLI Parameter for -max-iso9660-filenames option */
188char *log_file; /* CLI Parameter for -log-file option */
189char *new_dirmode_str; /* CLI Parameter for -new-dir-mode option */
190char *pathnames; /* CLI Parameter for -help option */
191int rationalize_rr; /* CLI Parameter for -path-list option */
192char *sectype; /* CLI Parameter for -s option */
193char *uid_str; /* CLI Parameter for -uid option */
194int untranslated_filenames; /* CLI Parameter for -U option */
195int pversion; /* CLI Parameter for -version option */
196int rationalize_xa; /* CLI Parameter for -xa option */
197ldate modification_date; /* CLI Parameter for -modification-date */
198#ifdef APPLE_HYB
199char *afpfile = ""; /* CLI Parameter for -map option */
200char *root_info; /* CLI Parameter for -root-info option */
201#endif
202BOOL nodesc = FALSE; /* Whether not to descend directories */
203#ifdef USE_FIND
204BOOL dofind = FALSE; /* -find option found */
205int find_ac = 0; /* ac past -find option */
206char *const *find_av = NULL; /* av past -find option */
207int find_pac = 0; /* ac for first find primary */
208char *const *find_pav = NULL; /* av for first find primary */
209findn_t *find_node; /* syntaxtree from find_parse() */
210void *plusp; /* residual for -exec ...{} + */
211int find_patlen; /* len for -find pattern state */
212
213LOCAL int walkflags = WALK_CHDIR | WALK_PHYS | WALK_NOEXIT;
214LOCAL int maxdepth = -1;
215LOCAL int mindepth = -1;
216EXPORT struct WALK walkstate;
217#else
219#endif
220
221extern time_t begun;
222extern struct timeval tv_begun;
223
225
229
230int use_graft_ptrs; /* Use graft points */
231int match_igncase; /* Ignore case with -exclude-list and -hide* */
232int jhide_trans_tbl; /* Hide TRANS.TBL from Joliet tree */
233int hide_rr_moved; /* Name RR_MOVED .rr_moved in Rock Ridge tree */
234int omit_period = 0; /* Violates iso9660, but these are a pain */
235int transparent_compression = 0; /* So far only works with linux */
236int omit_version_number = 0; /* May violate iso9660, but noone uses vers */
237int no_rr = 0; /* Do not use RR attributes from old session */
238int force_rr = 0; /* Force to use RR attributes from old session */
239Uint RR_relocation_depth = 6; /* Violates iso9660, but most systems work */
240int do_largefiles = 0; /* Whether to allow multi-extent files */
241off_t maxnonlarge = (off_t)0xFFFFFFFF;
243int iso9660_namelen = LEN_ISONAME; /* 31 characters, may be set to 37 */
244int full_iso9660_filenames = 0; /* Full 31 character iso9660 filenames */
245int nolimitpathtables = 0; /* Don't limit size of pathtable. Violates iso9660 */
246int relaxed_filenames = 0; /* For Amiga. Disc will not work with DOS */
247int allow_lowercase = 0; /* Allow lower case letters */
248int no_allow_lowercase = 0; /* Do not allow lower case letters */
249int allow_multidot = 0; /* Allow more than on dot in filename */
250int iso_translate = 1; /* 1 == enables '#', '-' and '~' removal */
251int allow_leading_dots = 0; /* DOS cannot read names with leading dots */
252#ifdef VMS
253int use_fileversion = 1; /* Use file version # from filesystem */
254#else
255int use_fileversion = 0; /* Use file version # from filesystem */
256#endif
257int split_SL_component = 1; /* circumvent a bug in the SunOS driver */
258int split_SL_field = 1; /* circumvent a bug in the SunOS */
259char *trans_tbl; /* default name for translation table */
260int stream_media_size = 0; /* # of blocks on the media */
261char *stream_filename; /* Default stream file name */
262
263#ifdef APPLE_HYB
264int donotwrite_macpart = 0; /* Do not write "hfs" hybrid with UDF */
265int apple_hyb = 0; /* -hfs HFS hybrid flag */
266int no_apple_hyb = 0; /* -no-hfs HFS hybrid flag */
267int apple_ext = 0; /* create HFS extensions flag */
268int apple_both = 0; /* common flag (for above) */
269int hfs_extra = 0; /* extra HFS blocks added to end of ISO vol */
270int use_mac_name = 0; /* use Mac name for ISO/Joliet/RR flag */
271hce_mem *hce; /* libhfs/mkisofs extras */
272char *hfs_boot_file = 0; /* name of HFS boot file */
273int gen_pt = 0; /* generate HFS partition table */
274char *autoname = 0; /* AutoStart filename */
275char *magic_file = 0; /* name of magic file */
276int probe = 0; /* search files for HFS/Unix type */
277int nomacfiles = 0; /* don't look for Mac/Unix files */
278int hfs_select = 0; /* Mac/Unix types to select */
279int create_dt = 1; /* create the Desktp files */
280int afe_size = 0; /* Apple File Exchange block size */
281int hfs_last = MAG_LAST; /* process magic file after map file */
282char *deftype; /* default Apple TYPE */
283char *defcreator; /* default Apple CREATOR */
284char *hfs_volume_id = NULL; /* HFS volume ID */
285int icon_pos = 0; /* Keep icon position */
286char *hfs_icharset = NULL; /* input HFS charset name */
287char *hfs_ocharset = NULL; /* output HFS charset name */
288int hfs_lock = 1; /* lock HFS volume (read-only) */
289char *hfs_bless = NULL; /* name of folder to 'bless' (System Folder) */
290char *hfs_parms = NULL; /* low level HFS parameters */
291
292#ifdef PREP_BOOT
293char *prep_boot_image[4];
294int use_prep_boot = 0;
295int use_chrp_boot = 0;
296#endif /* PREP_BOOT */
297#else /* APPLE_HYB */
298int donotwrite_macpart = 1; /* Do not write "hfs" hybrid with UDF */
299#endif /* APPLE_HYB */
300
301#ifdef UDF
302int rationalize_udf = 0; /* -udf (rationalized UDF) */
303int use_udf = 0; /* -udf or -UDF */
304int create_udfsymlinks = 1; /* include symlinks in UDF */
305#endif
306
307#ifdef DVD_AUD_VID
308int dvd_audio = 0;
309int dvd_hybrid = 0;
310int dvd_video = 0;
311int dvd_aud_vid_flag = DVD_SPEC_NONE;
312#endif
313
314#ifdef SORTING
315int do_sort = 0; /* sort file data */
316#endif /* SORTING */
317
318/*
319 * inode numbers for zero sized files start from this number and count
320 * backwards. This is done to allow unique inode numbers even on multi-session
321 * disks.
322 */
324BOOL correct_inodes = TRUE; /* TRUE: add a "correct inodes" fingerprint */
325BOOL rrip112 = TRUE; /* TRUE: create Rock Ridge V 1.12 */
326BOOL long_rr_time = FALSE; /* TRUE: use long (17 Byte) time format */
327
328#ifdef DUPLICATES_ONCE
329int duplicates_once = 0; /* encode duplicate files once */
330#endif
331
332siconvt_t *in_nls = NULL; /* input UNICODE conversion table */
333siconvt_t *out_nls = NULL; /* output UNICODE conversion table */
334#ifdef APPLE_HYB
335siconvt_t *hfs_inls = NULL; /* input HFS UNICODE conversion table */
336siconvt_t *hfs_onls = NULL; /* output HFS UNICODE conversion table */
337#endif /* APPLE_HYB */
338
339struct rcopts {
340 char *tag;
341 char **variable;
342};
343
344struct rcopts rcopt[] = {
345 {"PREP", &preparer},
346 {"PUBL", &publisher},
347 {"APPI", &appid},
348 {"COPY", &copyright},
349 {"BIBL", &biblio},
350 {"ABST", &abstract},
351 {"VOLS", &volset_id},
352 {"VOLI", &volume_id},
353 {"SYSI", &system_id},
354#ifdef APPLE_HYB
355 {"HFS_TYPE", &deftype},
356 {"HFS_CREATOR", &defcreator},
357#endif /* APPLE_HYB */
358 {NULL, NULL}
359};
360
361#ifdef USE_FIND
362LOCAL int getfind __PR((char *arg, long *valp,
363 int *pac, char *const **pav));
364#endif
365
366LOCAL int getH __PR((const char *arg, void *valp, int *pac, char *const **pav, const char *opt));
367LOCAL int getL __PR((const char *arg, void *valp, int *pac, char *const **pav, const char *opt));
368LOCAL int getP __PR((const char *arg, void *valp, int *pac, char *const **pav, const char *opt));
369LOCAL int dolegacy __PR((const char *arg, void *valp, int *pac, char *const **pav, const char *opt));
370
371LOCAL int get_boot_image __PR((char *opt_arg));
372LOCAL int get_hd_boot __PR((char *opt_arg));
373LOCAL int get_ne_boot __PR((char *opt_arg));
374LOCAL int get_no_boot __PR((char *opt_arg));
375LOCAL int get_boot_addr __PR((char *opt_arg));
376LOCAL int get_boot_size __PR((char *opt_arg));
377LOCAL int get_boot_platid __PR((char *opt_arg));
378LOCAL int get_boot_table __PR((char *opt_arg));
379#ifdef APPLE_HYB
380#ifdef PREP_BOOT
381LOCAL int get_prep_boot __PR((char *opt_arg));
382LOCAL int get_chrp_boot __PR((char *opt_arg));
383#endif
384LOCAL int get_bsize __PR((char *opt_arg));
385
386LOCAL int hfs_cap __PR((void));
387LOCAL int hfs_neta __PR((void));
388LOCAL int hfs_dbl __PR((void));
389LOCAL int hfs_esh __PR((void));
390LOCAL int hfs_fe __PR((void));
391LOCAL int hfs_sgi __PR((void));
392LOCAL int hfs_mbin __PR((void));
393LOCAL int hfs_sgl __PR((void));
394LOCAL int hfs_dave __PR((void));
395LOCAL int hfs_sfm __PR((void));
396LOCAL int hfs_xdbl __PR((void));
397LOCAL int hfs_xhfs __PR((void));
398LOCAL int hfs_nohfs __PR((void));
399#endif /* APPLE_HYB */
400
401LOCAL void ldate_error __PR((char *arg));
402LOCAL char *strntoi __PR((char *p, int n, int *ip));
403LOCAL int mosize __PR((int y, int m));
404LOCAL char *parse_date __PR((char *arg, struct tm *tp));
405LOCAL int get_ldate __PR((char *opt_arg, void *valp));
406
407LOCAL int
409 char *opt_arg;
410{
411 do_sort++; /* We sort bootcat/botimage */
412 use_eltorito++;
413 boot_image = opt_arg; /* pathname of the boot image */
414 /* on disk */
415 if (boot_image == NULL || *boot_image == '\0') {
417 _("Required Eltorito boot image pathname missing\n"));
418 }
420 current_boot_entry->boot_image = boot_image;
421 return (1);
422}
423
424LOCAL int
426 char *opt_arg;
427{
428 use_eltorito++;
431 current_boot_entry->hard_disk_boot = 1;
432 return (1);
433}
434
435LOCAL int
437 char *opt_arg;
438{
439 use_eltorito++;
440 no_emul_boot++;
442 current_boot_entry->no_emul_boot = 1;
443 return (1);
444}
445
446LOCAL int
448 char *opt_arg;
449{
450 use_eltorito++;
451 not_bootable++;
453 current_boot_entry->not_bootable = 1;
454 return (1);
455}
456
457LOCAL int
459 char *opt_arg;
460{
461 long val;
462 char *ptr;
463
464 use_eltorito++;
465 val = strtol(opt_arg, &ptr, 0);
466 if (*ptr || val < 0 || val >= 0x10000) {
467 comerrno(EX_BAD, _("Boot image load address invalid.\n"));
468 }
469 load_addr = val;
471 current_boot_entry->load_addr = load_addr;
472 return (1);
473}
474
475LOCAL int
477 char *opt_arg;
478{
479 long val;
480 char *ptr;
481
482 use_eltorito++;
483 val = strtol(opt_arg, &ptr, 0);
484 if (*ptr || val < 0 || val >= 0x10000) {
486 _("Boot image load size invalid.\n"));
487 }
488 load_size = val;
490 current_boot_entry->load_size = load_size;
491 return (1);
492}
493
494LOCAL int
496 char *opt_arg;
497{
498 long val;
499 char *ptr;
500
501 use_eltorito++;
502 if (streql(opt_arg, "x86")) {
504 } else if (streql(opt_arg, "PPC")) {
506 } else if (streql(opt_arg, "Mac")) {
508 } else if (streql(opt_arg, "efi")) {
510 } else {
511 val = strtol(opt_arg, &ptr, 0);
512 if (*ptr || val < 0 || val >= 0x100) {
513 comerrno(EX_BAD, _("Bad boot system ID.\n"));
514 }
515 }
516
517 /*
518 * If there is already a boot entry and the boot file name has been set
519 * for this boot entry and the new platform id differs from the
520 * previous value, we start a new boot section.
521 */
522 if (current_boot_entry &&
523 current_boot_entry->boot_image != NULL &&
524 current_boot_entry->boot_platform != val) {
526 }
529 current_boot_entry->boot_platform = val;
530 return (1);
531}
532
533LOCAL int
535 char *opt_arg;
536{
537 use_eltorito++;
540 current_boot_entry->boot_info_table = 1;
541 return (1);
542}
543
544#ifdef APPLE_HYB
545#ifdef PREP_BOOT
546LOCAL int
547get_prep_boot(opt_arg)
548 char *opt_arg;
549{
550 use_prep_boot++;
551 if (use_prep_boot > 4 - use_chrp_boot) {
553 _("Maximum of 4 PRep+CHRP partition entries are allowed\n"));
554 }
555 /* pathname of the boot image on cd */
556 prep_boot_image[use_prep_boot - 1] = opt_arg;
557 if (prep_boot_image[use_prep_boot - 1] == NULL) {
559 _("Required PReP boot image pathname missing\n"));
560 }
561 return (1);
562}
563
564LOCAL int
565get_chrp_boot(opt_arg)
566 char *opt_arg;
567{
568 if (use_chrp_boot)
569 return (1); /* silently allow duplicates */
570 use_chrp_boot = 1;
571 if (use_prep_boot > 3) {
573 _("Maximum of 4 PRep+CHRP partition entries are allowed\n"));
574 }
575 return (1);
576}
577#endif /* PREP_BOOT */
578
579
580LOCAL int
581get_bsize(opt_arg)
582 char *opt_arg;
583{
584 afe_size = atoi(opt_arg);
585 hfs_select |= DO_FEU;
586 hfs_select |= DO_FEL;
587 return (1);
588}
589
590LOCAL int
591hfs_cap()
592{
593 hfs_select |= DO_CAP;
594 return (1);
595}
596
597LOCAL int
598hfs_neta()
599{
600 hfs_select |= DO_NETA;
601 return (1);
602}
603
604LOCAL int
605hfs_dbl()
606{
607 hfs_select |= DO_DBL;
608 return (1);
609}
610
611LOCAL int
612hfs_esh()
613{
614 hfs_select |= DO_ESH;
615 return (1);
616}
617
618LOCAL int
619hfs_fe()
620{
621 hfs_select |= DO_FEU;
622 hfs_select |= DO_FEL;
623 return (1);
624}
625
626LOCAL int
627hfs_sgi()
628{
629 hfs_select |= DO_SGI;
630 return (1);
631}
632
633LOCAL int
634hfs_mbin()
635{
636 hfs_select |= DO_MBIN;
637 return (1);
638}
639
640LOCAL int
641hfs_sgl()
642{
643 hfs_select |= DO_SGL;
644 return (1);
645}
646
647LOCAL int
648hfs_dave()
649{
650 hfs_select |= DO_DAVE;
651 return (1);
652}
653
654
655LOCAL int
656hfs_sfm()
657{
658 hfs_select |= DO_SFM;
659 return (1);
660}
661
662LOCAL int
663hfs_xdbl()
664{
665 hfs_select |= DO_XDBL;
666 return (1);
667}
668
669LOCAL int
670hfs_xhfs()
671{
672#ifdef IS_MACOS_X
673 hfs_select |= DO_XHFS;
674#else
676 _("Warning: --osx-hfs only works on MacOS X ... ignoring\n"));
677#endif
678 return (1);
679}
680
681LOCAL int
682hfs_nohfs()
683{
684 no_apple_hyb = 1;
685 return (1);
686}
687
688#endif /* APPLE_HYB */
689
690LOCAL void
692 char *arg;
693{
694 comerrno(EX_BAD, _("Ilegal date specification '%s'.\n"), arg);
695}
696
697LOCAL char *
699 char *p;
700 int n;
701 int *ip;
702{
703 int i = 0;
704 int digits = 0;
705 int c;
706
707 while (*p) {
708 if (digits >= n)
709 break;
710 c = *p;
711 if (c < '0' || c > '9')
712 break;
713 p++;
714 digits++;
715 i *= 10;
716 i += c - '0';
717 }
718 *ip = i;
719
720 return (p);
721}
722
723#define dysize(A) (((A)%4)? 365 : (((A)%100) == 0 && ((A)%400)) ? 365 : 366)
724
725static int dmsize[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
726
727LOCAL int
729 int y;
730 int m;
731{
732
733 if (m == 1 && dysize(y) == 366)
734 return (29);
735 return (dmsize[m]);
736}
737
738LOCAL char *
740 char *arg;
741 struct tm *tp;
742{
743 char *oarg = arg;
744 char *p;
745
746 tp->tm_mon = tp->tm_hour = tp->tm_min = tp->tm_sec = 0;
747 tp->tm_mday = 1;
748 tp->tm_isdst = -1;
749
750 p = strchr(arg, '/');
751 if (p == NULL)
752 p = strchr(arg, '-');
753 if (p) {
754 if ((p - arg) != 2 && (p - arg) != 4)
755 ldate_error(oarg);
756 p = strntoi(arg, 4, &tp->tm_year);
757 if ((p - arg) != 2 && (p - arg) != 4)
758 ldate_error(oarg);
759 if ((p - arg) == 2) {
760 if (tp->tm_year < 69)
761 tp->tm_year += 100;
762 } else {
763 tp->tm_year -= 1900;
764 }
765 if (*p == '/' || *p == '-')
766 p++;
767 } else if (strlen(arg) < 4) {
768 ldate_error(oarg);
769 } else {
770 p = strntoi(arg, 4, &tp->tm_year);
771 if ((p - arg) != 4)
772 ldate_error(oarg);
773 tp->tm_year -= 1900;
774 }
775 if (*p == '\0' || strchr(".+-", *p))
776 return (p);
777 arg = p;
778 p = strntoi(arg, 2, &tp->tm_mon);
779 if ((p - arg) != 2)
780 ldate_error(oarg);
781 tp->tm_mon -= 1;
782 if (tp->tm_mon < 0 || tp->tm_mon >= 12)
783 ldate_error(oarg);
784 if (*p == '/' || *p == '-')
785 p++;
786 if (*p == '\0' || strchr(".+-", *p))
787 return (p);
788 arg = p;
789 p = strntoi(arg, 2, &tp->tm_mday);
790 if ((p - arg) != 2)
791 ldate_error(oarg);
792 if (tp->tm_mday < 1 || tp->tm_mday > mosize(tp->tm_year+1900, tp->tm_mon))
793 ldate_error(oarg);
794 if (*p == ' ')
795 p++;
796 if (*p == '\0' || strchr(".+-", *p))
797 return (p);
798 arg = p;
799 p = strntoi(arg, 2, &tp->tm_hour);
800 if ((p - arg) != 2)
801 ldate_error(oarg);
802 if (tp->tm_hour > 23)
803 ldate_error(oarg);
804 if (*p == ':')
805 p++;
806 if (*p == '\0' || strchr(".+-", *p))
807 return (p);
808 arg = p;
809 p = strntoi(arg, 2, &tp->tm_min);
810 if ((p - arg) != 2)
811 ldate_error(oarg);
812 if (tp->tm_min > 59)
813 ldate_error(oarg);
814 if (*p == ':')
815 p++;
816 if (*p == '\0' || strchr(".+-", *p))
817 return (p);
818 arg = p;
819 p = strntoi(arg, 2, &tp->tm_sec);
820 if ((p - arg) != 2)
821 ldate_error(oarg);
822 if (tp->tm_sec > 61)
823 ldate_error(oarg);
824 return (p);
825}
826
827/*
828 * Parse a date spec similar to:
829 * YYYY[MM[DD[HH[MM[SS]]]]][.hh][+-GHGM]
830 */
831LOCAL int
832get_ldate(opt_arg, valp)
833 char *opt_arg;
834 void *valp;
835{
836 time_t t;
837 int usec = 0;
838 int gmtoff = -100;
839 struct tm tm;
840 char *p;
841 char *arg;
842
843 p = parse_date(opt_arg, &tm);
844 if (*p == '.') {
845 p++;
846 arg = p;
847 p = strntoi(arg, 2, &usec);
848 if ((p - arg) != 2)
849 ldate_error(opt_arg);
850 if (usec > 99)
851 ldate_error(opt_arg);
852 usec *= 10000;
853 }
854 if (*p == ' ')
855 p++;
856 if (*p == '+' || *p == '-') {
857 int i;
858 char *s = p++;
859
860 arg = p;
861 p = strntoi(arg, 2, &gmtoff);
862 if ((p - arg) != 2)
863 ldate_error(opt_arg);
864 arg = p;
865 p = strntoi(arg, 2, &i);
866 if ((p - arg) != 2)
867 ldate_error(opt_arg);
868 if (i > 59)
869 ldate_error(opt_arg);
870 gmtoff *= 60;
871 gmtoff += i;
872 if (gmtoff % 15)
873 ldate_error(opt_arg);
874 if (*s == '-')
875 gmtoff *= -1;
876 gmtoff /= 15;
877 if (gmtoff < -48 || gmtoff > 52)
878 ldate_error(opt_arg);
879 }
880 if (*p != '\0')
881 ldate_error(opt_arg);
882
883 seterrno(0);
884 t = mktime(&tm);
885 if (t == -1 && geterrno() != 0)
886 comerr(_("Date '%s' is out of range.\n"), opt_arg);
887
888 ((ldate *)valp)->l_sec = t;
889 ((ldate *)valp)->l_usec = usec;
890 ((ldate *)valp)->l_gmtoff = gmtoff;
891
892 return (1);
893}
894
895#ifdef USE_FIND
896/* ARGSUSED */
897LOCAL int
898getfind(arg, valp, pac, pav)
899 char *arg;
900 long *valp; /* Not used until we introduce a ptr to opt struct */
901 int *pac;
902 char *const **pav;
903{
904 dofind = TRUE;
905 find_ac = *pac;
906 find_av = *pav;
907 find_ac--, find_av++;
908 return (NOARGS);
909}
910#endif
911
912/* ARGSUSED */
913LOCAL int
914getH(arg, valp, pac, pav, opt) /* Follow symlinks encountered on cmdline */
915 const char *arg;
916 void *valp;
917 int *pac;
918 char *const **pav;
919 const char *opt;
920{
921/*error("getH\n");*/
922 if (opt[0] == '-' && opt[1] == 'H' && opt[2] == '\0') {
923#ifdef APPLE_HYB
924 if (legacy) {
925 errmsgno(EX_BAD, _("The option '-H' is deprecated since 2002.\n"));
926 errmsgno(EX_BAD, _("The option '-H' was disabled in 2006.\n"));
927 errmsgno(EX_BAD, _("Use '-map' instead of '-H' as documented instead of using the legacy mode.\n"));
928 afpfile = (char *)arg;
929 return (1);
930 }
931#endif
932 return (BADFLAG); /* POSIX -H is not yet active */
933 }
935 Hflag = TRUE;
936#ifdef USE_FIND
937 *(int *)valp |= WALK_ARGFOLLOW;
938#endif
939 return (1);
940}
941
942/* ARGSUSED */
943LOCAL int
944getL(arg, valp, pac, pav, opt) /* Follow all symlinks */
945 const char *arg;
946 void *valp;
947 int *pac;
948 char *const **pav;
949 const char *opt;
950{
951/*error("getL\n");*/
952 if (opt[0] == '-' && opt[1] == 'L' && opt[2] == '\0') {
953 if (legacy) {
954 errmsgno(EX_BAD, _("The option '-L' is deprecated since 2002.\n"));
955 errmsgno(EX_BAD, _("The option '-L' was disabled in 2006.\n"));
957 _("Use '-allow-leading-dots' instead of '-L' as documented instead of using the legacy mode.\n"));
959 return (1);
960 }
961 return (BADFLAG); /* POSIX -L is not yet active */
962 }
964 Hflag = FALSE;
965#ifdef USE_FIND
966 *(int *)valp |= WALK_ALLFOLLOW;
967#endif
968 return (1);
969}
970
971/* ARGSUSED */
972LOCAL int
973getP(arg, valp, pac, pav, opt) /* Do not follow symlinks */
974 const char *arg;
975 void *valp;
976 int *pac;
977 char *const **pav;
978 const char *opt;
979{
980/*error("getP\n");*/
981 if (opt[0] == '-' && opt[1] == 'P' && opt[2] == '\0') {
982 if (legacy) {
983 errmsgno(EX_BAD, _("The option '-P' is deprecated since 2002.\n"));
984 errmsgno(EX_BAD, _("The option '-P' was disabled in 2006.\n"));
985 errmsgno(EX_BAD, _("Use '-publisher' instead of '-P' as documented instead of using the legacy mode.\n"));
986 publisher = (char *)arg;
987 return (1);
988 }
989 return (BADFLAG); /* POSIX -P is not yet active */
990 }
992 Hflag = FALSE;
993#ifdef USE_FIND
994 *(int *)valp &= ~(WALK_ARGFOLLOW | WALK_ALLFOLLOW);
995#endif
996 return (1);
997}
998
1000/* ARGSUSED */
1001LOCAL int
1002dolegacy(arg, valp, pac, pav, opt) /* Follow symlinks encountered on cmdline */
1003 const char *arg;
1004 void *valp;
1005 int *pac;
1006 char *const **pav;
1007 const char *opt;
1008{
1009 legacy = TRUE;
1010#ifdef APPLE_HYB
1011 gl_flags[2].ga_format = "H&"; /* Apple Hybrid "-map" */
1012#endif
1013#ifdef OPT_L_HAS_ARG /* never ;-) */
1014 gl_flags[4].ga_format = "L&"; /* -allow-leading-dots */
1015#endif
1016 gl_flags[6].ga_format = "P&"; /* -publisher */
1017 return (1);
1018}
1019
1021 /*
1022 * The long option information.
1023 */
1025 /*
1026 * The documentation string. If this is NULL or empty, this is a
1027 * synonym for the previous option.
1028 *
1029 * If the string starts with a '-', the (long) option is a
1030 * double dash option.
1031 *
1032 * If the next character in the string is a ^A (\1), then the following
1033 * characters are the argument name for the option. The arg string ends
1034 * before a \1 or a \2 is seen. A \1 is skipped.
1035 *
1036 * The rest of the string is the real documentation string. If it
1037 * starts with \2, then the option is hidden from the online help.
1038 */
1039 const char *doc;
1040};
1041
1042
1044
1046{
1047#ifdef USE_FIND
1048 {{"find~", NULL, (getpargfun)getfind },
1049 __("\1file... [find expr.]\1Option separator: Use find command line to the right")},
1050#endif
1051 /*
1052 * The options -H/-L/-P did have different meaning in old releases of
1053 * mkisofs. In October 2002, mkisofs introduced a warning that the
1054 * short options -H/-L/-P should not be used with the old meaning
1055 * anymore. The long options should be used instead. The options
1056 * -H/-L/-P previously have been associated with the following long
1057 * options:
1058 *
1059 * -H -map 2000..2002
1060 * -L -allow-leading-dots 1995..2002
1061 * -P -publisher 1993..2002
1062 *
1063 * Since December 2006, the short options -H/-L/-P have been disabled
1064 * for their old meaning.
1065 *
1066 * Warning: for the -legacy mode, the entries for -H/-L/-P need to stay
1067 * at their current index in mki_options[] or dolegacy() needs to be
1068 * changed to fit the modification.
1069 */
1070 {{"posix-H~", &walkflags, getH },
1071 __("Follow symbolic links encountered on command line")},
1072 {{"H~", &walkflags, getH },
1073#ifdef LATER
1074 NULL},
1075#else
1076 __("\2")},
1077#endif
1078 {{"posix-L~", &walkflags, getL },
1079 __("Follow all symbolic links")},
1080 {{"L~", &walkflags, getL },
1081#ifdef LATER
1082 NULL},
1083#else
1084 __("\2")},
1085#endif
1086 {{"posix-P~", &walkflags, getP },
1087 __("Do not follow symbolic links (default)")},
1088 {{"P~", &walkflags, getP },
1089#ifdef LATER
1090 NULL},
1091#else
1092 __("\2")},
1093#endif
1094
1095 {{"abstract*", &abstract },
1096 __("\1FILE\1Set Abstract filename")},
1097 {{"A*,appid*", &appid },
1098 __("\1ID\1Set Application ID")},
1099 {{"biblio*", &biblio },
1100 __("\1FILE\1Set Bibliographic filename")},
1101 /*
1102 * If this includes UWIN, we need to modify the condition.
1103 */
1104#if !defined(__MINGW32__) && !defined(_MSC_VER)
1105 {{"cache-inodes", &cache_inodes },
1106 __("Cache inodes (needed to detect hard links)")},
1107#endif
1108 {{"no-cache-inodes%0", &cache_inodes },
1109 __("Do not cache inodes (if filesystem has no unique inodes)")},
1110 {{"rrip110%0", &rrip112 },
1111 __("Create old Rock Ridge V 1.10")},
1112 {{"rrip112", &rrip112 },
1113 __("Create new Rock Ridge V 1.12 (default)")},
1114#ifdef DUPLICATES_ONCE
1115 {{"duplicates-once", &duplicates_once},
1116 __("Optimize storage by encoding duplicate files once")},
1117#endif
1118 {{"check-oldnames", &check_oldnames },
1119 __("Check all imported ISO9660 names from old session")},
1120 {{"check-session*", &check_image },
1121 __("\1FILE\1Check all ISO9660 names from previous session")},
1122 {{"copyright*", &copyright },
1123 __("\1FILE\1Set Copyright filename")},
1124 {{"debug+", &debug },
1125 __("Set debug flag")},
1126 {{"ignore-error", &ignerr },
1127 __("Ignore errors")},
1128 {{"b& ,eltorito-boot&", NULL, (getpargfun)get_boot_image },
1129 __("\1FILE\1Set El Torito boot image name")},
1130 {{"eltorito-alt-boot~", NULL, (getpargfun)new_boot_entry },
1131 __("Start specifying alternative El Torito boot parameters")},
1132 {{"eltorito-platform&", NULL, (getpargfun)get_boot_platid },
1133 __("\1ID\1Set El Torito platform id for the next boot entry")},
1134 {{"B&,sparc-boot&", NULL, (getpargfun)scan_sparc_boot },
1135 __("\1FILES\1Set sparc boot image names")},
1136 {{"sunx86-boot&", NULL, (getpargfun)scan_sunx86_boot },
1137 __("\1FILES\1Set sunx86 boot image names")},
1138 {{"G*,generic-boot*", &genboot_image },
1139 __("\1FILE\1Set generic boot image name")},
1140 {{"sparc-label&", NULL, (getpargfun)sparc_boot_label },
1141 __("\1label text\1Set sparc boot disk label")},
1142 {{"sunx86-label&", NULL, (getpargfun)sunx86_boot_label },
1143 __("\1label text\1Set sunx86 boot disk label")},
1144 {{"c* ,eltorito-catalog*", &boot_catalog },
1145 __("\1FILE\1Set El Torito boot catalog name")},
1146 {{"C*,cdrecord-params*", &cdrecord_data },
1147 __("\1PARAMS\1Magic paramters from cdrecord")},
1148 {{"d,omit-period", &omit_period },
1149 __("Omit trailing periods from filenames (violates ISO9660)")},
1150 {{"data-change-warn", &data_change_warn },
1151 __("Treat data/size changes as warning only")},
1152 {{"dir-mode*", &dirmode_str },
1153 __("\1mode\1Make the mode of all directories this mode.")},
1154 {{"D,disable-deep-relocation", &disable_deep_reloc },
1155 __("Disable deep directory relocation (violates ISO9660)")},
1156 {{"file-mode*", &filemode_str },
1157 __("\1mode\1Make the mode of all plain files this mode.")},
1158 {{"errctl&", NULL, (getpargfun)errconfig },
1159 __("\1name\1Read error control defs from file or inline.")},
1160 {{"f,follow-links", &follow_links },
1161 __("Follow symbolic links")},
1162 {{"gid*", &gid_str },
1163 __("\1gid\1Make the group owner of all files this gid.")},
1164 {{"graft-points", &use_graft_ptrs },
1165 __("Allow to use graft points for filenames")},
1166 {{"root*", &reloc_root },
1167 __("\1DIR\1Set root directory for all new files and directories")},
1168 {{"old-root*", &reloc_old_root },
1169 __("\1DIR\1Set root directory in previous session that is searched for files")},
1170 {{"help", &help },
1171 __("Print option help")},
1172 {{"hide& ", NULL, (getpargfun)i_add_match },
1173 __("\1GLOBFILE\1Hide ISO9660/RR file")},
1174 {{"hide-list&", NULL, (getpargfun)i_add_list },
1175 __("\1FILE\1File with list of ISO9660/RR files to hide")},
1176 {{"hidden& ", NULL, (getpargfun)h_add_match },
1177 __("\1GLOBFILE\1Set hidden attribute on ISO9660 file")},
1178 {{"hidden-list&", NULL, (getpargfun)h_add_list },
1179 __("\1FILE\1File with list of ISO9660 files with hidden attribute")},
1180 {{"hide-joliet& ", NULL, (getpargfun)j_add_match },
1181 __("\1GLOBFILE\1Hide Joliet file")},
1182 {{"hide-joliet-list&", NULL, (getpargfun)j_add_list },
1183 __("\1FILE\1File with list of Joliet files to hide")},
1184#ifdef UDF
1185 {{"hide-udf& ", NULL, (getpargfun)u_add_match },
1186 __("\1GLOBFILE\1Hide UDF file")},
1187 {{"hide-udf-list&", NULL, (getpargfun)u_add_list },
1188 __("\1FILE\1File with list of UDF files to hide")},
1189#endif
1190 {{"hide-joliet-trans-tbl", &jhide_trans_tbl},
1191 __("Hide TRANS.TBL from Joliet tree")},
1192 {{"hide-rr-moved", &hide_rr_moved },
1193 __("Rename RR_MOVED to .rr_moved in Rock Ridge tree")},
1194 {{"gui", &gui},
1195 __("Switch behaviour for GUI")},
1196 {{"input-charset*", &icharset },
1197 __("\1CHARSET\1Local input charset for file name conversion")},
1198 {{"output-charset*", &ocharset },
1199 __("\1CHARSET\1Output charset for file name conversion")},
1200 {{"iso-level#", &iso9660_level },
1201 __("\1LEVEL\1Set ISO9660 conformance level (1..3) or 4 for ISO9660 version 2")},
1202 {{"J,joliet", &use_Joliet },
1203 __("Generate Joliet directory information")},
1204 {{"joliet-long", &joliet_long },
1205 __("Allow Joliet file names to be 103 Unicode characters")},
1206 {{"jcharset*", &jcharset },
1207 __("\1CHARSET\1Local charset for Joliet directory information")},
1208 {{"l,full-iso9660-filenames", &full_iso9660_filenames },
1209 __("Allow full 31 character filenames for ISO9660 names")},
1210 {{"max-iso9660-filenames", &max_filenames },
1211 __("Allow 37 character filenames for ISO9660 names (violates ISO9660)")},
1212
1213 {{"allow-leading-dots", &allow_leading_dots },
1214 __("Allow ISO9660 filenames to start with '.' (violates ISO9660)")},
1215 {{"ldots", &allow_leading_dots },
1216 __("Allow ISO9660 filenames to start with '.' (violates ISO9660)")},
1217
1218 {{"log-file*", &log_file },
1219 __("\1LOG_FILE\1Re-direct messages to LOG_FILE")},
1220 {{"long-rr-time%1", &long_rr_time },
1221 __("Use long Rock Ridge time format")},
1222 {{"m& ,exclude& ", NULL, (getpargfun)add_match },
1223 __("\1GLOBFILE\1Exclude file name")},
1224 {{"exclude-list&", NULL, (getpargfun)add_list},
1225 __("\1FILE\1File with list of file names to exclude")},
1226
1227 {{"hide-ignorecase", &match_igncase },
1228 __("Ignore case with -exclude-list and -hide* options")},
1229 {{"exclude-ignorecase", &match_igncase },
1230 NULL},
1231
1232 {{"modification-date&", &modification_date, (getpargfun)get_ldate },
1233 __("\1DATE\1Set the modification date field of the PVD")},
1234 {{"nobak%0", &all_files },
1235 __("Do not include backup files")},
1236 {{"no-bak%0", &all_files},
1237 __("Do not include backup files")},
1238 {{"pad", &dopad },
1239 __("Pad output to a multiple of 32k (default)")},
1240 {{"no-pad%0", &dopad },
1241 __("Do not pad output to a multiple of 32k")},
1242 {{"no-limit-pathtables", &nolimitpathtables },
1243 __("Allow more than 65535 parent directories (violates ISO9660)")},
1244 {{"no-long-rr-time%0", &long_rr_time },
1245 __("Use short Rock Ridge time format")},
1246 {{"M*,prev-session*", &merge_image },
1247 __("\1FILE\1Set path to previous session to merge")},
1248 {{"dev*", &merge_image },
1249 __("\1SCSIdev\1Set path to previous session to merge")},
1250 {{"N,omit-version-number", &omit_version_number },
1251 __("Omit version number from ISO9660 filename (violates ISO9660)")},
1252 {{"new-dir-mode*", &new_dirmode_str },
1253 __("\1mode\1Mode used when creating new directories.")},
1254 {{"force-rr", &force_rr },
1255 __("Inhibit automatic Rock Ridge detection for previous session")},
1256 {{"no-rr", &no_rr },
1257 __("Inhibit reading of Rock Ridge attributes from previous session")},
1258 {{"no-split-symlink-components%0", &split_SL_component },
1259 __("Inhibit splitting symlink components")},
1260 {{"no-split-symlink-fields%0", &split_SL_field },
1261 __("Inhibit splitting symlink fields")},
1262 {{"o* ,output* ", &outfile },
1263 __("\1FILE\1Set output file name")},
1264 {{"path-list*", &pathnames },
1265 __("\1FILE\1File with list of pathnames to process")},
1266 {{"p* ,preparer*", &preparer },
1267 __("\1PREP\1Set Volume preparer")},
1268 {{"print-size", &print_size },
1269 __("Print estimated filesystem size and exit")},
1270 {{"publisher*", &publisher },
1271 __("\1PUB\1Set Volume publisher")},
1272 {{"quiet%0", &verbose },
1273 __("Run quietly")},
1274 {{"r,rational-rock", &rationalize_rr },
1275 __("Generate rationalized Rock Ridge directory information")},
1276 {{"R,rock", &use_RockRidge },
1277 __("Generate Rock Ridge directory information")},
1278 {{"s* ,sectype*", &sectype },
1279 __("\1TYPE\1Set output sector type to e.g. data/xa1/raw")},
1280 {{"short-rr-time%0", &long_rr_time },
1281 __("Use short Rock Ridge time format")},
1282
1283#ifdef SORTING
1284 { {"sort&", NULL, add_sort_list },
1285 __("\1FILE\1Sort file content locations according to rules in FILE")},
1286 { {"isort&", NULL, add_sort_list },
1287 __("\1FILE\1Sort file content locations according to rules in FILE (ignore case)")},
1288#endif /* SORTING */
1289
1290 {{"split-output", &split_output },
1291 __("Split output into files of approx. 1GB size")},
1292 {{"stream-file-name*", &stream_filename },
1293 __("\1FILE_NAME\1Set the stream file ISO9660 name (incl. version)")},
1294 {{"stream-media-size#", &stream_media_size },
1295 __("\1#\1Set the size of your CD media in sectors")},
1296 {{"sysid*", &system_id },
1297 __("\1ID\1Set System ID")},
1298 {{"T,translation-table", &generate_tables },
1299 __("Generate translation tables for systems that don't understand long filenames")},
1300 {{"table-name*", &trans_tbl },
1301 __("\1TABLE_NAME\1Translation table file name")},
1302 {{"ucs-level#", &ucs_level },
1303 __("\1LEVEL\1Set Joliet UCS level (1..3)")},
1304
1305#ifdef UDF
1306 {{"udf", &rationalize_udf },
1307 __("Generate rationalized UDF file system")},
1308 {{"UDF", &use_udf },
1309 __("Generate UDF file system")},
1310 {{"udf-symlinks", &create_udfsymlinks },
1311 __("Create symbolic links on UDF image (default)")},
1312 {{"no-udf-symlinks%0", &create_udfsymlinks },
1313 __("Do not reate symbolic links on UDF image")},
1314#endif
1315
1316#ifdef DVD_AUD_VID
1317 {{"dvd-audio", &dvd_audio },
1318 "Generate DVD-Audio compliant UDF file system"},
1319 {{"dvd-hybrid", &dvd_hybrid },
1320 "Generate a hybrid (DVD-Audio and DVD-Video) compliant UDF file system"},
1321 {{"dvd-video", &dvd_video },
1322 __("Generate DVD-Video compliant UDF file system")},
1323#endif
1324
1325 {{"uid*", &uid_str },
1326 __("\1uid\1Make the owner of all files this uid.")},
1327 {{"U,untranslated-filenames", &untranslated_filenames },
1328 /* CSTYLED */
1329 __("Allow Untranslated filenames (for HPUX & AIX - violates ISO9660). Forces -l, -d, -N, -allow-leading-dots, -relaxed-filenames, -allow-lowercase, -allow-multidot")},
1330 {{"relaxed-filenames", &relaxed_filenames },
1331 __("Allow 7 bit ASCII except lower case characters (violates ISO9660)")},
1332 {{"no-iso-translate%0", &iso_translate },
1333 __("Do not translate illegal ISO characters '~', '-' and '#' (violates ISO9660)")},
1334 {{"allow-lowercase", &allow_lowercase },
1335 __("Allow lower case characters in addition to the current character set (violates ISO9660)")},
1336 {{"no-allow-lowercase", &no_allow_lowercase },
1337 __("Do not allow lower case characters in addition to the current character set.")},
1338 {{"+allow-lowercase", &no_allow_lowercase },
1339 NULL},
1340 {{"allow-multidot", &allow_multidot },
1341 __("Allow more than one dot in filenames (e.g. .tar.gz) (violates ISO9660)")},
1342 {{"use-fileversion", &use_fileversion },
1343 __("\1LEVEL\1Use file version # from filesystem")},
1344 {{"v+,verbose+", &verbose },
1345 __("Verbose")},
1346 {{"version", &pversion },
1347 __("Print the current version")},
1348 {{"V*,volid*", &volume_id },
1349 __("\1ID\1Set Volume ID")},
1350 {{"volset* ", &volset_id },
1351 __("\1ID\1Set Volume set ID")},
1352 {{"volset-size#", &volume_set_size },
1353 __("\1#\1Set Volume set size")},
1354 {{"volset-seqno#", &volume_sequence_number },
1355 __("\1#\1Set Volume set sequence number")},
1356 {{"x& ,old-exclude&", NULL, (getpargfun)add_match },
1357 __("\1FILE\1Exclude file name(depreciated)")},
1358 {{"hard-disk-boot~", NULL, (getpargfun)get_hd_boot },
1359 __("Boot image is a hard disk image")},
1360 {{"no-emul-boot~", NULL, (getpargfun)get_ne_boot },
1361 __("Boot image is 'no emulation' image")},
1362 {{"no-boot~", NULL, (getpargfun)get_no_boot },
1363 __("Boot image is not bootable")},
1364 {{"boot-load-seg&", NULL, (getpargfun)get_boot_addr },
1365 __("\1#\1Set load segment for boot image")},
1366 {{"boot-load-size&", NULL, (getpargfun)get_boot_size },
1367 __("\1#\1Set numbers of load sectors")},
1368 {{"boot-info-table~", NULL, (getpargfun)get_boot_table },
1369 __("Patch boot image with info table")},
1370 {{"XA", &use_XA },
1371 __("Generate XA directory attributes")},
1372 {{"xa", &rationalize_xa },
1373 __("Generate rationalized XA directory attributes")},
1374 {{"z,transparent-compression", &transparent_compression },
1375 __("Enable transparent compression of files")},
1376
1377#ifdef APPLE_HYB
1378 {{"hfs-type*", &deftype },
1379 __("\1TYPE\1Set HFS default TYPE")},
1380 {{"hfs-creator", &defcreator },
1381 __("\1CREATOR\1Set HFS default CREATOR")},
1382 {{"g,apple", &apple_ext },
1383 __("Add Apple ISO9660 extensions")},
1384 {{"h,hfs", &apple_hyb },
1385 __("Create ISO9660/HFS hybrid")},
1386 {{"map*", &afpfile },
1387 __("\1MAPPING_FILE\1Map file extensions to HFS TYPE/CREATOR")},
1388 {{"magic*", &magic_file },
1389 __("\1FILE\1Magic file for HFS TYPE/CREATOR")},
1390 {{"probe", &probe },
1391 __("Probe all files for Apple/Unix file types")},
1392 {{"mac-name", &use_mac_name },
1393 __("Use Macintosh name for ISO9660/Joliet/RockRidge file name")},
1394 {{"no-mac-files", &nomacfiles },
1395 __("Do not look for Unix/Mac files (depreciated)")},
1396 {{"boot-hfs-file*", &hfs_boot_file },
1397 __("\1FILE\1Set HFS boot image name")},
1398 {{"part", &gen_pt },
1399 __("Generate HFS partition table")},
1400 {{"cluster-size&", NULL, (getpargfun)get_bsize },
1401 __("\1SIZE\1Cluster size for PC Exchange Macintosh files")},
1402 {{"auto*", &autoname },
1403 __("\1FILE\1Set HFS AutoStart file name")},
1404 {{"no-desktop%0", &create_dt },
1405 __("Do not create the HFS (empty) Desktop files")},
1406 {{"hide-hfs& ", NULL, (getpargfun)hfs_add_match },
1407 __("\1GLOBFILE\1Hide HFS file")},
1408 {{"hide-hfs-list&", NULL, (getpargfun)hfs_add_list },
1409 __("\1FILE\1List of HFS files to hide")},
1410 {{"hfs-volid*", &hfs_volume_id },
1411 __("\1HFS_VOLID\1Volume name for the HFS partition")},
1412 {{"icon-position", &icon_pos },
1413 __("Keep HFS icon position")},
1414 {{"root-info*", &root_info },
1415 __("\1FILE\1finderinfo for root folder")},
1416 {{"input-hfs-charset*", &hfs_icharset },
1417 __("\1CHARSET\1Local input charset for HFS file name conversion")},
1418 {{"output-hfs-charset*", &hfs_ocharset },
1419 __("\1CHARSET\1Output charset for HFS file name conversion")},
1420 {{"hfs-unlock%0", &hfs_lock },
1421 __("Leave HFS Volume unlocked")},
1422 {{"hfs-bless*", &hfs_bless },
1423 __("\1FOLDER_NAME\1Name of Folder to be blessed")},
1424 {{"hfs-parms*", &hfs_parms },
1425 __("\1PARAMETERS\1Comma separated list of HFS parameters")},
1426#ifdef PREP_BOOT
1427 {{"prep-boot&", NULL, (getpargfun)get_prep_boot },
1428 __("\1FILE\1PReP boot image file -- up to 4 are allowed")},
1429 {{"chrp-boot&", NULL, (getpargfun)get_chrp_boot },
1430 __("Add CHRP boot header")},
1431#endif /* PREP_BOOT */
1432 {{"cap~", NULL, (getpargfun)hfs_cap },
1433 __("-Look for AUFS CAP Macintosh files")},
1434 {{"netatalk~", NULL, (getpargfun)hfs_neta},
1435 __("-Look for NETATALK Macintosh files")},
1436 {{"double~", NULL, (getpargfun)hfs_dbl },
1437 __("-Look for AppleDouble Macintosh files")},
1438 {{"ethershare~", NULL, (getpargfun)hfs_esh },
1439 __("-Look for Helios EtherShare Macintosh files")},
1440 {{"exchange~", NULL, (getpargfun)hfs_fe },
1441 __("-Look for PC Exchange Macintosh files")},
1442 {{"sgi~", NULL, (getpargfun)hfs_sgi },
1443 __("-Look for SGI Macintosh files")},
1444 {{"macbin~", NULL, (getpargfun)hfs_mbin },
1445 __("-Look for MacBinary Macintosh files")},
1446 {{"single~", NULL, (getpargfun)hfs_sgl },
1447 __("-Look for AppleSingle Macintosh files")},
1448 {{"ushare~", NULL, (getpargfun)hfs_esh },
1449 __("-Look for IPT UShare Macintosh files")},
1450 {{"xinet~", NULL, (getpargfun)hfs_sgi },
1451 __("-Look for XINET Macintosh files")},
1452 {{"dave~", NULL, (getpargfun)hfs_dave },
1453 __("-Look for DAVE Macintosh files")},
1454 {{"sfm~", NULL, (getpargfun)hfs_sfm },
1455 __("-Look for SFM Macintosh files")},
1456 {{"osx-double~", NULL, (getpargfun)hfs_xdbl },
1457 __("-Look for MacOS X AppleDouble Macintosh files")},
1458 {{"osx-hfs~", NULL, (getpargfun)hfs_xhfs },
1459 __("-Look for MacOS X HFS Macintosh files")},
1460 {{"no-hfs~", NULL, (getpargfun)hfs_nohfs },
1461 __("Do not create ISO9660/HFS hybrid")},
1462#endif /* APPLE_HYB */
1463 {{"legacy~", NULL, dolegacy },
1464 __("\2")},
1465};
1466
1467#define OPTION_COUNT (sizeof mki_options / sizeof (mki_options[0]))
1468
1469LOCAL void read_rcfile __PR((char *appname));
1470LOCAL void susage __PR((int excode));
1471LOCAL void usage __PR((int excode));
1472EXPORT int iso9660_date __PR((char *result, time_t crtime));
1474LOCAL char *get_pnames __PR((int argc, char *const *argv, int opt,
1475 char *pname, int pnsize, FILE *fp));
1476EXPORT int main __PR((int argc, char *argv[]));
1477LOCAL void list_locales __PR((void));
1478EXPORT char *findgequal __PR((char *s));
1479LOCAL char *escstrcpy __PR((char *to, size_t tolen, char *from));
1480struct directory *get_graft __PR((char *arg, char *graft_point, size_t glen,
1481 char *nodename, size_t nlen,
1482 char **short_namep, BOOL do_insert));
1483EXPORT void *e_malloc __PR((size_t size));
1484EXPORT char *e_strdup __PR((const char *s));
1485LOCAL void ovstrcpy __PR((char *p2, char *p1));
1486LOCAL void checkarch __PR((char *name));
1487
1488LOCAL void
1490 char *appname;
1491{
1492 FILE *rcfile = (FILE *)NULL;
1493 struct rcopts *rco;
1494 char *pnt,
1495 *pnt1;
1496 char linebuffer[256];
1497 static char rcfn[] = ".mkisofsrc";
1498 char filename[1000];
1499 int linum;
1500
1501 strlcpy(filename, rcfn, sizeof (filename));
1502 if (access(filename, R_OK) == 0)
1503 rcfile = fopen(filename, "r");
1504 if (!rcfile && errno != ENOENT)
1505 errmsg(_("Cannot open '%s'.\n"), filename);
1506
1507 if (!rcfile) {
1508 pnt = getenv("MKISOFSRC");
1509 if (pnt && strlen(pnt) <= sizeof (filename)) {
1510 strlcpy(filename, pnt, sizeof (filename));
1511 if (access(filename, R_OK) == 0)
1512 rcfile = fopen(filename, "r");
1513 if (!rcfile && errno != ENOENT)
1514 errmsg(_("Cannot open '%s'.\n"), filename);
1515 }
1516 }
1517 if (!rcfile) {
1518 pnt = getenv("HOME");
1519 if (pnt && strlen(pnt) + strlen(rcfn) + 2 <=
1520 sizeof (filename)) {
1521 strlcpy(filename, pnt, sizeof (filename));
1522 if (strlen(rcfn) + 2 <=
1523 (sizeof (filename) - strlen(filename))) {
1524 strcat(filename, "/");
1525 strcat(filename, rcfn);
1526 }
1527 if (access(filename, R_OK) == 0)
1528 rcfile = fopen(filename, "r");
1529 if (!rcfile && errno != ENOENT)
1530 errmsg(_("Cannot open '%s'.\n"), filename);
1531 }
1532 }
1533 if (!rcfile && strlen(appname) + sizeof (rcfn) + 2 <=
1534 sizeof (filename)) {
1535 strlcpy(filename, appname, sizeof (filename));
1536 pnt = strrchr(filename, '/');
1537 if (pnt) {
1538 strlcpy(pnt + 1, rcfn,
1539 sizeof (filename) - (pnt + 1 - filename));
1540 if (access(filename, R_OK) == 0)
1541 rcfile = fopen(filename, "r");
1542 if (!rcfile && errno != ENOENT)
1543 errmsg(_("Cannot open '%s'.\n"), filename);
1544 }
1545 }
1546 if (!rcfile)
1547 return;
1548 if (verbose > 0) {
1549 fprintf(stderr, _("Using \"%s\"\n"), filename);
1550 }
1551 /* OK, we got it. Now read in the lines and parse them */
1552 linum = 0;
1553 while (fgets(linebuffer, sizeof (linebuffer), rcfile)) {
1554 char *name;
1555 char *name_end;
1556
1557 ++linum;
1558 /* skip any leading white space */
1559 pnt = linebuffer;
1560 while (*pnt == ' ' || *pnt == '\t')
1561 ++pnt;
1562 /*
1563 * If we are looking at a # character, this line is a comment.
1564 */
1565 if (*pnt == '#')
1566 continue;
1567 /*
1568 * The name should begin in the left margin. Make sure it is
1569 * in upper case. Stop when we see white space or a comment.
1570 */
1571 name = pnt;
1572 while (*pnt && (isalpha((unsigned char) *pnt) || *pnt == '_')) {
1573 if (islower((unsigned char) *pnt))
1574 *pnt = toupper((unsigned char) *pnt);
1575 pnt++;
1576 }
1577 if (name == pnt) {
1578 fprintf(stderr, _("%s:%d: name required\n"), filename,
1579 linum);
1580 continue;
1581 }
1582 name_end = pnt;
1583 /* Skip past white space after the name */
1584 while (*pnt == ' ' || *pnt == '\t')
1585 pnt++;
1586 /* silently ignore errors in the rc file. */
1587 if (*pnt != '=') {
1588 fprintf(stderr, _("%s:%d: equals sign required after '%.*s'\n"),
1589 filename, linum,
1590 /* XXX Should not be > int */
1591 (int)(name_end-name), name);
1592 continue;
1593 }
1594 /* Skip pas the = sign, and any white space following it */
1595 pnt++; /* Skip past '=' sign */
1596 while (*pnt == ' ' || *pnt == '\t')
1597 pnt++;
1598
1599 /* now it is safe to NUL terminate the name */
1600
1601 *name_end = 0;
1602
1603 /* Now get rid of trailing newline */
1604
1605 pnt1 = pnt;
1606 while (*pnt1) {
1607 if (*pnt1 == '\n') {
1608 *pnt1 = 0;
1609 break;
1610 }
1611 pnt1++;
1612 }
1613 /* OK, now figure out which option we have */
1614 for (rco = rcopt; rco->tag; rco++) {
1615 if (strcmp(rco->tag, name) == 0) {
1616 *rco->variable = e_strdup(pnt);
1617 break;
1618 }
1619 }
1620 if (rco->tag == NULL) {
1621 fprintf(stderr, _("%s:%d: field name \"%s\" unknown\n"),
1622 filename, linum,
1623 name);
1624 }
1625 }
1626 if (ferror(rcfile))
1627 errmsg(_("Read error on '%s'.\n"), filename);
1628 fclose(rcfile);
1629}
1630
1633
1636
1637int goof = 0;
1638
1639#ifndef TRUE
1640#define TRUE 1
1641#endif
1642
1643#ifndef FALSE
1644#define FALSE 0
1645#endif
1646
1647LOCAL void
1648susage(excode)
1649 int excode;
1650{
1651 const char *program_name = "mkisofs";
1652
1653#ifdef USE_FIND
1654 fprintf(stderr, _("Usage: %s [options] [-find] file... [find expression]\n"), program_name);
1655#else
1656 fprintf(stderr, _("Usage: %s [options] file...\n"), program_name);
1657#endif
1658 fprintf(stderr, _("\nUse %s -help\n"), program_name);
1659 fprintf(stderr, _("to get a list all of valid options.\n"));
1660#ifdef USE_FIND
1661 fprintf(stderr, _("\nUse %s -find -help\n"), program_name);
1662 fprintf(stderr, _("to get a list of all valid -find options.\n"));
1663#endif
1664 error(_("\nMost important Options:\n"));
1665 error(_(" -posix-H Follow sylinks encountered on command line\n"));
1666 error(_(" -posix-L Follow all symlinks\n"));
1667 error(_(" -posix-P Do not follow symlinks (default)\n"));
1668 error(_(" -o FILE, -output FILE Set output file name\n"));
1669 error(_(" -R, -rock Generate Rock Ridge directory information\n"));
1670 error(_(" -r, -rational-rock Generate rationalized Rock Ridge directory info\n"));
1671 error(_(" -J, -joliet Generate Joliet directory information\n"));
1672 error(_(" -print-size Print estimated filesystem size and exit\n"));
1673#ifdef UDF
1674 error(_(" -UDF Generate UDF file system\n"));
1675#endif
1676#ifdef DVD_AUD_VID
1677 error(_(" -dvd-audio Generate DVD-Audio compliant UDF file system\n"));
1678 error(_(" -dvd-video Generate DVD-Video compliant UDF file system\n"));
1679 error(_(" -dvd-hybrid Generate a hybrid (DVD-Audio/DVD-Video) compliant UDF file system\n"));
1680#endif
1681 error(_(" -iso-level LEVEL Set ISO9660 level (1..3) or 4 for ISO9660 v 2\n"));
1682 error(_(" -V ID, -volid ID Set Volume ID\n"));
1683 error(_(" -graft-points Allow to use graft points for filenames\n"));
1684 error(_(" -M FILE, -prev-session FILE Set path to previous session to merge\n"));
1685
1686 exit(excode);
1687}
1688
1689const char *optend __PR((const char *fmt));
1690const char *
1692 const char *fmt;
1693{
1694 int c;
1695 const char *ofmt = fmt;
1696
1697 for (; *fmt != '\0'; fmt++) {
1698 c = *fmt;
1699 if (c == '\\') {
1700 if (*++fmt == '\0')
1701 break;
1702 continue;
1703 }
1704 if (c == ',' || c == '%' || c == '*' || c == '?' ||
1705 c == '#' || c == '&' || c == '~')
1706 break;
1707 if (fmt > ofmt && c == '+')
1708 break;
1709
1710 }
1711 return (fmt);
1712}
1713
1714int printopts __PR((FILE *f, const char *fmt, const char *arg, int twod));
1715int
1717 FILE *f;
1718 const char *fmt;
1719 const char *arg;
1720 int twod;
1721{
1722 const char *p;
1723 int len = 0;
1724 int optlen;
1725 int arglen = 0;
1726
1727 if (arg) {
1728 if (*arg == '-' || *arg == '\\')
1729 arg++;
1730
1731 if (*arg == '\1') {
1732 p = ++arg;
1733 while (*p != '\0' && *p != '\1' && *p != '\2')
1734 p++;
1735 arglen = p - arg;
1736 if (arglen == 0)
1737 arg = NULL;
1738 } else {
1739 arg = NULL;
1740 }
1741 }
1742 for (p = optend(fmt); p > fmt; p = optend(fmt)) {
1743 optlen = p - fmt;
1744 len += fprintf(f, "%s%.*s%s%.*s",
1745 *fmt == '+' ? "" :
1746 (optlen > 1 && twod) ? "--" : "-",
1747 (int)(p - fmt), fmt,
1748 arg != NULL ? " " : "",
1749 arglen, arg != NULL ? arg : "");
1750 fmt = p;
1751 while (*fmt != '\0' && *fmt != ',')
1752 fmt++;
1753 if (*fmt == ',') {
1754 fmt++;
1755 len += fprintf(f, ", ");
1756 }
1757 }
1758 return (len);
1759}
1760
1761const char *docstr __PR((const char *str, int *no_help));
1762const char *
1763docstr(str, no_help)
1764 const char *str;
1765 int *no_help;
1766{
1767 if (no_help)
1768 *no_help = 0;
1769 if (str == NULL)
1770 return (str);
1771
1772 if (*str == '-' || *str == '\\')
1773 str++;
1774
1775 if (*str == '\1') {
1776 str++;
1777 while (*str != '\0' && *str != '\1' && *str != '\2')
1778 str++;
1779 }
1780 if (*str == '\1') {
1781 str++;
1782 } else if (*str == '\2') {
1783 str++;
1784 if (no_help)
1785 *no_help = 1;
1786 }
1787
1788 if (*str == '\0')
1789 return (NULL);
1790 return (str);
1791}
1792
1793LOCAL void
1794usage(excode)
1795 int excode;
1796{
1797 const char *program_name = "mkisofs";
1798
1799 int i;
1800
1801#ifdef USE_FIND
1802 fprintf(stderr, _("Usage: %s [options] [-find] file... [find expression]\n"), program_name);
1803#else
1804 fprintf(stderr, _("Usage: %s [options] file...\n"), program_name);
1805#endif
1806
1807 fprintf(stderr, _("Options:\n"));
1808 for (i = 0; i < (int)OPTION_COUNT; i++) {
1809 if (docstr(mki_options[i].doc, NULL) != NULL) {
1810 int len;
1811 int j;
1812
1813 fprintf(stderr, " ");
1814 len = 2;
1815 j = i;
1816 do {
1817 int twodash;
1818 int no_help;
1819 const char *doc;
1820
1821 doc = mki_options[j].doc;
1822 twodash = (doc != NULL && *doc == '-');
1823 doc = docstr(doc, &no_help);
1824
1825 if (!no_help) {
1826 /*
1827 * If more options for one doc, then
1828 * print a comma as separator.
1829 */
1830 if (j > i)
1831 len += fprintf(stderr, ", ");
1832 len += printopts(stderr,
1833 mki_options[j].opt.ga_format,
1834 mki_options[j].doc,
1835 twodash);
1836 }
1837 ++j;
1838 }
1839 while (j < (int)OPTION_COUNT &&
1840 docstr(mki_options[j].doc, NULL) == NULL);
1841
1842 if (len >= 30) {
1843 fprintf(stderr, "\n");
1844 len = 0;
1845 }
1846 for (; len < 30; len++)
1847 fputc(' ', stderr);
1848
1849 fprintf(stderr, "%s\n",
1850 docstr(mki_options[i].doc, NULL));
1851 }
1852 }
1853 exit(excode);
1854}
1855
1856
1857/*
1858 * Fill in date in the iso9660 format
1859 * This takes 7 bytes and supports year 1900 .. 2155 with 1 second granularity
1860 *
1861 * The standards state that the timezone offset is in multiples of 15
1862 * minutes, and is what you add to GMT to get the localtime. The U.S.
1863 * is always at a negative offset, from -5h to -8h (can vary a little
1864 * with DST, I guess). The Linux iso9660 filesystem has had the sign
1865 * of this wrong for ages (mkisofs had it wrong too until February 1997).
1866 */
1867EXPORT int
1869 char *result;
1870 time_t crtime;
1871{
1872 struct tm local;
1873 struct tm gmt;
1874
1875 local = *localtime(&crtime);
1876 gmt = *gmtime(&crtime);
1877
1878 result[0] = local.tm_year;
1879 result[1] = local.tm_mon + 1;
1880 result[2] = local.tm_mday;
1881 result[3] = local.tm_hour;
1882 result[4] = local.tm_min;
1883 result[5] = local.tm_sec;
1884
1885 local.tm_min -= gmt.tm_min;
1886 local.tm_hour -= gmt.tm_hour;
1887 local.tm_yday -= gmt.tm_yday;
1888 local.tm_year -= gmt.tm_year;
1889 if (local.tm_year) /* Hit new-year limit */
1890 local.tm_yday = local.tm_year; /* yday = +-1 */
1891
1892 result[6] = (local.tm_min + 60 *
1893 (local.tm_hour + 24 * local.tm_yday)) / 15;
1894
1895 return (0);
1896}
1897
1898/*
1899 * Fill in date in the iso9660 long format
1900 * This takes 17 bytes and supports year 0 .. 9999 with 10ms granularity
1901 * If iso9660_ldate() is called with gmtoff set to -100, the gmtoffset for
1902 * the related time is computed via localtime(). For the modification
1903 * date in the PVD, the date and the GMT offset may be defined via the
1904 * -modification-date command line option.
1905 */
1906EXPORT int
1907iso9660_ldate(result, crtime, nsec, gmtoff)
1908 char *result;
1909 time_t crtime;
1910 int nsec;
1911 int gmtoff;
1912{
1913 struct tm local;
1914 struct tm gmt;
1915
1916 local = *localtime(&crtime);
1917 gmt = *gmtime(&crtime);
1918
1919 /*
1920 * There was a comment here about breaking in the year 2000.
1921 * That's not true, in 2000 tm_year == 100, so 1900+tm_year == 2000.
1922 */
1923 sprintf(result, "%4.4d%2.2d%2.2d%2.2d%2.2d%2.2d%2.2d",
1924 1900 + local.tm_year,
1925 local.tm_mon + 1, local.tm_mday,
1926 local.tm_hour, local.tm_min, local.tm_sec,
1927 nsec / 10000000);
1928
1929 if (gmtoff == -100) {
1930 local.tm_min -= gmt.tm_min;
1931 local.tm_hour -= gmt.tm_hour;
1932 local.tm_yday -= gmt.tm_yday;
1933 local.tm_year -= gmt.tm_year;
1934 if (local.tm_year) /* Hit new-year limit */
1935 local.tm_yday = local.tm_year; /* yday = +-1 */
1936
1937 result[16] = (local.tm_min + 60 *
1938 (local.tm_hour + 24 * local.tm_yday)) / 15;
1939 } else {
1940 result[16] = gmtoff;
1941 }
1942 return (0);
1943}
1944
1945/* hide "./rr_moved" if all its contents are hidden */
1946LOCAL void
1948{
1949 struct directory_entry *s_entry;
1950
1951 for (s_entry = reloc_dir->contents; s_entry; s_entry = s_entry->next) {
1952 if (strcmp(s_entry->name, ".") == 0 ||
1953 strcmp(s_entry->name, "..") == 0)
1954 continue;
1955
1956 if ((s_entry->de_flags & INHIBIT_ISO9660_ENTRY) == 0)
1957 return;
1958 }
1959
1960 /* all entries are hidden, so hide this directory */
1961 reloc_dir->dir_flags |= INHIBIT_ISO9660_ENTRY;
1962 reloc_dir->self->de_flags |= INHIBIT_ISO9660_ENTRY;
1963}
1964
1965/*
1966 * get pathnames from the command line, and then from given file
1967 */
1968LOCAL char *
1969get_pnames(argc, argv, opt, pname, pnsize, fp)
1970 int argc;
1971 char * const *argv;
1972 int opt;
1973 char *pname;
1974 int pnsize;
1975 FILE *fp;
1976{
1977 int len;
1978
1979 /* we may of already read the first line from the pathnames file */
1980 if (save_pname) {
1981 save_pname = 0;
1982 return (pname);
1983 }
1984
1985#ifdef USE_FIND
1986 if (dofind && opt < (find_pav - argv))
1987 return (argv[opt]);
1988 else if (!dofind && opt < argc)
1989 return (argv[opt]);
1990#else
1991 if (opt < argc)
1992 return (argv[opt]);
1993#endif
1994
1995 if (fp == NULL)
1996 return ((char *)0);
1997
1998 if (fgets(pname, pnsize, fp)) {
1999 /* Discard newline */
2000 len = strlen(pname);
2001 if (pname[len - 1] == '\n') {
2002 pname[len - 1] = '\0';
2003 }
2004 return (pname);
2005 }
2006 return ((char *)0);
2007}
2008
2009EXPORT int
2011 int argc;
2012 char *argv[];
2013{
2014 int cac = argc;
2015 char * const *cav = argv;
2016
2017 struct directory_entry de;
2018
2019#ifdef HAVE_SBRK
2020 unsigned long mem_start;
2021#endif
2022 struct stat statbuf;
2023 struct iso_directory_record *mrootp = NULL;
2024 struct output_fragment *opnt;
2025 struct ga_flags flags[OPTION_COUNT + 1];
2026 int c;
2027 int n;
2028 char *node = NULL;
2029 FILE *pfp = NULL;
2030 char pname[2*PATH_MAX + 1 + 1]; /* may be too short */
2031 char *arg; /* if '\\' present */
2032 char nodename[PATH_MAX + 1];
2033 int no_path_names = 1;
2034 int warn_violate = 0;
2035 int have_cmd_line_pathspec = 0;
2036 int rationalize_all = 0;
2037 int argind = 0;
2038#ifdef APPLE_HYB
2039 int hfs_ct = 0;
2040#endif /* APPLE_HYB */
2041
2042
2043#ifdef __EMX__
2044 /* This gives wildcard expansion with Non-Posix shells with EMX */
2045 _wildcard(&argc, &argv);
2046#endif
2048
2049#if defined(USE_NLS)
2050 setlocale(LC_ALL, "");
2051#if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
2052#define TEXT_DOMAIN "mkisofs" /* Use this only if it weren't */
2053#endif
2054 arg = searchfileinpath("share/locale", F_OK,
2056 if (arg)
2057 (void) bindtextdomain(TEXT_DOMAIN, arg);
2058 else
2059#ifdef PROTOTYPES
2060 (void) bindtextdomain(TEXT_DOMAIN, INS_BASE "/share/locale");
2061#else
2062 (void) bindtextdomain(TEXT_DOMAIN, "/usr/share/locale");
2063#endif
2064 (void) textdomain(TEXT_DOMAIN);
2065#endif
2066
2067
2068 if (argc < 2) {
2069 errmsgno(EX_BAD, _("Missing pathspec.\n"));
2070 susage(1);
2071 }
2072 /* Get the defaults from the .mkisofsrc file */
2073 read_rcfile(argv[0]);
2074
2075 {
2076 int i;
2077
2078 for (i = 0; i < (int)OPTION_COUNT; i++) {
2079 flags[i] = mki_options[i].opt;
2080 }
2081 flags[i].ga_format = NULL;
2082 gl_flags = flags;
2083 }
2084 time(&begun);
2089
2090 cac--;
2091 cav++;
2092 c = getvargs(&cac, &cav, GA_NO_PROPS, flags);
2093 if (c < 0) {
2094 if (c == BADFLAG && strchr(cav[0], '=')) {
2095 argind = argc - cac;
2096 goto args_ok;
2097 }
2098 error(_("Bad Option '%s' (error %d %s).\n"),
2099 cav[0], c, getargerror(c));
2100 susage(EX_BAD);
2101 }
2102args_ok:
2103 if (argind == 0)
2104 argind = argc - cac;
2105 path_ind = argind;
2106 if (cac > 0)
2107 have_cmd_line_pathspec = 1;
2108 if (help)
2109 usage(0);
2110 if (pversion) {
2111 printf(_("mkisofs %s (%s-%s-%s)\n\n\
2112Copyright (C) 1993-1997 %s\n\
2113Copyright (C) 1997-2017 %s\n"),
2116 _("Eric Youngdale"),
2117 _("Joerg Schilling"));
2118#ifdef APPLE_HYB
2119 printf(_("Copyright (C) 1997-2001 James Pearson\n"));
2120#endif
2121#ifdef UDF
2122 printf(_("Copyright (C) 2006 HELIOS Software GmbH\n"));
2123#endif
2124#ifdef OPTION_SILO_BOOT
2125 printf(_("Warning: this is unofficial (modified) version of mkisofs that incorporates\n"));
2126 printf(_(" support for a non Sparc compliant boot method called SILO.\n"));
2127 printf(_(" The official method to create Sparc boot CDs is to use -sparc-boot\n"));
2128 printf(_(" In case of problems first test with an official version of mkisofs.\n"));
2129#endif
2130 exit(0);
2131 }
2132#ifdef USE_FIND
2133 if (dofind) {
2134 finda_t fa;
2135
2136 cac = find_ac;
2137 cav = find_av;
2138 find_firstprim(&cac, &cav);
2139 find_pac = cac;
2140 find_pav = cav;
2141 argind = argc - find_ac;
2142
2143 if (cac > 0) {
2144 find_argsinit(&fa);
2145 fa.walkflags = walkflags;
2146 fa.Argc = cac;
2147 fa.Argv = (char **)cav;
2148 find_node = find_parse(&fa);
2149 if (fa.primtype == FIND_ERRARG)
2150 comexit(fa.error);
2151 if (fa.primtype != FIND_ENDARGS)
2152 comerrno(EX_BAD, _("Incomplete expression.\n"));
2153 plusp = fa.plusp;
2154 find_patlen = fa.patlen;
2155 walkflags = fa.walkflags;
2156 maxdepth = fa.maxdepth;
2157 mindepth = fa.mindepth;
2158
2159 if (find_node &&
2160 !(check_image || print_size) &&
2161 (outfile == NULL ||
2162 (outfile[0] == '-' && outfile[1] == '\0'))) {
2163 if (find_pname(find_node, "-exec") ||
2164 find_pname(find_node, "-exec+") ||
2165 find_pname(find_node, "-ok"))
2167 _("Cannot -exec with '-o -'.\n"));
2168 }
2169 }
2170
2171 if (find_ac <= 0 || find_ac == find_pac) {
2172 errmsgno(EX_BAD, _("Missing pathspec for -find.\n"));
2173 susage(EX_BAD);
2174 }
2175 }
2176#endif
2177#ifdef DVD_AUD_VID
2178
2179 dvd_aud_vid_flag = (dvd_audio ? DVD_SPEC_AUDIO : 0)
2180 | (dvd_hybrid ? DVD_SPEC_HYBRD : 0)
2181 | (dvd_video ? DVD_SPEC_VIDEO : 0);
2182
2183#endif
2184
2185 if (abstract) {
2186 if (strlen(abstract) > 37) {
2188 _("Abstract filename string too long (cur. %lld max. 37 chars).\n"),
2190 }
2191 }
2192 if (appid) {
2193 if (strlen(appid) > 128) {
2195 _("Application-id string too long (cur. %lld max. 128 chars).\n"),
2196 (Llong)strlen(appid));
2197 }
2198 }
2199 if (biblio) {
2200 if (strlen(biblio) > 37) {
2202 _("Bibliographic filename string too long (cur. %lld max. 37 chars).\n"),
2203 (Llong)strlen(biblio));
2204 }
2205 }
2206#ifdef DUPLICATES_ONCE
2207 /*
2208 * If -duplicates-once was specified, do not implicitly enable
2209 * -cache-inodes.
2210 */
2211 if (cache_inodes < 0 && duplicates_once)
2212 cache_inodes = 0;
2213#endif
2214#if defined(IS_CYGWIN)
2215 /*
2216 * If we have 64 bit inode numbers, Cygwin should be able to work
2217 * correctly on NTFS, otherwise disable caching unless it has
2218 * been enforced via -cache-inodes.
2219 */
2220 if (cache_inodes < 0 && sizeof (ino_t) < 8)
2221 cache_inodes = 0;
2222#endif
2223 if (cache_inodes < 0)
2224 cache_inodes = 1;
2225#ifdef DUPLICATES_ONCE
2226 if (!cache_inodes && !duplicates_once) {
2227#else
2228 if (!cache_inodes) {
2229#endif
2231 if (use_RockRidge) {
2233 _("Warning: Cannot write inode/link information with -no-cache-inodes.\n"));
2234 } else {
2236 _("Warning: Cannot add inode hints with -no-cache-inodes.\n"));
2237 }
2238 }
2239#if defined(__MINGW32__)
2240 if (cache_inodes) {
2241 cache_inodes = 0;
2244 _("Warning: cannot -cache-inodes on this platform - ignoring.\n"));
2245 }
2246#endif
2247 if (!correct_inodes)
2248 rrip112 = FALSE;
2249 if (check_image) {
2250 check_session++;
2253 outfile = DEV_NULL;
2254 /*
2255 * cdrecord_data is handled specially in multi.c
2256 * as we cannot write to all strings.
2257 * If mkisofs is called with -C xx,yy
2258 * our default is overwritten.
2259 */
2260/* cdrecord_data = "0,0";*/
2261 }
2262 if (copyright) {
2263 if (strlen(copyright) > 37) {
2265 _("Copyright filename string too long (cur. %lld max. 37 chars).\n"),
2267 }
2268 }
2269 if (genboot_image)
2270 use_genboot++;
2271 if (boot_catalog)
2272 use_eltorito++;
2273 else
2275 if (omit_period && iso9660_level < 4)
2276 warn_violate++;
2277 if (data_change_warn)
2278 errconfig("WARN|GROW|SHRINK *");
2279 if (dirmode_str) {
2280 char *end = 0;
2281
2282 rationalize++;
2283 use_RockRidge++;
2285
2286 /*
2287 * If -new-dir-mode was specified, new_dir_mode is set
2288 * up later with a value that matches the -new-dir-mode arg.
2289 */
2291 if (!end || *end != 0 ||
2292 dirmode_to_use < 0 || dirmode_to_use > 07777) {
2293 comerrno(EX_BAD, _("Bad mode for -dir-mode\n"));
2294 }
2295 }
2297 RR_relocation_depth = 0xFFFFFFFF;
2298 if (filemode_str) {
2299 char *end = 0;
2300
2301 rationalize++;
2302 use_RockRidge++;
2304
2306 if (!end || *end != 0 ||
2307 filemode_to_use < 0 || filemode_to_use > 07777) {
2308 comerrno(EX_BAD, _("Bad mode for -file-mode\n"));
2309 }
2310 }
2311#ifdef __warn_follow__
2312 if (follow_links) {
2314 _("Warning: -follow-links does not always work correctly; be careful.\n"));
2315 }
2316#endif
2317 if (gid_str) {
2318 char *end = 0;
2319
2320 rationalize++;
2321 use_RockRidge++;
2323
2324 gid_to_use = strtol(gid_str, &end, 0);
2325 if (!end || *end != 0) {
2326 comerrno(EX_BAD, _("Bad value for -gid\n"));
2327 }
2328 }
2329 switch (iso9660_level) {
2330
2331 case 1:
2332 /*
2333 * Only on file section
2334 * 8.3 d or d1 characters for files
2335 * 8 d or d1 characters for directories
2336 */
2337 break;
2338 case 2:
2339 /*
2340 * Only on file section
2341 */
2342 break;
2343 case 3:
2344 /*
2345 * No restrictions
2346 */
2347 do_largefiles++;
2348 break;
2349 case 4:
2350 /*
2351 * This is ISO-9660:1988 (ISO-9660 version 2)
2352 */
2353 do_largefiles++;
2354 iso9660_namelen = MAX_ISONAME_V2; /* allow 207 chars */
2355 full_iso9660_filenames++; /* 31+ chars */
2357 RR_relocation_depth = 0xFFFFFFFF;
2358
2359 /*
2360 * From -U ...
2361 */
2362 omit_period++; /* trailing dot */
2364 relaxed_filenames++; /* all chars */
2365 allow_lowercase++; /* even lowcase */
2366 allow_multidot++; /* > 1 dots */
2367 break;
2368
2369 default:
2370 comerrno(EX_BAD, _("Illegal iso9660 Level %d, use 1..3 or 4.\n"),
2372 }
2373
2374 if (joliet_long) {
2375 use_Joliet++;
2376 jlen = JLONGMAX;
2377 }
2378 if (jcharset) {
2379 use_Joliet++;
2381 }
2382 if (max_filenames && iso9660_level < 4) {
2383 iso9660_namelen = MAX_ISONAME_V1; /* allow 37 chars */
2386 warn_violate++;
2387 }
2389 warn_violate++;
2391 warn_violate++;
2392 if (new_dirmode_str) {
2393 char *end = 0;
2394
2395 rationalize++;
2396
2398 if (!end || *end != 0 ||
2399 new_dir_mode < 0 || new_dir_mode > 07777) {
2400 comerrno(EX_BAD, _("Bad mode for -new-dir-mode\n"));
2401 }
2402 }
2403 if (sectype) {
2404 if (strcmp(sectype, "data") == 0)
2405 osecsize = 2048;
2406 else if (strcmp(sectype, "xa1") == 0)
2407 osecsize = 2056;
2408 else if (strcmp(sectype, "raw") == 0) {
2409 osecsize = 2352;
2411 _("Unsupported sector type '%s'.\n"),
2412 sectype);
2413 }
2414 }
2415 if (preparer) {
2416 if (strlen(preparer) > 128) {
2417 comerrno(EX_BAD, _("Preparer string too long (cur. %lld max. 128 chars).\n"),
2419 }
2420 }
2421 if (publisher) {
2422 if (strlen(publisher) > 128) {
2424 _("Publisher string too long (cur. %lld max. 128 chars).\n"),
2426 }
2427 }
2428 if (rationalize_rr) {
2429 rationalize_all++;
2430 use_RockRidge++;
2431 }
2432 if (stream_filename) {
2435 _("stream-file-name too long (%llu), max is %d.\n"),
2437 if (strchr(stream_filename, '/'))
2438 comerrno(EX_BAD, _("Illegal character '/' in stream-file-name.\n"));
2439 iso9660_level = 4;
2440 } else {
2441 stream_filename = omit_version_number ? "STREAM.IMG" : "STREAM.IMG;1";
2442 }
2443 if (system_id) {
2444 if (strlen(system_id) > 32) {
2446 _("System ID string too long\n"));
2447 }
2448 }
2449 if (trans_tbl)
2451 else
2452 trans_tbl = "TRANS.TBL";
2453 if (ucs_level < 1 || ucs_level > 3)
2454 comerrno(EX_BAD, _("Illegal UCS Level %d, use 1..3.\n"),
2455 ucs_level);
2456#ifdef DVD_AUD_VID
2457 if (dvd_aud_vid_flag) {
2458 if (!use_udf)
2459 rationalize_udf++;
2460 }
2461#endif
2462#ifdef UDF
2463 if (rationalize_udf) {
2464 rationalize_all++;
2465 use_udf++;
2466 }
2467#endif
2468 if (uid_str) {
2469 char *end = 0;
2470
2471 rationalize++;
2472 use_RockRidge++;
2474
2475 uid_to_use = strtol(uid_str, &end, 0);
2476 if (!end || *end != 0) {
2477 comerrno(EX_BAD, _("Bad value for -uid\n"));
2478 }
2479 }
2481 /*
2482 * Minimal (only truncation of 31+ characters)
2483 * translation of filenames.
2484 *
2485 * Forces -l, -d, -N, -allow-leading-dots,
2486 * -relaxed-filenames,
2487 * -allow-lowercase, -allow-multidot
2488 *
2489 * This is for HP-UX, which does not recognize ANY
2490 * extentions (Rock Ridge, Joliet), causing pain when
2491 * loading software. pfs_mount can be used to read the
2492 * extensions, but the untranslated filenames can be
2493 * read by the "native" cdfs mounter. Completely
2494 * violates iso9660.
2495 */
2496 full_iso9660_filenames++; /* 31 chars */
2497 omit_period++; /* trailing dot */
2500 relaxed_filenames++; /* all chars */
2501 allow_lowercase++; /* even lowcase */
2502 allow_multidot++; /* > 1 dots */
2503 warn_violate++;
2504 }
2506 allow_lowercase = 0;
2508 warn_violate++;
2509 if (iso_translate == 0 && iso9660_level < 4)
2510 warn_violate++;
2511 if (allow_lowercase && iso9660_level < 4)
2512 warn_violate++;
2513 if (allow_multidot && iso9660_level < 4)
2514 warn_violate++;
2515 if (volume_id) {
2516 if (strlen(volume_id) > 32) {
2518 _("Volume ID string too long (cur. %lld max. 32 chars).\n"),
2520 }
2521 }
2522 if (volset_id) {
2523 if (strlen(volset_id) > 128) {
2525 _("Volume set ID string too long (cur. %lld max. 128 chars).\n"),
2527 }
2528 }
2529 if (volume_set_size) {
2530 if (volume_set_size <= 0) {
2532 _("Illegal Volume Set Size %d\n"), volume_set_size);
2533 }
2534 if (volume_set_size > 1) {
2536 _("Volume Set Size > 1 not yet supported\n"));
2537 }
2538 }
2542 _("Volume set sequence number too big\n"));
2543 }
2544 }
2545 if (rationalize_xa) {
2546 rationalize_all++;
2547 use_XA++;
2548 }
2550#ifdef VMS
2552 _("Transparent compression not supported with VMS\n"));
2553#endif
2554 }
2555#ifdef APPLE_HYB
2556 if (deftype) {
2557 hfs_ct++;
2558 if (strlen(deftype) != 4) {
2560 _("HFS default TYPE string has illegal length.\n"));
2561 }
2562 } else {
2563 deftype = APPLE_TYPE_DEFAULT;
2564 }
2565 if (defcreator) {
2566 hfs_ct++;
2567 if (strlen(defcreator) != 4) {
2569 _("HFS default CREATOR string has illegal length.\n"));
2570 }
2571 } else {
2572 defcreator = APPLE_CREATOR_DEFAULT;
2573 }
2574 if (afpfile && *afpfile != '\0')
2575 hfs_last = MAP_LAST;
2576 if (magic_file)
2577 hfs_last = MAG_LAST;
2578 if (nomacfiles) {
2580 _("Warning: -no-mac-files no longer used ... ignoring\n"));
2581 }
2582 if (hfs_boot_file)
2583 gen_pt = 1;
2584 if (root_info)
2585 icon_pos = 1;
2586 if (hfs_icharset)
2587 use_mac_name = 1;
2588 if (hfs_parms)
2589 hfs_parms = e_strdup(hfs_parms);
2590
2591 if (apple_hyb && apple_ext) {
2592 comerrno(EX_BAD, _("Can't have both -apple and -hfs options\n"));
2593 }
2594 /*
2595 * if -probe, -macname, any hfs selection and/or mapping file is given,
2596 * but no HFS option, then select apple_hyb
2597 */
2598 if (!apple_hyb && !apple_ext) {
2599 if (*afpfile || probe || use_mac_name || hfs_select ||
2600 hfs_boot_file || magic_file ||
2601 hfs_ishidden() || gen_pt || autoname ||
2602 afe_size || icon_pos || hfs_ct ||
2603 hfs_icharset || hfs_ocharset) {
2604 apple_hyb = 1;
2605#ifdef UDF
2606 if ((DO_XHFS & hfs_select) && use_udf) {
2608 if (!no_apple_hyb) {
2609 error(
2610 _("Warning: no HFS hybrid will be created with -udf and --osx-hfs\n"));
2611 }
2612 }
2613#endif
2614 }
2615 }
2616#ifdef UDF
2617 if (!use_udf && create_udfsymlinks)
2619#if 0
2620 if (use_RockRidge && use_udf && create_udfsymlinks) {
2621 error(_("Warning: cannot create UDF symlinks with activated Rock Ridge\n"));
2623 }
2624#endif
2625#endif
2626 if (no_apple_hyb) {
2628 }
2630 do_largefiles = 0;
2631 maxnonlarge = (off_t)0x7FFFFFFF;
2632 error(_("Warning: cannot support large files with -hfs\n"));
2633 }
2634#ifdef UDF
2635 if (apple_hyb && use_udf && !donotwrite_macpart) {
2636 comerrno(EX_BAD, _("Can't have -hfs with -udf\n"));
2637 }
2638#endif
2639 if (apple_ext && hfs_boot_file) {
2640 comerrno(EX_BAD, _("Can't have -hfs-boot-file with -apple\n"));
2641 }
2642 if (apple_ext && autoname) {
2643 comerrno(EX_BAD, _("Can't have -auto with -apple\n"));
2644 }
2646 comerrno(EX_BAD, _("Can't have -hfs with -sparc-boot/-sunx86-boot\n"));
2647 }
2648 if (apple_hyb && use_genboot) {
2649 comerrno(EX_BAD, _("Can't have -hfs with -generic-boot\n"));
2650 }
2651#ifdef PREP_BOOT
2652 if (apple_ext && use_prep_boot) {
2653 comerrno(EX_BAD, _("Can't have -prep-boot with -apple\n"));
2654 }
2655#endif /* PREP_BOOT */
2656
2657 if (apple_hyb || apple_ext)
2658 apple_both = 1;
2659
2660 if (probe)
2661 /* we need to search for all types of Apple/Unix files */
2662 hfs_select = ~0;
2663
2664 if (apple_both && verbose && !(hfs_select || *afpfile || magic_file)) {
2666 _("Warning: no Apple/Unix files will be decoded/mapped\n"));
2667 }
2668 if (apple_both && verbose && !afe_size &&
2669 (hfs_select & (DO_FEU | DO_FEL))) {
2671 _("Warning: assuming PC Exchange cluster size of 512 bytes\n"));
2672 afe_size = 512;
2673 }
2674 if (apple_both) {
2675 /* set up the TYPE/CREATOR mappings */
2676 hfs_init(afpfile, 0, hfs_select);
2677 }
2678 if (apple_ext && !use_RockRidge) {
2679#ifdef nonono
2680 /* use RockRidge to set the SystemUse field ... */
2681 use_RockRidge++;
2682 rationalize_all++;
2683#else
2684 /* EMPTY */
2685#endif
2686 }
2687 if (apple_ext && !(use_XA || use_RockRidge)) {
2688 comerrno(EX_BAD, _("Need either -XA/-xa or -R/-r for -apple to become active.\n"));
2689 }
2690#endif /* APPLE_HYB */
2691
2692 /*
2693 * if the -hide-joliet option has been given, set the Joliet option
2694 */
2695 if (!use_Joliet && j_ishidden())
2696 use_Joliet++;
2697#ifdef UDF
2698 /*
2699 * if the -hide-udf option has been given, set the UDF option
2700 */
2701 if (!use_udf && u_ishidden())
2702 use_udf++;
2703#endif
2704
2705 if (rationalize_all) {
2706 rationalize++;
2711 }
2712
2713 /*
2714 * XXX This is a hack until we have a decent separate name handling
2715 * XXX for UDF filenames.
2716 */
2717#ifdef DVD_AUD_VID
2719 use_Joliet = 0;
2720 error(_("Warning: Disabling Joliet support for DVD-Video/DVD-Audio.\n"));
2721 }
2722#endif
2723#ifdef UDF
2724 if (use_udf && !use_Joliet)
2725 jlen = 255;
2726#endif
2727
2730
2731 if (warn_violate)
2732 error(_("Warning: creating filesystem that does not conform to ISO-9660.\n"));
2733 if (iso9660_level > 3)
2734 error(_("Warning: Creating ISO-9660:1999 (version 2) filesystem.\n"));
2736 error(_("Warning: ISO-9660 filenames longer than %d may cause buffer overflows in the OS.\n"),
2737 LEN_ISONAME);
2738 if (use_Joliet && !use_RockRidge) {
2739 error(_("Warning: creating filesystem with (nonstandard) Joliet extensions\n"));
2740 error(_(" but without (standard) Rock Ridge extensions.\n"));
2741 error(_(" It is highly recommended to add Rock Ridge\n"));
2742 }
2744 error(_("Warning: using transparent compression. This is a nonstandard Rock Ridge\n"));
2745 error(_(" extension. The resulting filesystem can only be transparently\n"));
2746 error(_(" read on Linux. On other operating systems you need to call\n"));
2747 error(_(" mkzftree by hand to decompress the files.\n"));
2748 }
2750 error(_("Warning: transparent decompression is a Linux Rock Ridge extension, but\n"));
2751 error(_(" creating filesystem without Rock Ridge attributes; files\n"));
2752 error(_(" will not be transparently decompressed.\n"));
2753 }
2754
2755#if defined(USE_NLS) && defined(HAVE_NL_LANGINFO) && defined(CODESET)
2756 /*
2757 * If the locale has not been set up, nl_langinfo() returns the
2758 * name of the default codeset. This should be either "646",
2759 * "ISO-646", "ASCII", or something similar. Unfortunately, the
2760 * POSIX standard does not include a list of valid locale names,
2761 * so ne need to find all values in use.
2762 *
2763 * Observed:
2764 * Solaris "646"
2765 * Linux "ANSI_X3.4-1968" strange value from Linux...
2766 */
2767 if (icharset == NULL) {
2768 char *codeset = nl_langinfo(CODESET);
2769 Uchar *p;
2770
2771 if (codeset != NULL)
2772 codeset = e_strdup(codeset);
2773 if (codeset == NULL) /* Should not happen */
2774 goto setcharset;
2775 if (*codeset == '\0') /* Invalid locale */
2776 goto setcharset;
2777
2778 for (p = (Uchar *)codeset; *p != '\0'; p++) {
2779 if (islower(*p))
2780 *p = toupper(*p);
2781 }
2782 p = (Uchar *)strstr(codeset, "ISO");
2783 if (p != NULL) {
2784 if (*p == '_' || *p == '-')
2785 p++;
2786 codeset = (char *)p;
2787 }
2788 if (strcmp("646", codeset) != 0 &&
2789 strcmp("ASCII", codeset) != 0 &&
2790 strcmp("US-ASCII", codeset) != 0 &&
2791 strcmp("US_ASCII", codeset) != 0 &&
2792 strcmp("USASCII", codeset) != 0 &&
2793 strcmp("ANSI_X3.4-1968", codeset) != 0)
2794 icharset = nl_langinfo(CODESET);
2795
2796 if (codeset != NULL)
2797 free(codeset);
2798
2799 if (verbose > 0 && icharset != NULL) {
2800 error(_("Setting input-charset to '%s' from locale.\n"),
2801 icharset);
2802 }
2803 }
2804setcharset:
2805 /*
2806 * Allow to switch off locale with -input-charset "".
2807 */
2808 if (icharset != NULL && *icharset == '\0')
2809 icharset = NULL;
2810#endif
2811 if (icharset == NULL) {
2812#if (defined(__CYGWIN32__) || defined(__CYGWIN__) || defined(__DJGPP__)) && !defined(IS_CYGWIN_1)
2813 icharset = "cp437";
2814#else
2815 icharset = "default";
2816#endif
2817 }
2819
2820 /*
2821 * set the output charset to the same as the input or the given output
2822 * charset
2823 */
2824 if (ocharset == NULL) {
2826 }
2828
2829 if (in_nls == NULL || out_nls == NULL) { /* Unknown charset specified */
2830 fprintf(stderr, _("Unknown charset '%s'.\nKnown charsets are:\n"),
2831 in_nls == NULL ? icharset : (ocharset ? ocharset : "NULL"));
2832 list_locales();
2833 exit(EX_BAD);
2834 }
2835#ifdef USE_ICONV
2836 /*
2837 * XXX If we ever allow this, we neeed to fix the call to conv_charset()
2838 * XXX in name.c::iso9660_file_length().
2839 */
2840 if ((in_nls->sic_cd2uni != NULL || out_nls->sic_cd2uni != NULL) &&
2843 _("Iconv based locales may change file name length.\n"));
2845 _("Cannot yet have different -input-charset/-output-charset.\n"));
2846 }
2847#endif
2848
2849#ifdef APPLE_HYB
2850 if (hfs_icharset == NULL || strcmp(hfs_icharset, "mac-roman") == 0) {
2851 hfs_icharset = "cp10000";
2852 }
2853 hfs_inls = sic_open(hfs_icharset);
2854
2855 if (hfs_ocharset == NULL) {
2856 hfs_ocharset = hfs_inls ? hfs_inls->sic_name : NULL;
2857 }
2858 if (hfs_ocharset == NULL || strcmp(hfs_ocharset, "mac-roman") == 0) {
2859 hfs_ocharset = "cp10000";
2860 }
2861 hfs_onls = sic_open(hfs_ocharset);
2862
2863 if (use_mac_name)
2864 apple_hyb = 1;
2865 if (apple_hyb && (hfs_inls == NULL || hfs_onls == NULL)) {
2866 fprintf(stderr, _("Unknown HFS charset '%s'.\nKnown charsets are:\n"),
2867 hfs_inls == NULL ? hfs_icharset : (hfs_ocharset ? hfs_ocharset : "NULL"));
2868 list_locales();
2869 exit(EX_BAD);
2870 }
2871#ifdef USE_ICONV
2872 if (apple_hyb &&
2876 _("Iconv based locales may change file name length.\n"));
2878 _("Cannot yet have different -input-hfs-charset/-output-hfs-charset.\n"));
2879 }
2880#endif
2881#endif /* APPLE_HYB */
2882
2883 if (merge_image != NULL) {
2884 if (open_merge_image(merge_image) < 0) {
2885 /* Complain and die. */
2886 comerr(_("Unable to open previous session image '%s'.\n"),
2887 merge_image);
2888 }
2889 }
2890 /* We don't need root privilleges anymore. */
2891#ifdef HAVE_SETREUID
2892 if (setreuid(-1, getuid()) < 0)
2893#else
2894#ifdef HAVE_SETEUID
2895 if (seteuid(getuid()) < 0)
2896#else
2897 if (setuid(getuid()) < 0)
2898#endif
2899#endif
2900 comerr(_("Panic cannot set back effective uid.\n"));
2901
2902
2903#ifdef no_more_needed
2904#ifdef __NetBSD__
2905 {
2906 int resource;
2907 struct rlimit rlp;
2908
2909 if (getrlimit(RLIMIT_DATA, &rlp) == -1)
2910 errmsg(_("Warning: Cannot get rlimit.\n"));
2911 else {
2912 rlp.rlim_cur = 33554432;
2913 if (setrlimit(RLIMIT_DATA, &rlp) == -1)
2914 errmsg(_("Warning: Cannot set rlimit.\n"));
2915 }
2916 }
2917#endif
2918#endif /* no_more_needed */
2919#ifdef HAVE_SBRK
2920 mem_start = (unsigned long) sbrk(0);
2921#endif
2922
2923 if (verbose > 1) {
2924 fprintf(stderr, "%s (%s-%s-%s)\n",
2927 }
2928 if (cdrecord_data == NULL && !check_session && merge_image != NULL) {
2930 _("Multisession usage bug: Must specify -C if -M is used.\n"));
2931 }
2932 if (cdrecord_data != NULL && merge_image == NULL) {
2934 _("Warning: -C specified without -M: old session data will not be merged.\n"));
2935 }
2936#ifdef APPLE_HYB
2937 if (merge_image != NULL && apple_hyb) {
2939 _("Warning: files from previous sessions will not be included in the HFS volume.\n"));
2940 }
2941#endif /* APPLE_HYB */
2942
2943 /*
2944 * see if we have a list of pathnames to process
2945 */
2946 if (pathnames) {
2947 /* "-" means take list from the standard input */
2948 if (strcmp(pathnames, "-") != 0) {
2949 if ((pfp = fopen(pathnames, "r")) == NULL) {
2950 comerr(_("Unable to open pathname list %s.\n"),
2951 pathnames);
2952 }
2953 } else
2954 pfp = stdin;
2955 }
2956
2957 /* The first step is to scan the directory tree, and take some notes */
2958
2959 if ((arg = get_pnames(argc, argv, argind, pname,
2960 sizeof (pname), pfp)) == NULL) {
2961 if (check_session == 0 && !stream_media_size) {
2962 errmsgno(EX_BAD, _("Missing pathspec.\n"));
2963 susage(1);
2964 }
2965 }
2966
2967 /*
2968 * if we don't have a pathspec, then save the pathspec found
2969 * in the pathnames file (stored in pname) - we don't want
2970 * to skip this pathspec when we read the pathnames file again
2971 */
2972 if (!have_cmd_line_pathspec && !stream_media_size) {
2973 save_pname = 1;
2974 }
2975 if (stream_media_size) {
2976#ifdef UDF
2977 if (use_XA || use_RockRidge || use_udf || use_Joliet)
2978#else
2980#endif
2982 _("Cannot use XA, Rock Ridge, UDF or Joliet with -stream-media-size\n"));
2983 if (merge_image)
2985 _("Cannot use multi session with -stream-media-size\n"));
2987#ifdef APPLE_HYB
2988 use_genboot || use_prep_boot || hfs_boot_file)
2989#else
2991#endif
2993 _("Cannot use boot options with -stream-media-size\n"));
2994#ifdef APPLE_HYB
2995 if (apple_hyb)
2997 _("Cannot use Apple hybrid options with -stream-media-size\n"));
2998#endif
2999 }
3000
3001 if (use_RockRidge) {
3002 /* BEGIN CSTYLED */
3003#if 1
3005 "THE ROCK RIDGE INTERCHANGE PROTOCOL PROVIDES SUPPORT FOR POSIX FILE SYSTEM SEMANTICS",
3006 "PLEASE CONTACT DISC PUBLISHER FOR SPECIFICATION SOURCE. SEE PUBLISHER IDENTIFIER IN PRIMARY VOLUME DESCRIPTOR FOR CONTACT INFORMATION.",
3008#else
3010 "THE IEEE P1282 PROTOCOL PROVIDES SUPPORT FOR POSIX FILE SYSTEM SEMANTICS",
3011 "PLEASE CONTACT THE IEEE STANDARDS DEPARTMENT, PISCATAWAY, NJ, USA FOR THE P1282 SPECIFICATION.",
3013#endif
3014 /* END CSTYLED */
3015 }
3017 if (log_file) {
3018 FILE *lfp;
3019 int i;
3020
3021 /* open log file - test that we can open OK */
3022 if ((lfp = fopen(log_file, "w")) == NULL) {
3023 comerr(_("Can't open logfile: '%s'.\n"), log_file);
3024 }
3025 fclose(lfp);
3026
3027 /* redirect all stderr message to log_file */
3028 fprintf(stderr, _("re-directing all messages to %s\n"), log_file);
3029 fflush(stderr);
3030
3031 /* associate stderr with the log file */
3032 if (freopen(log_file, "w", stderr) == NULL) {
3033 comerr(_("Can't open logfile: '%s'.\n"), log_file);
3034 }
3035 if (verbose > 1) {
3036 for (i = 0; i < argc; i++)
3037 fprintf(stderr, "%s ", argv[i]);
3038
3039 fprintf(stderr, "\n%s (%s-%s-%s)\n",
3042 }
3043 }
3044 /* Find name of root directory. */
3045 if (arg != NULL)
3046 node = findgequal(arg);
3047 if (!use_graft_ptrs)
3048 node = NULL;
3049 if (node == NULL) {
3050 if (use_graft_ptrs && arg != NULL)
3051 node = escstrcpy(nodename, sizeof (nodename), arg);
3052 else
3053 node = arg;
3054 } else {
3055 /*
3056 * Remove '\\' escape chars which are located
3057 * before '\\' and '=' chars
3058 */
3059 node = escstrcpy(nodename, sizeof (nodename), ++node);
3060 }
3061
3062 /*
3063 * See if boot catalog file exists in root directory, if not we will
3064 * create it.
3065 */
3066 if (use_eltorito)
3068
3069 /*
3070 * Find the device and inode number of the root directory. Record this
3071 * in the hash table so we don't scan it more than once.
3072 */
3073 stat_filter(node, &statbuf);
3074 add_directory_hash(statbuf.st_dev, STAT_INODE(statbuf));
3075
3076 memset(&de, 0, sizeof (de));
3077
3078 /*
3079 * PO:
3080 * Isn't root NULL at this time anyway?
3081 * I think it is created by the first call to
3082 * find_or_create_directory() below.
3083 */
3084 de.filedir = root; /* We need this to bootstrap */
3085
3086 if (cdrecord_data != NULL && merge_image == NULL) {
3087 /*
3088 * in case we want to add a new session, but don't want to
3089 * merge old one
3090 */
3092 }
3093 if (merge_image != NULL) {
3094 char sector[SECTOR_SIZE];
3095 UInt32_t extent;
3096
3097 errno = 0;
3098 mrootp = merge_isofs(merge_image);
3099 if (mrootp == NULL) {
3100 /* Complain and die. */
3101 if (errno == 0)
3102 errno = -1;
3103 comerr(_("Unable to find previous session PVD '%s'.\n"),
3104 merge_image);
3105 }
3106 memcpy(de.isorec.extent, mrootp->extent, 8);
3107
3108 /*
3109 * Look for RR Attributes in '.' entry of root dir.
3110 * This is the first ISO directory entry in the root dir.
3111 */
3112 extent = get_733(mrootp->extent);
3113 readsecs(extent, sector, 1);
3115 if (c & RR_FLAG_XA)
3116 fprintf(stderr, _("XA signatures found\n"));
3117 if (c & RR_FLAG_AA)
3118 fprintf(stderr, _("AA signatures found\n"));
3119 if (c & ~(RR_FLAG_XA|RR_FLAG_AA)) {
3120 extern int su_version;
3121 extern int rr_version;
3122 extern char er_id[];
3123
3124 if (c & RR_FLAG_SP) {
3125 fprintf(stderr, _("SUSP signatures version %d found\n"), su_version);
3126 if (c & RR_FLAG_ER) {
3127 if (rr_version < 1) {
3129 _("No valid Rock Ridge signature found\n"));
3130 if (!force_rr)
3131 no_rr++;
3132 } else {
3134 _("Rock Ridge signatures version %d found\n"),
3135 rr_version);
3137 _("Rock Ridge id '%s'\n"), er_id);
3138 }
3139 }
3140 } else {
3141 fprintf(stderr, _("Bad Rock Ridge signatures found (SU record missing)\n"));
3142 if (!force_rr)
3143 no_rr++;
3144 }
3145 } else {
3146 fprintf(stderr, _("No SUSP/Rock Ridge present\n"));
3147 if ((c & (RR_FLAG_XA|RR_FLAG_AA)) == 0) {
3148 if (!force_rr)
3149 no_rr++;
3150 }
3151 }
3152 if (no_rr)
3153 fprintf(stderr, _("Disabling Rock Ridge / XA / AA\n"));
3154 }
3155 /*
3156 * Create an empty root directory. If we ever scan it for real,
3157 * we will fill in the contents.
3158 */
3160
3161#ifdef APPLE_HYB
3162 /* may need to set window layout of the volume */
3163 if (root_info)
3164 set_root_info(root_info);
3165#endif /* APPLE_HYB */
3166
3167 /*
3168 * Scan the actual directory (and any we find below it) for files to
3169 * write out to the output image. Note - we take multiple source
3170 * directories and keep merging them onto the image.
3171 */
3172 if (check_session)
3173 goto path_done;
3174
3175#ifdef USE_FIND
3176 if (dofind) {
3177extern int walkfunc __PR((char *nm, struct stat *fs, int type, struct WALK *state));
3178
3179 walkinitstate(&walkstate);
3180 if (find_patlen > 0) {
3181 walkstate.patstate = ___malloc(sizeof (int) * find_patlen,
3182 _("space for pattern state"));
3183 }
3184
3185 find_timeinit(time(0));
3186 walkstate.walkflags = walkflags;
3187 walkstate.maxdepth = maxdepth;
3188 walkstate.mindepth = mindepth;
3189 walkstate.lname = NULL;
3190 walkstate.tree = find_node;
3191 walkstate.err = 0;
3192 walkstate.pflags = 0;
3193
3194 nodesc = TRUE;
3195 for (;
3196 (arg = get_pnames(argc, argv, argind, pname, sizeof (pname),
3197 pfp)) != NULL;
3198 argind++) {
3199 /*
3200 * Make silly GCC happy and double initialize graft_dir.
3201 */
3202 struct directory *graft_dir = NULL;
3203 char graft_point[PATH_MAX + 1];
3204 struct wargs wa;
3205 char *snp;
3206
3207 graft_point[0] = '\0';
3208 snp = NULL;
3209 if (use_graft_ptrs)
3210 graft_dir = get_graft(arg,
3211 graft_point, sizeof (graft_point),
3212 nodename, sizeof (nodename),
3213 &snp, FALSE);
3214 if (graft_point[0] != '\0') {
3215 arg = nodename;
3216 wa.dir = graft_dir;
3217 } else {
3218 wa.dir = root;
3219 }
3220 wa.name = snp;
3221 walkstate.auxp = &wa;
3222 walkstate.auxi = strlen(arg);
3223 treewalk(arg, walkfunc, &walkstate);
3224 no_path_names = 0;
3225 }
3226 find_plusflush(plusp, &walkstate);
3227 } else
3228#endif
3229
3230 while ((arg = get_pnames(argc, argv, argind, pname,
3231 sizeof (pname), pfp)) != NULL) {
3232 char graft_point[PATH_MAX + 1];
3233
3234 get_graft(arg, graft_point, sizeof (graft_point),
3235 nodename, sizeof (nodename), NULL, TRUE);
3236 argind++;
3237 no_path_names = 0;
3238 }
3239
3240path_done:
3241 if (pfp && pfp != stdin)
3242 fclose(pfp);
3243
3244 /*
3245 * exit if we don't have any pathnames to process
3246 * - not going to happen at the moment as we have to have at least one
3247 * path on the command line
3248 */
3249 if (no_path_names && !check_session && !stream_media_size) {
3250 errmsgno(EX_BAD, _("No pathnames found.\n"));
3251 susage(1);
3252 }
3253 /*
3254 * Now merge in any previous sessions. This is driven on the source
3255 * side, since we may need to create some additional directories.
3256 */
3257 if (merge_image != NULL) {
3258 if (merge_previous_session(root, mrootp,
3259 reloc_root, reloc_old_root) < 0) {
3260 comerrno(EX_BAD, _("Cannot merge previous session.\n"));
3261 }
3263
3264 /*
3265 * set up parent_dir and filedir in relocated entries which
3266 * were read from previous session so that
3267 * finish_cl_pl_entries can do its job
3268 */
3270 free(mrootp);
3271 }
3272#ifdef APPLE_HYB
3273 /* free up any HFS filename mapping memory */
3274 if (apple_both)
3275 clean_hfs();
3276#endif /* APPLE_HYB */
3277
3278 /* hide "./rr_moved" if all its contents have been hidden */
3279 if (reloc_dir && i_ishidden())
3281
3282 /* insert the boot catalog if required */
3283 if (use_eltorito)
3285
3286 /*
3287 * Free up any matching memory
3288 */
3289 for (n = 0; n < MAX_MAT; n++)
3291
3292#ifdef SORTING
3293 del_sort();
3294#endif /* SORTING */
3295
3296 /*
3297 * Sort the directories in the required order (by ISO9660). Also,
3298 * choose the names for the 8.3 filesystem if required, and do any
3299 * other post-scan work.
3300 */
3301 goof += sort_tree(root);
3302
3303 if (goof) {
3304 comerrno(EX_BAD, _("ISO9660/Rock Ridge tree sort failed.\n"));
3305 }
3306#ifdef UDF
3307 if (use_Joliet || use_udf) {
3308#else
3309 if (use_Joliet) {
3310#endif
3312 }
3313 if (goof) {
3314 comerrno(EX_BAD, _("Joliet tree sort failed.\n"));
3315 }
3316 /*
3317 * Fix a couple of things in the root directory so that everything is
3318 * self consistent. Fix this up so that the path tables get done right.
3319 */
3320 root->self = root->contents;
3321
3322 /* OK, ready to write the file. Open it up, and generate the thing. */
3323 if (print_size) {
3324 discimage = fopen(DEV_NULL, "wb");
3325 if (!discimage) {
3326 comerr(_("Unable to open /dev/null\n"));
3327 }
3328 } else if (outfile != NULL &&
3329 !(outfile[0] == '-' && outfile[1] == '\0')) {
3330 discimage = fopen(outfile, "wb");
3331 if (!discimage) {
3332 comerr(_("Unable to open disc image file '%s'.\n"), outfile);
3333 }
3334 } else {
3335 discimage = stdout;
3337 }
3338#ifdef HAVE_SETVBUF
3339 setvbuf(discimage, NULL, _IOFBF, 64*1024);
3340#endif
3341
3342 /* Now assign addresses on the disc for the path table. */
3343
3345 if (path_blocks & 1)
3346 path_blocks++;
3347
3349 if (jpath_blocks & 1)
3350 jpath_blocks++;
3351
3352 /*
3353 * Start to set up the linked list that we use to track the contents
3354 * of the disc.
3355 */
3356#ifdef APPLE_HYB
3357#ifdef PREP_BOOT
3358 if ((apple_hyb && !donotwrite_macpart) || use_prep_boot || use_chrp_boot)
3359#else /* PREP_BOOT */
3361#endif /* PREP_BOOT */
3362 outputlist_insert(&hfs_desc);
3363#endif /* APPLE_HYB */
3366 if (use_genboot)
3369
3370 /* PVD for disc. */
3372
3373 /* SVD for El Torito. MUST be immediately after the PVD! */
3374 if (use_eltorito) {
3376 }
3377 /* Enhanced PVD for disc. neded if we write ISO-9660:1999 */
3378 if (iso9660_level > 3)
3380
3381 /* SVD for Joliet. */
3382 if (use_Joliet) {
3384 }
3385 /* Finally the last volume descriptor. */
3387
3388#ifdef UDF
3389 if (use_udf) {
3390 outputlist_insert(&udf_vol_recognition_area_frag);
3391 }
3392#endif
3393
3394 /* Insert the version descriptor. */
3396
3397#ifdef UDF
3398 if (use_udf) {
3399 /*
3400 * Most of the space before sector 256 is wasted when
3401 * UDF is turned on. The waste could be reduced by
3402 * putting the ISO9660/Joliet structures before the
3403 * pad_to_sector_256; the problem is that they might
3404 * overshoot sector 256, so there would have to be some
3405 * ugly logic to detect this case and rearrange things
3406 * appropriately. I don't know if it's worth it.
3407 */
3408 outputlist_insert(&udf_pad_to_sector_32_frag);
3409 outputlist_insert(&udf_main_seq_frag);
3410 outputlist_insert(&udf_main_seq_copy_frag);
3411 outputlist_insert(&udf_integ_seq_frag);
3412 outputlist_insert(&udf_pad_to_sector_256_frag);
3413 outputlist_insert(&udf_anchor_vol_desc_frag);
3414 outputlist_insert(&udf_file_set_desc_frag);
3415 outputlist_insert(&udf_dirtree_frag);
3416 outputlist_insert(&udf_file_entries_frag);
3417 }
3418#endif
3419
3420 /* Now start with path tables and directory tree info. */
3421 if (!stream_media_size)
3423 else
3425
3426 if (use_Joliet) {
3428 }
3429
3430 if (!stream_media_size)
3432
3433 if (use_Joliet) {
3435 }
3437
3438 if (extension_record) {
3440 }
3441
3442 if (!stream_media_size) {
3444 } else {
3447 }
3448
3449 /*
3450 * Allow room for the various headers we will be writing.
3451 * There will always be a primary and an end volume descriptor.
3452 */
3454
3455 /*
3456 * Calculate the size of all of the components of the disc, and assign
3457 * extent numbers.
3458 */
3459 for (opnt = out_list; opnt; opnt = opnt->of_next) {
3461 if (opnt->of_size != NULL) {
3462 if (verbose > 2)
3463 fprintf(stderr, _("Computing size: %-40sStart Block %u\n"),
3464 opnt->of_name, last_extent);
3465 (*opnt->of_size) (last_extent);
3466 }
3467 }
3468
3469 /*
3470 * Generate the contents of any of the sections that we want to
3471 * generate. Not all of the fragments will do anything here
3472 * - most will generate the data on the fly when we get to the write
3473 * pass.
3474 */
3475 for (opnt = out_list; opnt; opnt = opnt->of_next) {
3476 if (opnt->of_generate != NULL) {
3477 if (verbose > 2)
3478 fprintf(stderr, _("Generating content: %-40s\n"),
3479 opnt->of_name);
3480 (*opnt->of_generate) ();
3481 }
3482 }
3483
3484 /*
3485 * Padding just after the ISO-9660 filesystem.
3486 *
3487 * files_desc does not have an of_size function. For this
3488 * reason, we must insert us after the files content has been
3489 * generated.
3490 */
3491#ifdef UDF
3492 if (use_udf) {
3493 /* Single anchor volume descriptor pointer at end */
3494 outputlist_insert(&udf_end_anchor_vol_desc_frag);
3495 if (udf_end_anchor_vol_desc_frag.of_size != NULL) {
3496 (*udf_end_anchor_vol_desc_frag.of_size) (last_extent);
3497 }
3498 if (dopad) {
3499 /*
3500 * Pad with anchor volume descriptor pointer
3501 * blocks instead of zeroes.
3502 */
3503 outputlist_insert(&udf_padend_avdp_frag);
3504 if (udf_padend_avdp_frag.of_size != NULL) {
3505 (*udf_padend_avdp_frag.of_size) (last_extent);
3506 }
3507 }
3508 } else
3509#endif
3510 if (dopad && !(use_sparcboot || use_sunx86boot)) {
3512 if (endpad_desc.of_size != NULL) {
3513 (*endpad_desc.of_size) (last_extent);
3514 }
3515 }
3516 c = 0;
3517 if (use_sparcboot) {
3518 if (dopad) {
3519 /* Padding before the boot partitions. */
3521 if (interpad_desc.of_size != NULL) {
3522 (*interpad_desc.of_size) (last_extent);
3523 }
3524 }
3525 c = make_sun_label();
3526 last_extent += c;
3528 if (dopad) {
3530 if (endpad_desc.of_size != NULL) {
3531 (*endpad_desc.of_size) (last_extent);
3532 }
3533 }
3534 } else if (use_sunx86boot) {
3535 if (dopad) {
3536 /* Padding before the boot partitions. */
3538 if (interpad_desc.of_size != NULL) {
3539 (*interpad_desc.of_size) (last_extent);
3540 }
3541 }
3542 c = make_sunx86_label();
3543 last_extent += c;
3545 if (dopad) {
3547 if (endpad_desc.of_size != NULL) {
3548 (*endpad_desc.of_size) (last_extent);
3549 }
3550 }
3551 }
3552 if (print_size > 0) {
3553 if (verbose > 0)
3555 _("Total extents scheduled to be written = %u\n"),
3557 printf("%u\n", (last_extent - session_start));
3558 exit(0);
3559 }
3560 /*
3561 * Now go through the list of fragments and write the data that
3562 * corresponds to each one.
3563 */
3564 for (opnt = out_list; opnt; opnt = opnt->of_next) {
3565 Uint oext;
3566
3567 oext = last_extent_written;
3568 if (opnt->of_start_extent != 0 &&
3570 /*
3571 * Consistency check.
3572 * XXX Should make sure that all entries have
3573 * XXXX of_start_extent set up correctly.
3574 */
3576 _("Implementation botch: %s should start at %u but starts at %u.\n"),
3578 }
3579 if (opnt->of_write != NULL) {
3580 if (verbose > 1)
3581 fprintf(stderr, _("Writing: %-40sStart Block %u\n"),
3583 (*opnt->of_write) (discimage);
3584 if (verbose > 1)
3585 fprintf(stderr, _("Done with: %-40sBlock(s) %u\n"),
3586 opnt->of_name, last_extent_written-oext);
3587 }
3588 }
3591 _("Implementation botch: FS should end at %u but ends at %u.\n"),
3593 }
3594
3595 if (verbose > 0) {
3596#ifdef HAVE_SBRK
3597 fprintf(stderr, _("Max brk space used %x\n"),
3598 (unsigned int)(((unsigned long) sbrk(0)) - mem_start));
3599#endif
3600 fprintf(stderr, _("%u extents written (%u MB)\n"),
3602 (last_extent-session_start) >> 9);
3603 }
3604#ifdef VMS
3605 return (1);
3606#else
3607 return (0);
3608#endif
3609}
3610
3611LOCAL void
3613{
3614 int n;
3615
3616 n = sic_list(stdout);
3617 if (n <= 0) {
3618 const char *ins_base = sic_base();
3619
3620 if (ins_base == NULL)
3621 ins_base = "$INS_BASE/lib/siconv/";
3622 errmsgno(EX_BAD, _("Installation problem: '%s' %s.\n"),
3623 ins_base, n < 0 ? _("missing"):_("incomplete"));
3624 if (n == 0) {
3626 _("Check '%s' for missing translation tables.\n"),
3627 ins_base);
3628 }
3629 }
3630#ifdef USE_ICONV
3631 if (n > 0) {
3633 _("'iconv -l' lists more available names.\n"));
3634 }
3635#endif
3636}
3637
3638/*
3639 * Find unescaped equal sign in graft pointer string.
3640 */
3641EXPORT char *
3643 char *s;
3644{
3645 char *p = s;
3646
3647 while ((p = strchr(p, '=')) != NULL) {
3648 if (p > s && p[-1] != '\\')
3649 return (p);
3650 p++;
3651 }
3652 return (NULL);
3653}
3654
3655/*
3656 * Find unescaped equal sign in string.
3657 */
3658LOCAL char *
3659escstrcpy(to, tolen, from)
3660 char *to;
3661 size_t tolen;
3662 char *from;
3663{
3664 char *p = to;
3665
3666 if (debug)
3667 error("FROM: '%s'\n", from);
3668
3669 to[0] = '\0';
3670 if (tolen > 0) {
3671 to[--tolen] = '\0'; /* Fill in last nul char */
3672 }
3673 while ((*p = *from++) != '\0' && tolen-- > 0) {
3674 if (*p == '\\') {
3675 if ((*p = *from++) == '\0')
3676 break;
3677 if (*p != '\\' && *p != '=') {
3678 p[1] = p[0];
3679 *p++ = '\\';
3680 }
3681 }
3682 p++;
3683 }
3684 if (debug)
3685 error("ESC: '%s'\n", to);
3686 return (to);
3687}
3688
3689struct directory *
3690get_graft(arg, graft_point, glen, nodename, nlen, short_namep, do_insert)
3691 char *arg;
3692 char *graft_point;
3693 size_t glen;
3694 char *nodename;
3695 size_t nlen;
3696 char **short_namep;
3697 BOOL do_insert;
3698{
3699 char *node = NULL;
3700 struct directory_entry de;
3701 struct directory *graft_dir = root;
3702 struct stat st;
3703 char *short_name;
3704 int status;
3705
3706 fillbytes(&de, sizeof (de), '\0');
3707 /*
3708 * We would like a syntax like:
3709 *
3710 * /tmp=/usr/tmp/xxx
3711 *
3712 * where the user can specify a place to graft each component
3713 * of the tree. To do this, we may have to create directories
3714 * along the way, of course. Secondly, I would like to allow
3715 * the user to do something like:
3716 *
3717 * /home/baz/RMAIL=/u3/users/baz/RMAIL
3718 *
3719 * so that normal files could also be injected into the tree
3720 * at an arbitrary point.
3721 *
3722 * The idea is that the last component of whatever is being
3723 * entered would take the name from the last component of
3724 * whatever the user specifies.
3725 *
3726 * The default will be that the file is injected at the root of
3727 * the image tree.
3728 */
3729 node = findgequal(arg);
3730 if (!use_graft_ptrs)
3731 node = NULL;
3732 /*
3733 * Remove '\\' escape chars which are located
3734 * before '\\' and '=' chars ---> below in escstrcpy()
3735 */
3736
3737 short_name = NULL;
3738
3739 if (node != NULL || reloc_root) {
3740 char *pnt;
3741 char *xpnt;
3742 size_t len;
3743
3744 /* insert -root prefix */
3745 if (reloc_root != NULL) {
3746 strlcpy(graft_point, reloc_root, glen);
3747 len = strlen(graft_point);
3748
3749 if ((len < (glen -1)) &&
3750 (len == 0 || graft_point[len-1] != '/')) {
3751 graft_point[len++] = '/';
3752 graft_point[len] = '\0';
3753 }
3754 } else {
3755 len = 0;
3756 }
3757
3758 if (node) {
3759 *node = '\0';
3760 escstrcpy(&graft_point[len], glen - len, arg);
3761 *node = '=';
3762 }
3763
3764 /*
3765 * Remove unwanted "./" & "/" sequences from start...
3766 */
3767 do {
3768 xpnt = graft_point;
3769 while (xpnt[0] == '.' && xpnt[1] == '/')
3770 xpnt += 2;
3771 while (*xpnt == PATH_SEPARATOR) {
3772 xpnt++;
3773 }
3774 /*
3775 * The string becomes shorter, there is no need to check
3776 * the length. Make sure to support overlapping strings.
3777 */
3778 ovstrcpy(graft_point, xpnt);
3779 } while (xpnt > graft_point);
3780
3781 if (node) {
3782 node = escstrcpy(nodename, nlen, ++node);
3783 } else {
3784 node = arg;
3785 }
3786
3787 graft_dir = root;
3788 xpnt = graft_point;
3789
3790 /*
3791 * If "node" points to a directory, then graft_point
3792 * needs to point to a directory too.
3793 */
3794 if (follow_links)
3795 status = stat_filter(node, &st);
3796 else
3797 status = lstat_filter(node, &st);
3798 if (status == 0 && S_ISDIR(st.st_mode)) {
3799 len = strlen(graft_point);
3800
3801 if ((len < (glen -1)) &&
3802 (len == 0 || graft_point[len-1] != '/')) {
3803 graft_point[len++] = '/';
3804 graft_point[len] = '\0';
3805 }
3806 }
3807 if (debug)
3808 error("GRAFT:'%s'\n", xpnt);
3809 /*
3810 * Loop down deeper and deeper until we find the
3811 * correct insertion spot.
3812 * Canonicalize the filename while parsing it.
3813 */
3814 for (;;) {
3815 do {
3816 while (xpnt[0] == '.' && xpnt[1] == '/')
3817 xpnt += 2;
3818 while (xpnt[0] == '/')
3819 xpnt += 1;
3820 if (xpnt[0] == '.' && xpnt[1] == '.' && xpnt[2] == '/') {
3821 if (graft_dir && graft_dir != root) {
3822 graft_dir = graft_dir->parent;
3823 xpnt += 2;
3824 }
3825 }
3826 } while ((xpnt[0] == '/') || (xpnt[0] == '.' && xpnt[1] == '/'));
3827 pnt = strchr(xpnt, PATH_SEPARATOR);
3828 if (pnt == NULL) {
3829 if (*xpnt != '\0') {
3830 short_name = xpnt;
3831 if (short_namep)
3832 *short_namep = xpnt;
3833 }
3834 break;
3835 }
3836 *pnt = '\0';
3837 if (debug) {
3838 error("GRAFT Point:'%s' in '%s : %s' (%s)\n",
3839 xpnt,
3840 graft_dir->whole_name,
3841 graft_dir->de_name,
3842 graft_point);
3843 }
3844 graft_dir = find_or_create_directory(graft_dir,
3845 graft_point,
3846 NULL, TRUE);
3847 *pnt = PATH_SEPARATOR;
3848 xpnt = pnt + 1;
3849 }
3850 } else {
3851 graft_dir = root;
3852 if (use_graft_ptrs)
3853 node = escstrcpy(nodename, nlen, arg);
3854 else
3855 node = arg;
3856 }
3857
3858 /*
3859 * Now see whether the user wants to add a regular file, or a
3860 * directory at this point.
3861 */
3862 if (follow_links || Hflag)
3863 status = stat_filter(node, &st);
3864 else
3865 status = lstat_filter(node, &st);
3866 if (status != 0) {
3867 /*
3868 * This is a fatal error - the user won't be getting
3869 * what they want if we were to proceed.
3870 */
3871 comerr(_("Invalid node - '%s'.\n"), node);
3872 } else {
3873 if (S_ISDIR(st.st_mode)) {
3874 if (debug) {
3875 error(_("graft_dir: '%s : %s', node: '%s', (scan)\n"),
3876 graft_dir->whole_name,
3877 graft_dir->de_name, node);
3878 }
3879 if (!do_insert)
3880 return (graft_dir);
3881 if (!scan_directory_tree(graft_dir,
3882 node, &de)) {
3883 exit(1);
3884 }
3885 if (debug) {
3886 error(_("scan done\n"));
3887 }
3888 } else {
3889 if (short_name == NULL) {
3892 if (short_name == NULL ||
3893 short_name < node) {
3894 short_name = node;
3895 } else {
3896 short_name++;
3897 }
3898 }
3899 if (debug) {
3900 error(_("graft_dir: '%s : %s', node: '%s', short_name: '%s'\n"),
3901 graft_dir->whole_name,
3902 graft_dir->de_name, node,
3903 short_name);
3904 }
3905 if (!do_insert)
3906 return (graft_dir);
3907 if (!insert_file_entry(graft_dir, node,
3908 short_name, NULL, 0)) {
3909 /*
3910 * Should we ignore this?
3911 */
3912/* exit(1);*/
3913 /* EMPTY */
3914 }
3915 }
3916 }
3917 return (graft_dir);
3918}
3919
3920EXPORT void *
3922 size_t size;
3923{
3924 void *pt = 0;
3925
3926 if (size == 0)
3927 size = 1;
3928 if ((pt = malloc(size)) == NULL) {
3929 comerr(_("Not enough memory\n"));
3930 }
3931 /*
3932 * Not all code is clean yet.
3933 * Filling all allocated data with zeroes will help
3934 * to avoid core dumps.
3935 */
3936 memset(pt, 0, size);
3937 return (pt);
3938}
3939
3940EXPORT char *
3942 const char *s;
3943{
3944 char *ret = strdup(s);
3945
3946 if (s == NULL)
3947 comerr(_("Not enough memory for strdup(%s)\n"), s);
3948 return (ret);
3949}
3950
3951/*
3952 * A strcpy() that works with overlapping buffers
3953 */
3954LOCAL void
3956 register char *p2;
3957 register char *p1;
3958{
3959 while ((*p2++ = *p1++) != '\0')
3960 ;
3961}
3962
3963LOCAL void
3965 char *name;
3966{
3967 struct stat stbuf;
3968
3970 archive_dev = (dev_t)0;
3971 archive_ino = (ino_t)0;
3972
3973 if (name == NULL)
3974 return;
3975 if (stat(name, &stbuf) < 0)
3976 return;
3977
3978 if (S_ISREG(stbuf.st_mode)) {
3979 archive_dev = stbuf.st_dev;
3980 archive_ino = stbuf.st_ino;
3982 } else if (((stbuf.st_mode & S_IFMT) == 0) ||
3983 S_ISFIFO(stbuf.st_mode) ||
3984 S_ISSOCK(stbuf.st_mode)) {
3985 /*
3986 * This is a pipe or similar on different UNIX implementations.
3987 * (stbuf.st_mode & S_IFMT) == 0 may happen in stange cases.
3988 */
3990 archive_ino = (ino_t)-1;
3991 }
3992}
static int argc
Definition: ServiceArgs.c:12
#define ENOENT
Definition: acclib.h:79
char * strcat(char *DstString, const char *SrcString)
Definition: utclib.c:568
#define islower(c)
Definition: acclib.h:72
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
#define isalpha(c)
Definition: acclib.h:74
char * strstr(char *String1, char *String2)
Definition: utclib.c:653
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
int toupper(int c)
Definition: utclib.c:881
char * strchr(const char *String, int ch)
Definition: utclib.c:501
#define stat
Definition: acwin.h:99
#define fileno
Definition: acwin.h:102
#define O_BINARY
Definition: acwin.h:109
#define gettimeofday(tv, tz)
Definition: adns_win32.h:159
static int state
Definition: maze.c:121
const WCHAR * short_name
Definition: reg.c:29
#define VERSION
Definition: rdesktop.h:45
#define PATH_MAX
Definition: types.h:280
#define S_ISDIR(mode)
Definition: various.h:18
#define S_ISREG(mode)
Definition: various.h:17
long uid_t
Definition: various.h:8
uid_t getuid()
Definition: uid.c:27
size_t strlcpy(char *d, const char *s, size_t bufsize)
Definition: compat.c:3
#define SECTOR_SIZE
Definition: fs.h:22
#define UConst
Definition: ccomdefs.h:72
EXPORT int errconfig(char *name)
Definition: checkerr.c:67
EXPORT void comerrno(int err, char *msg, va_alist)
Definition: comerr.c:137
EXPORT int errmsgno(int err, char *msg, va_alist)
Definition: comerr.c:219
EXPORT void comexit(int err)
Definition: comerr.c:331
EXPORT void comerr(char *msg, va_alist)
Definition: comerr.c:84
EXPORT int errmsg(char *msg, va_alist)
Definition: comerr.c:192
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define PREPARER_DEFAULT
Definition: defaults.h:9
#define COPYRIGHT_DEFAULT
Definition: defaults.h:18
#define VOLSET_ID_DEFAULT
Definition: defaults.h:21
#define SYSTEM_ID_DEFAULT
Definition: defaults.h:153
#define VOLUME_ID_DEFAULT
Definition: defaults.h:22
#define PUBLISHER_DEFAULT
Definition: defaults.h:10
#define BIBLIO_DEFAULT
Definition: defaults.h:19
#define BOOT_CATALOG_DEFAULT
Definition: defaults.h:23
#define BOOT_IMAGE_DEFAULT
Definition: defaults.h:24
#define APPID_DEFAULT
Definition: defaults.h:15
#define ABSTRACT_DEFAULT
Definition: defaults.h:20
#define NULL
Definition: types.h:112
UINT gid_t
Definition: types.h:89
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
#define off_t
Definition: dosfsck.h:5
#define pt(x, y)
Definition: drawing.c:79
_In_ uint64_t _In_ uint64_t _In_ uint64_t _In_opt_ traverse_ptr * tp
Definition: btrfs.c:2996
#define NODEV
Definition: fs.h:27
int main()
Definition: test.c:6
__kernel_dev_t dev_t
Definition: linux.h:197
__kernel_time_t time_t
Definition: linux.h:252
__kernel_ino_t ino_t
Definition: linux.h:198
__kernel_off_t off_t
Definition: linux.h:201
EXPORT void insert_boot_cat()
Definition: eltorito.c:124
EXPORT void init_boot_catalog(char *path) const
Definition: eltorito.c:67
struct output_fragment torito_desc
Definition: eltorito.c:686
EXPORT int new_boot_entry()
Definition: eltorito.c:650
EXPORT void get_boot_entry()
Definition: eltorito.c:629
#define S_ISSOCK(m)
Definition: ext2fs.h:372
#define S_ISFIFO(m)
Definition: ext2fs.h:378
#define S_IFMT
Definition: ext2fs.h:358
unsigned int BOOL
Definition: ntddk_ex.h:94
EXPORT char * fillbytes(void *tov, ssize_t cnt, char val)
Definition: fillbytes.c:36
#define printf
Definition: freeldr.h:97
#define local
Definition: zutil.h:30
#define BADFLAG
Definition: getargs.h:58
#define NOARGS
Definition: getargs.h:57
#define GA_NO_PROPS
Definition: getargs.h:105
EXPORT int geterrno()
Definition: geterrno.c:34
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLdouble s
Definition: gl.h:2039
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLuint GLuint end
Definition: gl.h:1545
GLdouble GLdouble t
Definition: gl.h:2047
GLsizeiptr size
Definition: glext.h:5919
GLdouble n
Definition: glext.h:7729
const GLubyte * c
Definition: glext.h:8905
GLenum pname
Definition: glext.h:5645
GLfloat f
Definition: glext.h:7540
GLbitfield flags
Definition: glext.h:7161
GLuint GLfloat * val
Definition: glext.h:7180
GLuint GLint GLboolean GLint GLenum access
Definition: glext.h:7866
GLfloat GLfloat p
Definition: glext.h:8902
GLenum GLsizei len
Definition: glext.h:6722
GLuint64EXT * result
Definition: glext.h:11304
GLsizeiptr const GLvoid GLenum usage
Definition: glext.h:5919
const GLfloat * m
Definition: glext.h:10848
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
#define _(X)
Definition: i386-dis.c:35
#define LC_ALL
Definition: locale.h:17
_Check_return_ _CRTIMP FILE *__cdecl freopen(_In_z_ const char *_Filename, _In_z_ const char *_Mode, _Inout_ FILE *_File)
#define stdout
Definition: stdio.h:99
_Check_return_ _CRTIMP int __cdecl ferror(_In_ FILE *_File)
#define stderr
Definition: stdio.h:100
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
_Check_return_opt_ _CRTIMP int __cdecl fflush(_Inout_opt_ FILE *_File)
_Check_return_ _CRTIMP FILE *__cdecl fopen(_In_z_ const char *_Filename, _In_z_ const char *_Mode)
_Check_return_opt_ _CRTIMP int __cdecl fputc(_In_ int _Ch, _Inout_ FILE *_File)
#define stdin
Definition: stdio.h:98
_Check_return_opt_ _CRTIMP char *__cdecl fgets(_Out_writes_z_(_MaxCount) char *_Buf, _In_ int _MaxCount, _Inout_ FILE *_File)
_Check_return_opt_ _CRTIMP int __cdecl fclose(_Inout_ FILE *_File)
#define _IOFBF
Definition: stdio.h:127
_Check_return_opt_ _CRTIMP int __cdecl setvbuf(_Inout_ FILE *_File, _Inout_updates_opt_z_(_Size) char *_Buf, _In_ int _Mode, _In_ size_t _Size)
_Check_return_ int __cdecl atoi(_In_z_ const char *_Str)
_Check_return_ long __cdecl strtol(_In_z_ const char *_Str, _Out_opt_ _Deref_post_z_ char **_EndPtr, _In_ int _Radix)
_Check_return_ char *__cdecl getenv(_In_z_ const char *_VarName)
const char * filename
Definition: ioapi.h:137
#define MAX_ISONAME_V1
Definition: iso9660.h:238
#define MAX_ISONAME
Definition: iso9660.h:242
#define EL_TORITO_ARCH_PPC
Definition: iso9660.h:51
#define LEN_ISONAME
Definition: iso9660.h:237
#define EL_TORITO_ARCH_EFI
Definition: iso9660.h:53
#define EL_TORITO_ARCH_MAC
Definition: iso9660.h:52
#define MAX_ISONAME_V2
Definition: iso9660.h:239
#define EL_TORITO_ARCH_x86
Definition: iso9660.h:50
#define MAX_ISONAME_V2_RR
Definition: iso9660.h:240
uint32_t sector
Definition: isohybrid.c:61
EXPORT UInt32_t get_733(void *vp)
Definition: isonum.c:219
#define LOCAL(type)
Definition: jmorecfg.h:289
struct output_fragment jpathtable_desc
Definition: joliet.c:1455
struct output_fragment joliet_desc
Definition: joliet.c:1454
EXPORT int joliet_sort_tree(struct directory *node)
Definition: joliet.c:1317
struct output_fragment jdirtree_desc
Definition: joliet.c:1456
static const int digits[]
Definition: decode.c:71
#define f
Definition: ke_i.h:83
#define c
Definition: ke_i.h:80
#define resource
Definition: kernel32.h:9
static char * program_name
Definition: mkdosfs.c:519
__u16 time
Definition: mkdosfs.c:8
#define error(str)
Definition: mkdosfs.c:1605
EXPORT int j_add_list(char *fn)
Definition: match.c:336
EXPORT int j_add_match(char *fn)
Definition: match.c:260
EXPORT int h_add_match(char *fn)
Definition: match.c:236
EXPORT int h_add_list(char *fn)
Definition: match.c:328
EXPORT int add_list(char *fn)
Definition: match.c:312
EXPORT int i_add_list(char *fn)
Definition: match.c:320
EXPORT int u_add_match(char *fn)
Definition: match.c:271
EXPORT int u_add_list(char *fn)
Definition: match.c:344
EXPORT int i_add_match(char *fn)
Definition: match.c:225
EXPORT void gen_del_match(int n)
Definition: match.c:395
#define MAX_MAT
Definition: match.h:32
#define j_ishidden()
Definition: match.h:78
#define u_ishidden()
Definition: match.h:82
#define i_ishidden()
Definition: match.h:74
LOCAL int walkflags
Definition: mkisofs.c:218
LOCAL int dolegacy(char *arg, void *valp, int *pac, char *const **pav, const char *opt) const
Definition: mkisofs.c:1002
char * icharset
Definition: mkisofs.c:157
int jlen
Definition: mkisofs.c:114
EXPORT char * findgequal(char *s)
Definition: mkisofs.c:3642
int pversion
Definition: mkisofs.c:195
int print_size
Definition: mkisofs.c:155
int osecsize
Definition: mkisofs.c:112
int verbose
Definition: mkisofs.c:128
EXPORT int iso9660_date(char *result, time_t crtime)
Definition: mkisofs.c:1868
const char * optend(char *fmt) const
Definition: mkisofs.c:1691
int not_bootable
Definition: mkisofs.c:102
int use_sunx86boot
Definition: mkisofs.c:108
int printopts(FILE *f, const char *fmt, const char *arg, int twod)
Definition: mkisofs.c:1716
char * gid_str
Definition: mkisofs.c:183
LOCAL int getP(char *arg, void *valp, int *pac, char *const **pav, const char *opt) const
Definition: mkisofs.c:973
char *abstract char * volset_id
Definition: mkisofs.c:165
int rationalize_dirmode
Definition: mkisofs.c:147
LOCAL int get_boot_size(char *opt_arg)
Definition: mkisofs.c:476
int ucs_level
Definition: mkisofs.c:171
int allow_multidot
Definition: mkisofs.c:249
int match_igncase
Definition: mkisofs.c:231
int volume_sequence_number
Definition: mkisofs.c:173
int use_eltorito
Definition: mkisofs.c:100
char * extension_record
Definition: mkisofs.c:90
LOCAL int get_boot_table(char *opt_arg)
Definition: mkisofs.c:534
char * path_table_m
Definition: mkisofs.c:1632
int rationalize_xa
Definition: mkisofs.c:196
struct rcopts rcopt[]
Definition: mkisofs.c:344
char * ocharset
Definition: mkisofs.c:158
FILE * discimage
Definition: mkisofs.c:74
char * check_image
Definition: mkisofs.c:176
int no_emul_boot
Definition: mkisofs.c:103
char * copyright
Definition: mkisofs.c:162
int check_session
Definition: mkisofs.c:99
int cache_inodes
Definition: mkisofs.c:141
int volume_set_size
Definition: mkisofs.c:172
int max_filenames
Definition: mkisofs.c:187
int path_ind
Definition: mkisofs.c:69
int jhide_trans_tbl
Definition: mkisofs.c:232
BOOL correct_inodes
Definition: mkisofs.c:324
int transparent_compression
Definition: mkisofs.c:235
const char * docstr(char *str, int *no_help) const
Definition: mkisofs.c:1763
struct timeval tv_begun
Definition: write.c:306
char * cdrecord_data
Definition: multi.c:1748
uid_t uid_to_use
Definition: mkisofs.c:148
int allow_lowercase
Definition: mkisofs.c:247
LOCAL int get_hd_boot(char *opt_arg)
Definition: mkisofs.c:425
char * boot_catalog
Definition: mkisofs.c:168
char * jpath_table_l
Definition: mkisofs.c:1634
LOCAL int get_ldate(char *opt_arg, void *valp)
Definition: mkisofs.c:832
int iso9660_level
Definition: mkisofs.c:242
int new_dir_mode
Definition: mkisofs.c:152
struct iso_directory_record root_record
Definition: mkisofs.c:87
char * volume_id
Definition: mkisofs.c:166
LOCAL const struct mki_option mki_options[]
Definition: mkisofs.c:1045
struct eltorito_boot_entry_info * current_boot_entry
Definition: mkisofs.c:228
off_t maxnonlarge
Definition: mkisofs.c:241
UInt32_t session_start
Definition: mkisofs.c:77
char * new_dirmode_str
Definition: mkisofs.c:189
int no_rr
Definition: mkisofs.c:237
int load_size
Definition: mkisofs.c:105
int rationalize
Definition: mkisofs.c:143
LOCAL void list_locales()
Definition: mkisofs.c:3612
int hide_rr_moved
Definition: mkisofs.c:233
char * biblio
Definition: mkisofs.c:163
int goof
Definition: mkisofs.c:1637
UInt32_t next_extent
Definition: mkisofs.c:75
#define dysize(A)
Definition: mkisofs.c:723
ldate modification_date
Definition: mkisofs.c:197
char * sectype
Definition: mkisofs.c:192
char * reloc_root
Definition: mkisofs.c:177
char version_string[]
Definition: mkisofs.c:71
static UConst char sccsid[]
Definition: mkisofs.c:4
int iso_translate
Definition: mkisofs.c:250
int rationalize_rr
Definition: mkisofs.c:191
char * stream_filename
Definition: mkisofs.c:261
char * reloc_old_root
Definition: mkisofs.c:178
int all_files
Definition: mkisofs.c:132
char * path_table_l
Definition: mkisofs.c:1631
unsigned int path_table_size
Definition: mkisofs.c:78
struct eltorito_boot_entry_info * first_boot_entry
Definition: mkisofs.c:226
LOCAL int get_boot_image(char *opt_arg)
Definition: mkisofs.c:408
LOCAL int getH(char *arg, void *valp, int *pac, char *const **pav, const char *opt) const
Definition: mkisofs.c:914
struct iso_directory_record jroot_record
Definition: mkisofs.c:88
LOCAL void susage(int excode)
Definition: mkisofs.c:1648
UInt32_t null_inodes
Definition: mkisofs.c:323
char * boot_image
Definition: mkisofs.c:169
int stream_media_size
Definition: mkisofs.c:260
int disable_deep_reloc
Definition: mkisofs.c:180
char * pathnames
Definition: mkisofs.c:190
int use_RockRidge
Definition: mkisofs.c:110
int rationalize_gid
Definition: mkisofs.c:145
unsigned int jpath_table_size
Definition: mkisofs.c:83
int split_SL_component
Definition: mkisofs.c:257
int omit_version_number
Definition: mkisofs.c:236
char * merge_image
Definition: mkisofs.c:175
int gui
Definition: mkisofs.c:130
ino_t archive_ino
Definition: mkisofs.c:95
BOOL archive_isreg
Definition: mkisofs.c:93
int force_rr
Definition: mkisofs.c:238
LOCAL int mosize(int y, int m)
Definition: mkisofs.c:728
char * trans_tbl
Definition: mkisofs.c:259
BOOL Hflag
Definition: mkisofs.c:133
LOCAL int get_boot_platid(char *opt_arg)
Definition: mkisofs.c:495
LOCAL int get_ne_boot(char *opt_arg)
Definition: mkisofs.c:436
unsigned int jpath_table[4]
Definition: mkisofs.c:84
int joliet_long
Definition: mkisofs.c:185
int filemode_to_use
Definition: mkisofs.c:150
int rationalize_uid
Definition: mkisofs.c:144
EXPORT void * e_malloc(size_t size)
Definition: mkisofs.c:3921
LOCAL int getL(char *arg, void *valp, int *pac, char *const **pav, const char *opt) const
Definition: mkisofs.c:944
BOOL long_rr_time
Definition: mkisofs.c:326
LOCAL void checkarch(char *name)
Definition: mkisofs.c:3964
struct eltorito_boot_entry_info * last_boot_entry
Definition: mkisofs.c:227
char * appid
Definition: mkisofs.c:161
int hard_disk_boot
Definition: mkisofs.c:101
struct directory * root
Definition: mkisofs.c:68
int untranslated_filenames
Definition: mkisofs.c:194
int relaxed_filenames
Definition: mkisofs.c:246
LOCAL void ovstrcpy(char *p2, char *p1)
Definition: mkisofs.c:3955
int allow_leading_dots
Definition: mkisofs.c:251
LOCAL void read_rcfile(char *appname)
Definition: mkisofs.c:1489
int split_SL_field
Definition: mkisofs.c:258
BOOL legacy
Definition: mkisofs.c:131
#define TRUE
Definition: mkisofs.c:1640
#define FALSE
Definition: mkisofs.c:1644
int boot_info_table
Definition: mkisofs.c:106
int omit_period
Definition: mkisofs.c:234
int rationalize_filemode
Definition: mkisofs.c:146
unsigned int path_blocks
Definition: mkisofs.c:80
unsigned int jpath_blocks
Definition: mkisofs.c:85
char * jcharset
Definition: mkisofs.c:186
int help
Definition: mkisofs.c:184
LOCAL char * strntoi(char *p, int n, int *ip)
Definition: mkisofs.c:698
int use_graft_ptrs
Definition: mkisofs.c:230
int extension_record_size
Definition: mkisofs.c:92
struct directory * get_graft(char *arg, char *graft_point, size_t glen, char *nodename, size_t nlen, char **short_namep, BOOL do_insert)
Definition: mkisofs.c:3690
int iso9660_namelen
Definition: mkisofs.c:243
int load_addr
Definition: mkisofs.c:104
static int dmsize[12]
Definition: mkisofs.c:725
char * log_file
Definition: mkisofs.c:188
char * filemode_str
Definition: mkisofs.c:182
BOOL follow_links
Definition: mkisofs.c:134
char * preparer
Definition: mkisofs.c:159
UInt32_t extension_record_extent
Definition: mkisofs.c:91
int debug
Definition: mkisofs.c:129
EXPORT int iso9660_ldate(char *result, time_t crtime, int nsec, int gmtoff)
Definition: mkisofs.c:1907
int no_allow_lowercase
Definition: mkisofs.c:248
LOCAL char * get_pnames(int argc, char *const *argv, int opt, char *pname, int pnsize, FILE *fp)
Definition: mkisofs.c:1969
char * uid_str
Definition: mkisofs.c:193
siconvt_t * in_nls
Definition: mkisofs.c:332
LOCAL BOOL data_change_warn
Definition: mkisofs.c:224
char * genboot_image
Definition: mkisofs.c:170
LOCAL int get_no_boot(char *opt_arg)
Definition: mkisofs.c:447
char * outfile
Definition: mkisofs.c:73
int nolimitpathtables
Definition: mkisofs.c:245
EXPORT char * e_strdup(char *s) const
Definition: mkisofs.c:3941
siconvt_t * out_nls
Definition: mkisofs.c:333
LOCAL struct ga_flags * gl_flags
Definition: mkisofs.c:999
int generate_tables
Definition: mkisofs.c:153
unsigned int path_table[4]
Definition: mkisofs.c:79
gid_t gid_to_use
Definition: mkisofs.c:149
char * system_id
Definition: mkisofs.c:167
Uint RR_relocation_depth
Definition: mkisofs.c:239
char * publisher
Definition: mkisofs.c:160
char * jpath_table_m
Definition: mkisofs.c:1635
int use_genboot
Definition: mkisofs.c:109
LOCAL void ldate_error(char *arg)
Definition: mkisofs.c:691
int full_iso9660_filenames
Definition: mkisofs.c:244
LOCAL char * escstrcpy(char *to, size_t tolen, char *from)
Definition: mkisofs.c:3659
dev_t archive_dev
Definition: mkisofs.c:94
LOCAL int save_pname
Definition: mkisofs.c:1043
int use_Joliet
Definition: mkisofs.c:113
int use_XA
Definition: mkisofs.c:111
int use_sparcboot
Definition: mkisofs.c:107
LOCAL int get_boot_addr(char *opt_arg)
Definition: mkisofs.c:458
time_t begun
Definition: write.c:305
int do_largefiles
Definition: mkisofs.c:240
int dirmode_to_use
Definition: mkisofs.c:151
LOCAL void hide_reloc_dir()
Definition: mkisofs.c:1947
#define OPTION_COUNT
Definition: mkisofs.c:1467
char * dirmode_str
Definition: mkisofs.c:181
int dopad
Definition: mkisofs.c:154
UInt32_t last_extent
Definition: mkisofs.c:76
int split_output
Definition: mkisofs.c:156
LOCAL char * parse_date(char *arg, struct tm *tp)
Definition: mkisofs.c:739
int use_fileversion
Definition: mkisofs.c:255
BOOL nodesc
Definition: mkisofs.c:202
int donotwrite_macpart
Definition: mkisofs.c:298
int check_oldnames
Definition: mkisofs.c:98
BOOL rrip112
Definition: mkisofs.c:325
struct output_fragment end_vol
Definition: write.c:3024
BOOL ignerr
Definition: multi.c:92
struct output_fragment * out_list
Definition: write.c:75
struct output_fragment strfile_desc
Definition: stream.c:255
#define NULL_INO_MAX
Definition: mkisofs.h:778
#define ELTORITO_BOOT_ID
Definition: mkisofs.h:321
struct output_fragment interpad_desc
Definition: write.c:3031
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
struct output_fragment files_desc
Definition: write.c:3030
int create_udfsymlinks
struct output_fragment startpad_desc
Definition: write.c:3021
struct output_fragment voldesc_desc
Definition: write.c:3022
#define JLONGMAX
Definition: mkisofs.h:420
struct output_fragment endpad_desc
Definition: write.c:3032
struct output_fragment extension_desc
Definition: write.c:3029
struct output_fragment strdir_desc
Definition: stream.c:256
#define JMAX
Definition: mkisofs.h:419
struct directory * reloc_dir
Definition: tree.c:111
struct output_fragment strpath_desc
Definition: stream.c:257
UInt32_t last_extent_written
Definition: write.c:303
siconvt_t * hfs_inls
#define STAT_INODE(X)
Definition: mkisofs.h:785
#define ISO_BLOCKS(X)
Definition: mkisofs.h:743
siconvt_t * hfs_onls
struct output_fragment xvoldesc_desc
Definition: write.c:3023
struct output_fragment pathtable_desc
Definition: write.c:3026
struct output_fragment dirtree_desc
Definition: write.c:3027
char * abstract
struct output_fragment version_desc
Definition: write.c:3025
struct output_fragment dirtree_clean
Definition: write.c:3028
#define INHIBIT_ISO9660_ENTRY
Definition: mkisofs.h:802
#define F_OK
Definition: util.h:52
static PVOID ptr
Definition: dispmode.c:27
#define sprintf(buf, format,...)
Definition: sprintf.c:55
#define argv
Definition: mplay32.c:18
int get_session_start(int *file_addr)
Definition: multi.c:1751
struct iso_directory_record * merge_isofs(char *path)
Definition: multi.c:1401
int rr_flags(struct iso_directory_record *idr)
Definition: multi.c:353
int merge_previous_session(struct directory *this_dir, struct iso_directory_record *mrootp, char *reloc_root, char *reloc_old_root)
Definition: multi.c:1811
int open_merge_image(char *path)
Definition: multi.c:1365
char er_id[256]
Definition: multi.c:96
int close_merge_image()
Definition: multi.c:1387
int su_version
Definition: multi.c:93
int rr_version
Definition: multi.c:94
void match_cl_re_entries()
Definition: multi.c:2131
EXPORT int readsecs(UInt32_t startsecno, void *buffer, int sectorcount)
Definition: multi.c:118
#define textdomain(a)
Definition: nlsdefs.h:78
#define bindtextdomain(d, dir)
Definition: nlsdefs.h:80
#define __(s)
Definition: nlsdefs.h:101
#define __PR(a)
Definition: prototyp.h:106
#define long
Definition: qsort.c:33
#define HOST_CPU
Definition: xconfig.h:220
#define HOST_VENDOR
Definition: xconfig.h:221
#define HOST_OS
Definition: xconfig.h:222
EXPORT char * generate_rr_extension_record(char *id, char *descriptor, char *source, int *size)
Definition: rock.c:903
#define RR_FLAG_AA
Definition: rock.h:38
#define RR_FLAG_ER
Definition: rock.h:42
#define RR_FLAG_XA
Definition: rock.h:39
#define RR_FLAG_SP
Definition: rock.h:37
const WCHAR * str
EXPORT void save_args(int ac, av)
Definition: saveargs.c:58
#define SIP_ANY_FILE
Definition: schily.h:428
#define SIP_NO_PATH
Definition: schily.h:430
#define ___malloc
Definition: schily.h:630
#define errno
Definition: errno.h:18
#define R_OK
Definition: io.h:171
_Check_return_ _CRTIMP char *__cdecl strdup(_In_opt_z_ const char *_Src)
_Check_return_ _CRTIMP _CONST_RETURN char *__cdecl strrchr(_In_z_ const char *_Str, _In_ int _Ch)
_CRTIMP struct tm *__cdecl gmtime(const time_t *_Time)
Definition: time.h:415
_CRTIMP time_t __cdecl mktime(struct tm *_Tm)
Definition: time.h:418
_CRTIMP struct tm *__cdecl localtime(const time_t *_Time)
Definition: time.h:416
#define exit(n)
Definition: config.h:202
#define memset(x, y, z)
Definition: compat.h:39
#define DEV_NULL
Definition: compat.h:28
#define setmode(f, m)
Definition: io.h:42
const char * ofmt
Definition: format.c:285
f_args fa
Definition: format.c:280
struct output_fragment sunboot_desc
Definition: boot.c:553
EXPORT int scan_sunx86_boot(char *files)
Definition: boot.c:182
EXPORT int sparc_boot_label(char *label)
Definition: boot.c:112
struct output_fragment sunlabel_desc
Definition: boot.c:554
EXPORT int make_sun_label()
Definition: boot.c:243
struct output_fragment genboot_desc
Definition: boot.c:555
EXPORT int make_sunx86_label()
Definition: boot.c:287
EXPORT int scan_sparc_boot(char *files)
Definition: boot.c:133
EXPORT int sunx86_boot_label(char *label)
Definition: boot.c:121
EXPORT void add_directory_hash(dev_t dev, ino_t inode)
Definition: hash.c:346
EXPORT int insert_file_entry(struct directory *this_dir, char *whole_path, char *short_name, struct stat *statp, int have_rsrc)
Definition: tree.c:1444
EXPORT int stat_filter(char *path, struct stat *st)
Definition: tree.c:232
EXPORT int sort_tree(struct directory *node)
Definition: tree.c:2842
EXPORT int lstat_filter(char *path, struct stat *st)
Definition: tree.c:244
EXPORT int scan_directory_tree(struct directory *this_dir, char *path, struct directory_entry *de)
Definition: tree.c:1147
EXPORT struct directory * find_or_create_directory(struct directory *parent, char *path, struct directory_entry *de, int flag)
Definition: tree.c:2508
EXPORT void outputlist_insert(struct output_fragment *frag)
Definition: write.c:1895
#define apple_hyb
#define dvd_aud_vid_flag
EXPORT char * searchfileinpath(char *name, int mode, int file_mode, char *path)
Definition: searchinpath.c:68
EXPORT int seterrno(int err)
Definition: seterrno.c:34
EXPORT int sic_list(FILE *f)
Definition: sic_nls.c:233
EXPORT siconvt_t * sic_open(char *charset)
Definition: sic_nls.c:160
LOCAL char * ins_base
Definition: sic_nls.c:73
EXPORT const char * sic_base()
Definition: sic_nls.c:186
CardRegion * from
Definition: spigame.cpp:19
#define EX_BAD
Definition: standard.h:62
EXPORT int streql(char *a, const char *b) const
Definition: streql.c:23
Definition: mkisofs.h:107
struct directory_entry * next
Definition: mkisofs.h:108
char * name
Definition: mkisofs.h:116
unsigned int de_flags
Definition: mkisofs.h:122
struct iso_directory_record isorec
Definition: mkisofs.h:110
struct directory * filedir
Definition: mkisofs.h:119
struct directory * parent
Definition: mkisofs.h:269
char * de_name
Definition: mkisofs.h:275
char * whole_name
Definition: mkisofs.h:273
Definition: mkisofs.h:311
Definition: dsound.c:943
Definition: ffs.h:70
Definition: dhcpd.h:62
char extent[ISODCL(3, 10)]
Definition: iso9660.h:248
Definition: mkisofs.h:331
int l_gmtoff
Definition: mkisofs.h:334
time_t l_sec
Definition: mkisofs.h:332
int l_usec
Definition: mkisofs.h:333
const char * doc
Definition: mkisofs.c:1039
struct ga_flags opt
Definition: mkisofs.c:1024
Definition: name.c:39
unsigned int of_start_extent
Definition: mkisofs.h:196
char * of_name
Definition: mkisofs.h:195
struct output_fragment * of_next
Definition: mkisofs.h:191
char * tag
Definition: mkisofs.c:340
char ** variable
Definition: mkisofs.c:341
iconv_t sic_cd2uni
Definition: siconv.h:42
char * sic_name
Definition: siconv.h:39
Definition: stat.h:55
unsigned short st_mode
Definition: stat.h:58
_dev_t st_dev
Definition: stat.h:56
_ino_t st_ino
Definition: stat.h:57
Definition: ps.c:97
Definition: time.h:68
int tm_year
Definition: time.h:74
int tm_hour
Definition: time.h:71
int tm_yday
Definition: time.h:76
int tm_min
Definition: time.h:70
Definition: mkisofs.h:79
char * name
Definition: mkisofs.h:81
void * dir
Definition: mkisofs.h:80
#define setlocale(n, s)
Definition: locale.h:46
long Llong
Definition: stdint.h:152
unsigned long Ullong
Definition: stdint.h:153
EXPORT char * getargerror(int err)
Definition: getargs.c:1335
EXPORT int getvargs(int *pac, pav, struct ga_props *props, struct ga_flags *vfmt)
Definition: getargs.c:226
EXPORT int setuid(uid_t uid)
Definition: uid.c:47
EXPORT int seteuid(uid_t uid)
Definition: uid.c:58
Definition: dlist.c:348
unsigned int Uint
Definition: utypes.h:43
unsigned char Uchar
Definition: utypes.h:45
static HRESULT add_match(IMatchCollection2 *iface, IMatch2 *add)
Definition: vbregexp.c:1020
int ret
void * arg
Definition: msvc.h:10
#define PATH_SEPARATOR
Definition: xmllint.c:205