VirtualBox

Ignore:
Timestamp:
Jun 13, 2017 2:32:01 PM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
116090
Message:

IPRT: ISO maker updates.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/fs/isomakercmd.cpp

    r67343 r67370  
    4242#include <iprt/mem.h>
    4343#include <iprt/message.h>
     44#include <iprt/path.h>
    4445#include <iprt/rand.h>
    4546#include <iprt/stream.h>
     
    4950
    5051/*********************************************************************************************************************************
     52*   Defined Constants And Macros                                                                                                 *
     53*********************************************************************************************************************************/
     54/** Maximum number of name specifiers we allow.  */
     55#define RTFSISOMAKERCMD_MAX_NAMES                       8
     56
     57/** @name Name specifiers
     58 * @{ */
     59#define RTFSISOMAKERCMDNAME_PRIMARY_ISO                 RT_BIT_32(0)
     60#define RTFSISOMAKERCMDNAME_PRIMARY_ISO_ROCK_RIDGE      RT_BIT_32(1)
     61#define RTFSISOMAKERCMDNAME_PRIMARY_ISO_TRANS_TBL       RT_BIT_32(2)
     62#define RTFSISOMAKERCMDNAME_JOLIET                      RT_BIT_32(3)
     63#define RTFSISOMAKERCMDNAME_JOLIET_ROCK_RIDGE           RT_BIT_32(4)
     64#define RTFSISOMAKERCMDNAME_JOLIET_TRANS_TBL            RT_BIT_32(5)
     65#define RTFSISOMAKERCMDNAME_UDF                         RT_BIT_32(6)
     66#define RTFSISOMAKERCMDNAME_UDF_TRANS_TBL               RT_BIT_32(7)
     67#define RTFSISOMAKERCMDNAME_HFS                         RT_BIT_32(8)
     68#define RTFSISOMAKERCMDNAME_HFS_TRANS_TBL               RT_BIT_32(9)
     69
     70#define RTFSISOMAKERCMDNAME_MAJOR_MASK \
     71        (RTFSISOMAKERCMDNAME_PRIMARY_ISO | RTFSISOMAKERCMDNAME_JOLIET | RTFSISOMAKERCMDNAME_UDF | RTFSISOMAKERCMDNAME_HFS)
     72#define RTFSISOMAKERCMDNAME_MINOR_MASK \
     73        ( RTFSISOMAKERCMDNAME_PRIMARY_ISO_ROCK_RIDGE | RTFSISOMAKERCMDNAME_PRIMARY_ISO_TRANS_TBL \
     74        | RTFSISOMAKERCMDNAME_JOLIET_ROCK_RIDGE      | RTFSISOMAKERCMDNAME_JOLIET_TRANS_TBL \
     75        | RTFSISOMAKERCMDNAME_UDF_TRANS_TBL \
     76        | RTFSISOMAKERCMDNAME_HFS_TRANS_TBL)
     77/** @} */
     78
     79/*********************************************************************************************************************************
    5180*   Structures and Typedefs                                                                                                      *
    5281*********************************************************************************************************************************/
     
    5887    RTFSISOMAKERCMD_OPT_OUTPUT_BUFFER_SIZE,
    5988    RTFSISOMAKERCMD_OPT_RANDOM_OUTPUT_BUFFER_SIZE,
     89    RTFSISOMAKERCMD_OPT_NAME_SETUP,
    6090
    6191    /*
     
    215245    bool                fRandomOutputReadBufferSize;
    216246
     247    /** @name Processing of inputs
     248     * @{ */
     249    /** The namespaces (RTFSISOMAKER_NAMESPACE_XXX) we're currently adding
     250     *  input to. */
     251    uint32_t            fDstNamespaces;
     252    /** The number of name specifiers we're currently operating with. */
     253    uint32_t            cNameSpecifiers;
     254    /** Name specifier configurations.
     255     * For instance given "name0=name1=name2=name3=source-file" we will add
     256     * source-file to the image with name0 as the name in the namespace and
     257     * sub-name specified by aNameSpecifiers[0], name1 in aNameSpecifiers[1],
     258     * and so on.  This allows exact control over which names a file will
     259     * have in each namespace (primary-iso, joliet, udf, hfs) and sub-namespace
     260     * (rock-ridge, trans.tbl).
     261     */
     262    uint32_t            afNameSpecifiers[RTFSISOMAKERCMD_MAX_NAMES];
     263    /** @} */
    217264
    218265    /** Number of items (files, directories, images, whatever) we've added. */
     
    221268typedef RTFSISOMAKERCMDOPTS *PRTFSISOMAKERCMDOPTS;
    222269typedef RTFSISOMAKERCMDOPTS const *PCRTFSISOMAKERCMDOPTS;
     270
     271
     272/**
     273 * Parsed name.
     274 */
     275typedef struct RTFSISOMAKERCMDPARSEDNAME
     276{
     277    /** Copy of the corresponding RTFSISOMAKERCMDOPTS::afNameSpecifiers
     278     * value. */
     279    uint32_t            fNameSpecifiers;
     280    /** The length of the specified path. */
     281    uint32_t            cchPath;
     282    /** Specified path. */
     283    char                szPath[RTPATH_MAX];
     284} RTFSISOMAKERCMDPARSEDNAME;
     285/** Pointer to a parsed name. */
     286typedef RTFSISOMAKERCMDPARSEDNAME *PRTFSISOMAKERCMDPARSEDNAME;
    223287
    224288
     
    238302    { "--output-buffer-size",           RTFSISOMAKERCMD_OPT_OUTPUT_BUFFER_SIZE,             RTGETOPT_REQ_UINT32  },
    239303    { "--random-output-buffer-size",    RTFSISOMAKERCMD_OPT_RANDOM_OUTPUT_BUFFER_SIZE,      RTGETOPT_REQ_NOTHING },
     304    { "--name-setup",                   RTFSISOMAKERCMD_OPT_NAME_SETUP,                     RTGETOPT_REQ_STRING },
    240305
    241306
     
    243308     * genisoimage/mkisofs compatibility:
    244309     */
    245     { "--abstract",                     RTFSISOMAKERCMD_OPT_ABSTRACT_FILE_ID,               RTGETOPT_REQ_STRING  },
    246     { "-abstract",                      RTFSISOMAKERCMD_OPT_ABSTRACT_FILE_ID,               RTGETOPT_REQ_STRING  },
     310#define DD(a_szLong, a_chShort, a_fFlags) { a_szLong, a_chShort, a_fFlags  }, { "-" a_szLong, a_chShort, a_fFlags  }
     311    DD("-abstract",                      RTFSISOMAKERCMD_OPT_ABSTRACT_FILE_ID,               RTGETOPT_REQ_STRING ),
    247312    { "--application-id",               'A',                                                RTGETOPT_REQ_STRING  },
    248     { "--allow-limited-size",           RTFSISOMAKERCMD_OPT_ALLOW_LIMITED_SIZE,             RTGETOPT_REQ_NOTHING },
    249     { "-allow-limited-size",            RTFSISOMAKERCMD_OPT_ALLOW_LIMITED_SIZE,             RTGETOPT_REQ_NOTHING },
    250     { "--allow-leading-dots",           RTFSISOMAKERCMD_OPT_ALLOW_LEADING_DOTS,             RTGETOPT_REQ_NOTHING },
    251     { "-allow-leading-dots",            RTFSISOMAKERCMD_OPT_ALLOW_LEADING_DOTS,             RTGETOPT_REQ_NOTHING },
    252     { "--ldots",                        RTFSISOMAKERCMD_OPT_ALLOW_LEADING_DOTS,             RTGETOPT_REQ_NOTHING },
    253     { "-ldots",                         RTFSISOMAKERCMD_OPT_ALLOW_LEADING_DOTS,             RTGETOPT_REQ_NOTHING },
    254     { "--allow-lowercase",              RTFSISOMAKERCMD_OPT_ALLOW_LOWERCASE,                RTGETOPT_REQ_NOTHING },
    255     { "-allow-lowercase",               RTFSISOMAKERCMD_OPT_ALLOW_LOWERCASE,                RTGETOPT_REQ_NOTHING },
    256     { "--allow-multidot",               RTFSISOMAKERCMD_OPT_ALLOW_MULTI_DOT,                RTGETOPT_REQ_NOTHING },
    257     { "-allow-multidot",                RTFSISOMAKERCMD_OPT_ALLOW_MULTI_DOT,                RTGETOPT_REQ_NOTHING },
    258     { "--biblio",                       RTFSISOMAKERCMD_OPT_BIBLIOGRAPHIC_FILE_ID,          RTGETOPT_REQ_STRING  },
    259     { "-biblio",                        RTFSISOMAKERCMD_OPT_BIBLIOGRAPHIC_FILE_ID,          RTGETOPT_REQ_STRING  },
    260     { "--cache-inodes",                 RTFSISOMAKERCMD_OPT_DETECT_HARDLINKS,               RTGETOPT_REQ_NOTHING },
    261     { "-cache-inodes",                  RTFSISOMAKERCMD_OPT_DETECT_HARDLINKS,               RTGETOPT_REQ_NOTHING },
    262     { "--no-cache-inodes",              RTFSISOMAKERCMD_OPT_NO_DETECT_HARDLINKS,            RTGETOPT_REQ_NOTHING },
    263     { "-no-cache-inodes",               RTFSISOMAKERCMD_OPT_NO_DETECT_HARDLINKS,            RTGETOPT_REQ_NOTHING },
    264     { "--alpha-boot",                   RTFSISOMAKERCMD_OPT_ALPHA_BOOT,                     RTGETOPT_REQ_STRING  },
    265     { "-alpha-boot",                    RTFSISOMAKERCMD_OPT_ALPHA_BOOT,                     RTGETOPT_REQ_STRING  },
    266     { "--hppa-bootloader",              RTFSISOMAKERCMD_OPT_HPPA_BOOTLOADER,                RTGETOPT_REQ_STRING  },
    267     { "-hppa-bootloader",               RTFSISOMAKERCMD_OPT_HPPA_BOOTLOADER,                RTGETOPT_REQ_STRING  },
    268     { "--hppa-cmdline",                 RTFSISOMAKERCMD_OPT_HPPA_CMDLINE,                   RTGETOPT_REQ_STRING  },
    269     { "-hppa-cmdline",                  RTFSISOMAKERCMD_OPT_HPPA_CMDLINE,                   RTGETOPT_REQ_STRING  },
    270     { "--hppa-kernel-32",               RTFSISOMAKERCMD_OPT_HPPA_KERNEL_32,                 RTGETOPT_REQ_STRING  },
    271     { "-hppa-kernel-32",                RTFSISOMAKERCMD_OPT_HPPA_KERNEL_32,                 RTGETOPT_REQ_STRING  },
    272     { "--hppa-kernel-64",               RTFSISOMAKERCMD_OPT_HPPA_KERNEL_64,                 RTGETOPT_REQ_STRING  },
    273     { "-hppa-kernel-64",                RTFSISOMAKERCMD_OPT_HPPA_KERNEL_64,                 RTGETOPT_REQ_STRING  },
    274     { "--hppa-ramdisk",                 RTFSISOMAKERCMD_OPT_HPPA_RAMDISK,                   RTGETOPT_REQ_STRING  },
    275     { "-hppa-ramdisk",                  RTFSISOMAKERCMD_OPT_HPPA_RAMDISK,                   RTGETOPT_REQ_STRING  },
    276     { "--mips-boot",                    RTFSISOMAKERCMD_OPT_MIPS_BOOT,                      RTGETOPT_REQ_STRING  },
    277     { "-mips-boot",                     RTFSISOMAKERCMD_OPT_MIPS_BOOT,                      RTGETOPT_REQ_STRING  },
    278     { "--mipsel-boot",                  RTFSISOMAKERCMD_OPT_MIPSEL_BOOT,                    RTGETOPT_REQ_STRING  },
    279     { "-mipsel-boot",                   RTFSISOMAKERCMD_OPT_MIPSEL_BOOT,                    RTGETOPT_REQ_STRING  },
    280     { "--sparc-boot",                   'B',                                                RTGETOPT_REQ_STRING  },
    281     { "-sparc-boot",                    'B',                                                RTGETOPT_REQ_STRING  },
     313    DD("-allow-limited-size",           RTFSISOMAKERCMD_OPT_ALLOW_LIMITED_SIZE,             RTGETOPT_REQ_NOTHING ),
     314    DD("-allow-leading-dots",           RTFSISOMAKERCMD_OPT_ALLOW_LEADING_DOTS,             RTGETOPT_REQ_NOTHING ),
     315    DD("-ldots",                        RTFSISOMAKERCMD_OPT_ALLOW_LEADING_DOTS,             RTGETOPT_REQ_NOTHING ),
     316    DD("-allow-lowercase",              RTFSISOMAKERCMD_OPT_ALLOW_LOWERCASE,                RTGETOPT_REQ_NOTHING ),
     317    DD("-allow-multidot",               RTFSISOMAKERCMD_OPT_ALLOW_MULTI_DOT,                RTGETOPT_REQ_NOTHING ),
     318    DD("-biblio",                       RTFSISOMAKERCMD_OPT_BIBLIOGRAPHIC_FILE_ID,          RTGETOPT_REQ_STRING  ),
     319    DD("-cache-inodes",                 RTFSISOMAKERCMD_OPT_DETECT_HARDLINKS,               RTGETOPT_REQ_NOTHING ),
     320    DD("-no-cache-inodes",              RTFSISOMAKERCMD_OPT_NO_DETECT_HARDLINKS,            RTGETOPT_REQ_NOTHING ),
     321    DD("-alpha-boot",                   RTFSISOMAKERCMD_OPT_ALPHA_BOOT,                     RTGETOPT_REQ_STRING  ),
     322    DD("-hppa-bootloader",              RTFSISOMAKERCMD_OPT_HPPA_BOOTLOADER,                RTGETOPT_REQ_STRING  ),
     323    DD("-hppa-cmdline",                 RTFSISOMAKERCMD_OPT_HPPA_CMDLINE,                   RTGETOPT_REQ_STRING  ),
     324    DD("-hppa-kernel-32",               RTFSISOMAKERCMD_OPT_HPPA_KERNEL_32,                 RTGETOPT_REQ_STRING  ),
     325    DD("-hppa-kernel-64",               RTFSISOMAKERCMD_OPT_HPPA_KERNEL_64,                 RTGETOPT_REQ_STRING  ),
     326    DD("-hppa-ramdisk",                 RTFSISOMAKERCMD_OPT_HPPA_RAMDISK,                   RTGETOPT_REQ_STRING  ),
     327    DD("-mips-boot",                    RTFSISOMAKERCMD_OPT_MIPS_BOOT,                      RTGETOPT_REQ_STRING  ),
     328    DD("-mipsel-boot",                  RTFSISOMAKERCMD_OPT_MIPSEL_BOOT,                    RTGETOPT_REQ_STRING  ),
     329    DD("-sparc-boot",                   'B',                                                RTGETOPT_REQ_STRING  ),
    282330    { "--generic-boot",                 'G',                                                RTGETOPT_REQ_STRING  },
    283331    { "--eltorito-boot",                'b',                                                RTGETOPT_REQ_STRING  },
    284     { "--eltorito-alt-boot",            RTFSISOMAKERCMD_OPT_ELTORITO_ALT_BOOT,              RTGETOPT_REQ_NOTHING },
    285     { "--hard-disk-boot",               RTFSISOMAKERCMD_OPT_ELTORITO_HARD_DISK_BOOT,        RTGETOPT_REQ_NOTHING },
    286     { "-hard-disk-boot",                RTFSISOMAKERCMD_OPT_ELTORITO_HARD_DISK_BOOT,        RTGETOPT_REQ_NOTHING },
    287     { "--no-emulation-boot",            RTFSISOMAKERCMD_OPT_ELTORITO_NO_EMULATION_BOOT,     RTGETOPT_REQ_NOTHING },
    288     { "-no-emulation-boot",             RTFSISOMAKERCMD_OPT_ELTORITO_NO_EMULATION_BOOT,     RTGETOPT_REQ_NOTHING },
    289     { "--no-boot",                      RTFSISOMAKERCMD_OPT_ELTORITO_NO_BOOT,               RTGETOPT_REQ_NOTHING },
    290     { "-no-boot",                       RTFSISOMAKERCMD_OPT_ELTORITO_NO_BOOT,               RTGETOPT_REQ_NOTHING },
    291     { "--boot-load-seg",                RTFSISOMAKERCMD_OPT_ELTORITO_LOAD_SEG,              RTGETOPT_REQ_UINT32  },
    292     { "-boot-load-seg",                 RTFSISOMAKERCMD_OPT_ELTORITO_LOAD_SEG,              RTGETOPT_REQ_UINT32  },
    293     { "--boot-load-size",               RTFSISOMAKERCMD_OPT_ELTORITO_LOAD_SIZE,             RTGETOPT_REQ_UINT32  },
    294     { "-boot-load-size",                RTFSISOMAKERCMD_OPT_ELTORITO_LOAD_SIZE,             RTGETOPT_REQ_UINT32  },
    295     { "--boot-info-table",              RTFSISOMAKERCMD_OPT_ELTORITO_INFO_TABLE,            RTGETOPT_REQ_STRING  },
    296     { "-boot-info-table",               RTFSISOMAKERCMD_OPT_ELTORITO_INFO_TABLE,            RTGETOPT_REQ_STRING  },
     332    DD("-eltorito-alt-boot",            RTFSISOMAKERCMD_OPT_ELTORITO_ALT_BOOT,              RTGETOPT_REQ_NOTHING ),
     333    DD("-hard-disk-boot",               RTFSISOMAKERCMD_OPT_ELTORITO_HARD_DISK_BOOT,        RTGETOPT_REQ_NOTHING ),
     334    DD("-no-emulation-boot",            RTFSISOMAKERCMD_OPT_ELTORITO_NO_EMULATION_BOOT,     RTGETOPT_REQ_NOTHING ),
     335    DD("-no-boot",                      RTFSISOMAKERCMD_OPT_ELTORITO_NO_BOOT,               RTGETOPT_REQ_NOTHING ),
     336    DD("-boot-load-seg",                RTFSISOMAKERCMD_OPT_ELTORITO_LOAD_SEG,              RTGETOPT_REQ_UINT32  ),
     337    DD("-boot-load-size",               RTFSISOMAKERCMD_OPT_ELTORITO_LOAD_SIZE,             RTGETOPT_REQ_UINT32  ),
     338    DD("-boot-info-table",              RTFSISOMAKERCMD_OPT_ELTORITO_INFO_TABLE,            RTGETOPT_REQ_STRING  ),
    297339    { "--cd-extra",                     'C',                                                RTGETOPT_REQ_STRING  },
    298340    { "--boot-catalog",                 'c',                                                RTGETOPT_REQ_STRING  },
    299     { "--check-oldnames",               RTFSISOMAKERCMD_OPT_CHECK_OLD_NAMES,                RTGETOPT_REQ_NOTHING },
    300     { "-check-oldnames",                RTFSISOMAKERCMD_OPT_CHECK_OLD_NAMES,                RTGETOPT_REQ_NOTHING },
    301     { "--check-session",                RTFSISOMAKERCMD_OPT_CHECK_SESSION,                  RTGETOPT_REQ_STRING  },
    302     { "-check-session",                 RTFSISOMAKERCMD_OPT_CHECK_SESSION,                  RTGETOPT_REQ_STRING  },
    303     { "--copyright",                    RTFSISOMAKERCMD_OPT_COPYRIGHT_FILE_ID,              RTGETOPT_REQ_STRING  },
    304     { "-copyright",                     RTFSISOMAKERCMD_OPT_COPYRIGHT_FILE_ID,              RTGETOPT_REQ_STRING  },
     341    DD("-check-oldnames",                RTFSISOMAKERCMD_OPT_CHECK_OLD_NAMES,               RTGETOPT_REQ_NOTHING ),
     342    DD("-check-session",                 RTFSISOMAKERCMD_OPT_CHECK_SESSION,                 RTGETOPT_REQ_STRING  ),
     343    DD("-copyright",                     RTFSISOMAKERCMD_OPT_COPYRIGHT_FILE_ID,             RTGETOPT_REQ_STRING  ),
    305344    { "--dont-append-dot",              'd',                                                RTGETOPT_REQ_NOTHING },
    306345    { "--deep-directories",             'D',                                                RTGETOPT_REQ_NOTHING },
    307     { "--dir-mode",                     RTFSISOMAKERCMD_OPT_DIR_MODE,                       RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_OCT },
    308     { "-dir-mode",                      RTFSISOMAKERCMD_OPT_DIR_MODE,                       RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_OCT },
    309     { "--dvd-video",                    RTFSISOMAKERCMD_OPT_DVD_VIDEO,                      RTGETOPT_REQ_NOTHING },
    310     { "-dvd-video",                     RTFSISOMAKERCMD_OPT_DVD_VIDEO,                      RTGETOPT_REQ_NOTHING },
    311     { "--follow-symlinks",              'f',                                                RTGETOPT_REQ_NOTHING },
    312     { "-follow-symlinks",               'f',                                                RTGETOPT_REQ_NOTHING },
    313     { "--file-mode",                    RTFSISOMAKERCMD_OPT_FILE_MODE,                      RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_OCT },
    314     { "-file-mode",                     RTFSISOMAKERCMD_OPT_FILE_MODE,                      RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_OCT },
    315     { "--gid",                          RTFSISOMAKERCMD_OPT_GID,                            RTGETOPT_REQ_UINT32  },
    316     { "-gid",                           RTFSISOMAKERCMD_OPT_GID,                            RTGETOPT_REQ_UINT32  },
    317     { "--gui",                          RTFSISOMAKERCMD_OPT_GUI,                            RTGETOPT_REQ_NOTHING },
    318     { "-gui",                           RTFSISOMAKERCMD_OPT_GUI,                            RTGETOPT_REQ_NOTHING },
    319     { "--graft-points",                 RTFSISOMAKERCMD_OPT_GRAFT_POINTS,                   RTGETOPT_REQ_NOTHING },
    320     { "-graft-points",                  RTFSISOMAKERCMD_OPT_GRAFT_POINTS,                   RTGETOPT_REQ_NOTHING },
    321     { "--hide",                         RTFSISOMAKERCMD_OPT_HIDE,                           RTGETOPT_REQ_STRING  },
    322     { "-hide",                          RTFSISOMAKERCMD_OPT_HIDE,                           RTGETOPT_REQ_STRING  },
    323     { "--hide-list",                    RTFSISOMAKERCMD_OPT_HIDE_LIST,                      RTGETOPT_REQ_STRING  },
    324     { "-hide-list",                     RTFSISOMAKERCMD_OPT_HIDE_LIST,                      RTGETOPT_REQ_STRING  },
    325     { "--hidden",                       RTFSISOMAKERCMD_OPT_HIDDEN,                         RTGETOPT_REQ_STRING  },
    326     { "-hidden",                        RTFSISOMAKERCMD_OPT_HIDDEN,                         RTGETOPT_REQ_STRING  },
    327     { "--hidden-list",                  RTFSISOMAKERCMD_OPT_HIDDEN_LIST,                    RTGETOPT_REQ_STRING  },
    328     { "-hidden-list",                   RTFSISOMAKERCMD_OPT_HIDDEN_LIST,                    RTGETOPT_REQ_STRING  },
    329     { "--hide-joliet",                  RTFSISOMAKERCMD_OPT_HIDE_JOLIET,                    RTGETOPT_REQ_STRING  },
    330     { "-hide-joliet",                   RTFSISOMAKERCMD_OPT_HIDE_JOLIET,                    RTGETOPT_REQ_STRING  },
    331     { "--hide-joliet-list",             RTFSISOMAKERCMD_OPT_HIDE_JOLIET_LIST,               RTGETOPT_REQ_STRING  },
    332     { "-hide-joliet-list",              RTFSISOMAKERCMD_OPT_HIDE_JOLIET_LIST,               RTGETOPT_REQ_STRING  },
    333     { "--hide-joliet-trans-tbl",        RTFSISOMAKERCMD_OPT_HIDE_JOLIET_TRANS_TBL,          RTGETOPT_REQ_NOTHING },
    334     { "-hide-joliet-trans-tbl",         RTFSISOMAKERCMD_OPT_HIDE_JOLIET_TRANS_TBL,          RTGETOPT_REQ_NOTHING },
    335     { "--hide-rr-moved",                RTFSISOMAKERCMD_OPT_HIDE_RR_MOVED,                  RTGETOPT_REQ_NOTHING },
    336     { "-hide-rr-moved",                 RTFSISOMAKERCMD_OPT_HIDE_RR_MOVED,                  RTGETOPT_REQ_NOTHING },
    337     { "--input-charset",                RTFSISOMAKERCMD_OPT_INPUT_CHARSET,                  RTGETOPT_REQ_STRING  },
    338     { "-input-charset",                 RTFSISOMAKERCMD_OPT_INPUT_CHARSET,                  RTGETOPT_REQ_STRING  },
    339     { "--output-charset",               RTFSISOMAKERCMD_OPT_OUTPUT_CHARSET,                 RTGETOPT_REQ_STRING  },
    340     { "-output-charset",                RTFSISOMAKERCMD_OPT_OUTPUT_CHARSET,                 RTGETOPT_REQ_STRING  },
     346    DD("-dir-mode",                     RTFSISOMAKERCMD_OPT_DIR_MODE,                       RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_OCT ),
     347    DD("-dvd-video",                    RTFSISOMAKERCMD_OPT_DVD_VIDEO,                      RTGETOPT_REQ_NOTHING ),
     348    DD("-follow-symlinks",              'f',                                                RTGETOPT_REQ_NOTHING ),
     349    DD("-file-mode",                    RTFSISOMAKERCMD_OPT_FILE_MODE,                      RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_OCT ),
     350    DD("-gid",                          RTFSISOMAKERCMD_OPT_GID,                            RTGETOPT_REQ_UINT32  ),
     351    DD("-gui",                          RTFSISOMAKERCMD_OPT_GUI,                            RTGETOPT_REQ_NOTHING ),
     352    DD("-graft-points",                 RTFSISOMAKERCMD_OPT_GRAFT_POINTS,                   RTGETOPT_REQ_NOTHING ),
     353    DD("-hide",                         RTFSISOMAKERCMD_OPT_HIDE,                           RTGETOPT_REQ_STRING  ),
     354    DD("-hide-list",                    RTFSISOMAKERCMD_OPT_HIDE_LIST,                      RTGETOPT_REQ_STRING  ),
     355    DD("-hidden",                       RTFSISOMAKERCMD_OPT_HIDDEN,                         RTGETOPT_REQ_STRING  ),
     356    DD("-hidden-list",                  RTFSISOMAKERCMD_OPT_HIDDEN_LIST,                    RTGETOPT_REQ_STRING  ),
     357    DD("-hide-joliet",                  RTFSISOMAKERCMD_OPT_HIDE_JOLIET,                    RTGETOPT_REQ_STRING  ),
     358    DD("-hide-joliet-list",             RTFSISOMAKERCMD_OPT_HIDE_JOLIET_LIST,               RTGETOPT_REQ_STRING  ),
     359    DD("-hide-joliet-trans-tbl",        RTFSISOMAKERCMD_OPT_HIDE_JOLIET_TRANS_TBL,          RTGETOPT_REQ_NOTHING ),
     360    DD("-hide-rr-moved",                RTFSISOMAKERCMD_OPT_HIDE_RR_MOVED,                  RTGETOPT_REQ_NOTHING ),
     361    DD("-input-charset",                RTFSISOMAKERCMD_OPT_INPUT_CHARSET,                  RTGETOPT_REQ_STRING  ),
     362    DD("-output-charset",               RTFSISOMAKERCMD_OPT_OUTPUT_CHARSET,                 RTGETOPT_REQ_STRING  ),
    341363    { "--iso-level",                    RTFSISOMAKERCMD_OPT_ISO_LEVEL,                      RTGETOPT_REQ_UINT8   },
    342364    { "--joliet",                       'J',                                                RTGETOPT_REQ_NOTHING },
    343     { "--joliet-long",                  RTFSISOMAKERCMD_OPT_JOLIET_LONG,                    RTGETOPT_REQ_NOTHING },
    344     { "-joliet-long",                   RTFSISOMAKERCMD_OPT_JOLIET_LONG,                    RTGETOPT_REQ_NOTHING },
    345     { "--jcharset",                     RTFSISOMAKERCMD_OPT_JOLIET_CHARSET,                 RTGETOPT_REQ_STRING  },
    346     { "-jcharset",                      RTFSISOMAKERCMD_OPT_JOLIET_CHARSET,                 RTGETOPT_REQ_STRING  },
     365    DD("-joliet-long",                  RTFSISOMAKERCMD_OPT_JOLIET_LONG,                    RTGETOPT_REQ_NOTHING ),
     366    DD("-jcharset",                     RTFSISOMAKERCMD_OPT_JOLIET_CHARSET,                 RTGETOPT_REQ_STRING  ),
    347367    { "--long-names",                   'l',                                                RTGETOPT_REQ_NOTHING },
    348368    { "--leading-dot",                  'L',                                                RTGETOPT_REQ_NOTHING },
    349     { "--jigdo-jigdo",                  RTFSISOMAKERCMD_OPT_JIGDO_JIGDO,                    RTGETOPT_REQ_STRING  },
    350     { "-jigdo-jigdo",                   RTFSISOMAKERCMD_OPT_JIGDO_JIGDO,                    RTGETOPT_REQ_STRING  },
    351     { "--jigdo-template",               RTFSISOMAKERCMD_OPT_JIGDO_TEMPLATE,                 RTGETOPT_REQ_STRING  },
    352     { "-jigdo-template",                RTFSISOMAKERCMD_OPT_JIGDO_TEMPLATE,                 RTGETOPT_REQ_STRING  },
    353     { "--jigdo-min-file-size",          RTFSISOMAKERCMD_OPT_JIGDO_MIN_FILE_SIZE,            RTGETOPT_REQ_UINT64  },
    354     { "-jigdo-min-file-size",           RTFSISOMAKERCMD_OPT_JIGDO_MIN_FILE_SIZE,            RTGETOPT_REQ_UINT64  },
    355     { "--jigdo-force-md5",              RTFSISOMAKERCMD_OPT_JIGDO_FORCE_MD5,                RTGETOPT_REQ_STRING  },
    356     { "-jigdo-force-md5",               RTFSISOMAKERCMD_OPT_JIGDO_FORCE_MD5,                RTGETOPT_REQ_STRING  },
    357     { "--jigdo-exclude",                RTFSISOMAKERCMD_OPT_JIGDO_EXCLUDE,                  RTGETOPT_REQ_STRING  },
    358     { "-jigdo-exclude",                 RTFSISOMAKERCMD_OPT_JIGDO_EXCLUDE,                  RTGETOPT_REQ_STRING  },
    359     { "--jigdo-map",                    RTFSISOMAKERCMD_OPT_JIGDO_MAP,                      RTGETOPT_REQ_STRING  },
    360     { "-jigdo-map",                     RTFSISOMAKERCMD_OPT_JIGDO_MAP,                      RTGETOPT_REQ_STRING  },
    361     { "--md5-list",                     RTFSISOMAKERCMD_OPT_JIGDO_MD5_LIST,                 RTGETOPT_REQ_STRING  },
    362     { "-md5-list",                      RTFSISOMAKERCMD_OPT_JIGDO_MD5_LIST,                 RTGETOPT_REQ_STRING  },
    363     { "--jigdo-template-compress",      RTFSISOMAKERCMD_OPT_JIGDO_COMPRESS,                 RTGETOPT_REQ_STRING  },
    364     { "-jigdo-template-compress",       RTFSISOMAKERCMD_OPT_JIGDO_COMPRESS,                 RTGETOPT_REQ_STRING  },
    365     { "--log-file",                     RTFSISOMAKERCMD_OPT_LOG_FILE,                       RTGETOPT_REQ_STRING  },
    366     { "-log-file",                      RTFSISOMAKERCMD_OPT_LOG_FILE,                       RTGETOPT_REQ_STRING  },
     369    DD("-jigdo-jigdo",                  RTFSISOMAKERCMD_OPT_JIGDO_JIGDO,                    RTGETOPT_REQ_STRING  ),
     370    DD("-jigdo-template",               RTFSISOMAKERCMD_OPT_JIGDO_TEMPLATE,                 RTGETOPT_REQ_STRING  ),
     371    DD("-jigdo-min-file-size",          RTFSISOMAKERCMD_OPT_JIGDO_MIN_FILE_SIZE,            RTGETOPT_REQ_UINT64  ),
     372    DD("-jigdo-force-md5",              RTFSISOMAKERCMD_OPT_JIGDO_FORCE_MD5,                RTGETOPT_REQ_STRING  ),
     373    DD("-jigdo-exclude",                RTFSISOMAKERCMD_OPT_JIGDO_EXCLUDE,                  RTGETOPT_REQ_STRING  ),
     374    DD("-jigdo-map",                    RTFSISOMAKERCMD_OPT_JIGDO_MAP,                      RTGETOPT_REQ_STRING  ),
     375    DD("-md5-list",                     RTFSISOMAKERCMD_OPT_JIGDO_MD5_LIST,                 RTGETOPT_REQ_STRING  ),
     376    DD("-jigdo-template-compress",      RTFSISOMAKERCMD_OPT_JIGDO_COMPRESS,                 RTGETOPT_REQ_STRING  ),
     377    DD("-log-file",                     RTFSISOMAKERCMD_OPT_LOG_FILE,                       RTGETOPT_REQ_STRING  ),
    367378    { "--exclude",                      'm',                                                RTGETOPT_REQ_STRING  },
    368379    { "--exclude",                      'x',                                                RTGETOPT_REQ_STRING  },
    369     { "--exclude-list",                 RTFSISOMAKERCMD_OPT_EXCLUDE_LIST,                   RTGETOPT_REQ_STRING  },
    370     { "-exclude-list",                  RTFSISOMAKERCMD_OPT_EXCLUDE_LIST,                   RTGETOPT_REQ_STRING  },
    371     { "--max-iso9660-filenames",        RTFSISOMAKERCMD_OPT_MAX_ISO9660_FILENAMES,          RTGETOPT_REQ_NOTHING },
    372     { "-max-iso9660-filenames",         RTFSISOMAKERCMD_OPT_MAX_ISO9660_FILENAMES,          RTGETOPT_REQ_NOTHING },
     380    DD("-exclude-list",                 RTFSISOMAKERCMD_OPT_EXCLUDE_LIST,                   RTGETOPT_REQ_STRING  ),
     381    DD("-max-iso9660-filenames",        RTFSISOMAKERCMD_OPT_MAX_ISO9660_FILENAMES,          RTGETOPT_REQ_NOTHING ),
    373382    { "--merge",                        'M',                                                RTGETOPT_REQ_STRING  },
    374     { "--dev",                          'M',                                                RTGETOPT_REQ_STRING  },
    375     { "-dev",                           'M',                                                RTGETOPT_REQ_STRING  },
     383    DD("-dev",                          'M',                                                RTGETOPT_REQ_STRING  ),
    376384    { "--omit-version-numbers",         'N',                                                RTGETOPT_REQ_NOTHING },
    377     { "--new-dir-mode",                 RTFSISOMAKERCMD_OPT_NEW_DIR_MODE,                   RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_OCT },
    378     { "-new-dir-mode",                  RTFSISOMAKERCMD_OPT_NEW_DIR_MODE,                   RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_OCT },
    379     { "--nobak",                        RTFSISOMAKERCMD_OPT_NO_BACKUP_FILES,                RTGETOPT_REQ_NOTHING },
    380     { "-nobak",                         RTFSISOMAKERCMD_OPT_NO_BACKUP_FILES,                RTGETOPT_REQ_NOTHING },
    381     { "--no-bak",                       RTFSISOMAKERCMD_OPT_NO_BACKUP_FILES,                RTGETOPT_REQ_NOTHING },
    382     { "-no-bak",                        RTFSISOMAKERCMD_OPT_NO_BACKUP_FILES,                RTGETOPT_REQ_NOTHING },
    383     { "--force-rr",                     RTFSISOMAKERCMD_OPT_FORCE_RR,                       RTGETOPT_REQ_NOTHING },
    384     { "-force-rr",                      RTFSISOMAKERCMD_OPT_FORCE_RR,                       RTGETOPT_REQ_NOTHING },
    385     { "--no-rr",                        RTFSISOMAKERCMD_OPT_NO_RR,                          RTGETOPT_REQ_NOTHING },
    386     { "-no-rr",                         RTFSISOMAKERCMD_OPT_NO_RR,                          RTGETOPT_REQ_NOTHING },
    387     { "--no-split-symlink-components",  RTFSISOMAKERCMD_OPT_NO_SPLIT_SYMLINK_COMPONENTS,    RTGETOPT_REQ_NOTHING },
    388     { "-no-split-symlink-components",   RTFSISOMAKERCMD_OPT_NO_SPLIT_SYMLINK_COMPONENTS,    RTGETOPT_REQ_NOTHING },
    389     { "--no-split-symlink-fields",      RTFSISOMAKERCMD_OPT_NO_SPLIT_SYMLINK_FIELDS,        RTGETOPT_REQ_NOTHING },
    390     { "-no-split-symlink-fields",       RTFSISOMAKERCMD_OPT_NO_SPLIT_SYMLINK_FIELDS,        RTGETOPT_REQ_NOTHING },
     385    DD("-new-dir-mode",                 RTFSISOMAKERCMD_OPT_NEW_DIR_MODE,                   RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_OCT ),
     386    DD("-nobak",                        RTFSISOMAKERCMD_OPT_NO_BACKUP_FILES,                RTGETOPT_REQ_NOTHING ),
     387    DD("-no-bak",                       RTFSISOMAKERCMD_OPT_NO_BACKUP_FILES,                RTGETOPT_REQ_NOTHING ),
     388    DD("-force-rr",                     RTFSISOMAKERCMD_OPT_FORCE_RR,                       RTGETOPT_REQ_NOTHING ),
     389    DD("-no-rr",                        RTFSISOMAKERCMD_OPT_NO_RR,                          RTGETOPT_REQ_NOTHING ),
     390    DD("-no-split-symlink-components",  RTFSISOMAKERCMD_OPT_NO_SPLIT_SYMLINK_COMPONENTS,    RTGETOPT_REQ_NOTHING ),
     391    DD("-no-split-symlink-fields",      RTFSISOMAKERCMD_OPT_NO_SPLIT_SYMLINK_FIELDS,        RTGETOPT_REQ_NOTHING ),
    391392    { "--output",                       'o',                                                RTGETOPT_REQ_STRING  },
    392     { "--pad",                          RTFSISOMAKERCMD_OPT_PAD,                            RTGETOPT_REQ_NOTHING },
    393     { "-pad",                           RTFSISOMAKERCMD_OPT_PAD,                            RTGETOPT_REQ_NOTHING },
    394     { "--no-pad",                       RTFSISOMAKERCMD_OPT_NO_PAD,                         RTGETOPT_REQ_NOTHING },
    395     { "-no-pad",                        RTFSISOMAKERCMD_OPT_NO_PAD,                         RTGETOPT_REQ_NOTHING },
    396     { "--path-list",                    RTFSISOMAKERCMD_OPT_PATH_LIST,                      RTGETOPT_REQ_STRING  },
    397     { "-path-list",                     RTFSISOMAKERCMD_OPT_PATH_LIST,                      RTGETOPT_REQ_STRING  },
    398     { "--publisher",                    'P',                                                RTGETOPT_REQ_STRING  },
    399     { "-publisher",                     'P',                                                RTGETOPT_REQ_STRING  },
     393    DD("-pad",                          RTFSISOMAKERCMD_OPT_PAD,                            RTGETOPT_REQ_NOTHING ),
     394    DD("-no-pad",                       RTFSISOMAKERCMD_OPT_NO_PAD,                         RTGETOPT_REQ_NOTHING ),
     395    DD("-path-list",                    RTFSISOMAKERCMD_OPT_PATH_LIST,                      RTGETOPT_REQ_STRING  ),
     396    DD("-publisher",                    'P',                                                RTGETOPT_REQ_STRING  ),
    400397    { "--preparer",                     'p',                                                RTGETOPT_REQ_STRING  },
    401     { "--print-size",                   RTFSISOMAKERCMD_OPT_PRINT_SIZE,                     RTGETOPT_REQ_NOTHING },
    402     { "-print-size",                    RTFSISOMAKERCMD_OPT_PRINT_SIZE,                     RTGETOPT_REQ_NOTHING },
    403     { "--quiet",                        RTFSISOMAKERCMD_OPT_QUIET,                          RTGETOPT_REQ_NOTHING },
    404     { "-quiet",                         RTFSISOMAKERCMD_OPT_QUIET,                          RTGETOPT_REQ_NOTHING },
     398    DD("-print-size",                   RTFSISOMAKERCMD_OPT_PRINT_SIZE,                     RTGETOPT_REQ_NOTHING ),
     399    DD("-quiet",                        RTFSISOMAKERCMD_OPT_QUIET,                          RTGETOPT_REQ_NOTHING ),
    405400    { "--rock-ridge",                   'R',                                                RTGETOPT_REQ_NOTHING },
    406401    { "--rock-ridge-relaxed",           'r',                                                RTGETOPT_REQ_NOTHING },
    407     { "--relaxed-filenames",            RTFSISOMAKERCMD_OPT_RELAXED_FILENAMES,              RTGETOPT_REQ_NOTHING },
    408     { "-relaxed-filenames",             RTFSISOMAKERCMD_OPT_RELAXED_FILENAMES,              RTGETOPT_REQ_NOTHING },
    409     { "--root",                         RTFSISOMAKERCMD_OPT_ROOT,                           RTGETOPT_REQ_STRING  },
    410     { "-root",                          RTFSISOMAKERCMD_OPT_ROOT,                           RTGETOPT_REQ_STRING  },
    411     { "--old-root",                     RTFSISOMAKERCMD_OPT_OLD_ROOT,                       RTGETOPT_REQ_STRING  },
    412     { "-old-root",                      RTFSISOMAKERCMD_OPT_OLD_ROOT,                       RTGETOPT_REQ_STRING  },
    413     { "--sort",                         RTFSISOMAKERCMD_OPT_SORT,                           RTGETOPT_REQ_STRING  },
    414     { "-sort",                          RTFSISOMAKERCMD_OPT_SORT,                           RTGETOPT_REQ_STRING  },
    415     { "--sparc-boot",                   RTFSISOMAKERCMD_OPT_SPARC_BOOT,                     RTGETOPT_REQ_STRING  },
    416     { "-sparc-boot",                    RTFSISOMAKERCMD_OPT_SPARC_BOOT,                     RTGETOPT_REQ_STRING  },
    417     { "--sparc-label",                  RTFSISOMAKERCMD_OPT_SPARC_LABEL,                    RTGETOPT_REQ_STRING  },
    418     { "-sparc-label",                   RTFSISOMAKERCMD_OPT_SPARC_LABEL,                    RTGETOPT_REQ_STRING  },
    419     { "--split-output",                 RTFSISOMAKERCMD_OPT_SPLIT_OUTPUT,                   RTGETOPT_REQ_NOTHING },
    420     { "-split-output",                  RTFSISOMAKERCMD_OPT_SPLIT_OUTPUT,                   RTGETOPT_REQ_NOTHING },
    421     { "--stream-media-size",            RTFSISOMAKERCMD_OPT_STREAM_MEDIA_SIZE,              RTGETOPT_REQ_UINT64  },
    422     { "-stream-media-size",             RTFSISOMAKERCMD_OPT_STREAM_MEDIA_SIZE,              RTGETOPT_REQ_UINT64  },
    423     { "--stream-file-name",             RTFSISOMAKERCMD_OPT_STREAM_FILE_NAME,               RTGETOPT_REQ_STRING  },
    424     { "-stream-file-name",              RTFSISOMAKERCMD_OPT_STREAM_FILE_NAME,               RTGETOPT_REQ_STRING  },
    425     { "--sunx86-boot",                  RTFSISOMAKERCMD_OPT_SUNX86_BOOT,                    RTGETOPT_REQ_STRING  },
    426     { "-sunx86-boot",                   RTFSISOMAKERCMD_OPT_SUNX86_BOOT,                    RTGETOPT_REQ_STRING  },
    427     { "--sunx86-label",                 RTFSISOMAKERCMD_OPT_SUNX86_LABEL,                   RTGETOPT_REQ_STRING  },
    428     { "-sunx86-label",                  RTFSISOMAKERCMD_OPT_SUNX86_LABEL,                   RTGETOPT_REQ_STRING  },
    429     { "--sysid",                        RTFSISOMAKERCMD_OPT_SYSTEM_ID,                      RTGETOPT_REQ_STRING  },
    430     { "-sysid",                         RTFSISOMAKERCMD_OPT_SYSTEM_ID,                      RTGETOPT_REQ_STRING  },
     402    DD("-relaxed-filenames",            RTFSISOMAKERCMD_OPT_RELAXED_FILENAMES,              RTGETOPT_REQ_NOTHING ),
     403    DD("-root",                         RTFSISOMAKERCMD_OPT_ROOT,                           RTGETOPT_REQ_STRING  ),
     404    DD("-old-root",                     RTFSISOMAKERCMD_OPT_OLD_ROOT,                       RTGETOPT_REQ_STRING  ),
     405    DD("-sort",                         RTFSISOMAKERCMD_OPT_SORT,                           RTGETOPT_REQ_STRING  ),
     406    DD("-sparc-boot",                   RTFSISOMAKERCMD_OPT_SPARC_BOOT,                     RTGETOPT_REQ_STRING  ),
     407    DD("-sparc-label",                  RTFSISOMAKERCMD_OPT_SPARC_LABEL,                    RTGETOPT_REQ_STRING  ),
     408    DD("-split-output",                 RTFSISOMAKERCMD_OPT_SPLIT_OUTPUT,                   RTGETOPT_REQ_NOTHING ),
     409    DD("-stream-media-size",            RTFSISOMAKERCMD_OPT_STREAM_MEDIA_SIZE,              RTGETOPT_REQ_UINT64  ),
     410    DD("-stream-file-name",             RTFSISOMAKERCMD_OPT_STREAM_FILE_NAME,               RTGETOPT_REQ_STRING  ),
     411    DD("-sunx86-boot",                  RTFSISOMAKERCMD_OPT_SUNX86_BOOT,                    RTGETOPT_REQ_STRING  ),
     412    DD("-sunx86-label",                 RTFSISOMAKERCMD_OPT_SUNX86_LABEL,                   RTGETOPT_REQ_STRING  ),
     413    DD("-sysid",                        RTFSISOMAKERCMD_OPT_SYSTEM_ID,                      RTGETOPT_REQ_STRING  ),
    431414    { "--trans-tbl",                    'T',                                                RTGETOPT_REQ_NOTHING },
    432     { "--table-name",                   RTFSISOMAKERCMD_OPT_TRANS_TBL_NAME,                 RTGETOPT_REQ_STRING  },
    433     { "-table-name",                    RTFSISOMAKERCMD_OPT_TRANS_TBL_NAME,                 RTGETOPT_REQ_STRING  },
    434     { "--ucs-level",                    RTFSISOMAKERCMD_OPT_JOLIET_LEVEL,                   RTGETOPT_REQ_UINT8   },
    435     { "-ucs-level",                     RTFSISOMAKERCMD_OPT_JOLIET_LEVEL,                   RTGETOPT_REQ_UINT8   },
    436     { "--udf",                          RTFSISOMAKERCMD_OPT_UDF,                            RTGETOPT_REQ_NOTHING },
    437     { "-udf",                           RTFSISOMAKERCMD_OPT_UDF,                            RTGETOPT_REQ_NOTHING },
    438     { "--uid",                          RTFSISOMAKERCMD_OPT_UID,                            RTGETOPT_REQ_UINT32  },
    439     { "-uid",                           RTFSISOMAKERCMD_OPT_UID,                            RTGETOPT_REQ_UINT32  },
    440     { "--use-fileversion",              RTFSISOMAKERCMD_OPT_USE_FILE_VERSION,               RTGETOPT_REQ_NOTHING },
    441     { "-use-fileversion",               RTFSISOMAKERCMD_OPT_USE_FILE_VERSION,               RTGETOPT_REQ_NOTHING },
     415    DD("-table-name",                   RTFSISOMAKERCMD_OPT_TRANS_TBL_NAME,                 RTGETOPT_REQ_STRING  ),
     416    DD("-ucs-level",                    RTFSISOMAKERCMD_OPT_JOLIET_LEVEL,                   RTGETOPT_REQ_UINT8   ),
     417    DD("-udf",                          RTFSISOMAKERCMD_OPT_UDF,                            RTGETOPT_REQ_NOTHING ),
     418    DD("-uid",                          RTFSISOMAKERCMD_OPT_UID,                            RTGETOPT_REQ_UINT32  ),
     419    DD("-use-fileversion",              RTFSISOMAKERCMD_OPT_USE_FILE_VERSION,               RTGETOPT_REQ_NOTHING ),
    442420    { "--untranslated-filenames",       'U',                                                RTGETOPT_REQ_NOTHING },
    443     { "--no-iso-translate",             RTFSISOMAKERCMD_OPT_NO_ISO_TRANSLATE,               RTGETOPT_REQ_NOTHING },
    444     { "-no-iso-translate",              RTFSISOMAKERCMD_OPT_NO_ISO_TRANSLATE,               RTGETOPT_REQ_NOTHING },
     421    DD("-no-iso-translate",             RTFSISOMAKERCMD_OPT_NO_ISO_TRANSLATE,               RTGETOPT_REQ_NOTHING ),
    445422    { "--volume-id",                    'V',                                                RTGETOPT_REQ_STRING  },
    446     { "--volset",                       RTFSISOMAKERCMD_OPT_VOLUME_SET_ID,                  RTGETOPT_REQ_STRING  },
    447     { "-volset",                        RTFSISOMAKERCMD_OPT_VOLUME_SET_ID,                  RTGETOPT_REQ_STRING  },
    448     { "--volset-size",                  RTFSISOMAKERCMD_OPT_VOLUME_SET_SIZE,                RTGETOPT_REQ_UINT32  },
    449     { "-volset-size",                   RTFSISOMAKERCMD_OPT_VOLUME_SET_SIZE,                RTGETOPT_REQ_UINT32  },
    450     { "--volset-seqno",                 RTFSISOMAKERCMD_OPT_VOLUME_SET_SEQ_NO,              RTGETOPT_REQ_UINT32  },
    451     { "-volset-seqno",                  RTFSISOMAKERCMD_OPT_VOLUME_SET_SEQ_NO,              RTGETOPT_REQ_UINT32  },
     423    DD("-volset",                       RTFSISOMAKERCMD_OPT_VOLUME_SET_ID,                  RTGETOPT_REQ_STRING  ),
     424    DD("-volset-size",                  RTFSISOMAKERCMD_OPT_VOLUME_SET_SIZE,                RTGETOPT_REQ_UINT32  ),
     425    DD("-volset-seqno",                 RTFSISOMAKERCMD_OPT_VOLUME_SET_SEQ_NO,              RTGETOPT_REQ_UINT32  ),
    452426    { "--transpared-compression",       'z',                                                RTGETOPT_REQ_NOTHING },
    453427
    454428    /* HFS and ISO-9660 apple extensions. */
    455     { "--hfs",                          RTFSISOMAKERCMD_OPT_HFS_ENABLE,                     RTGETOPT_REQ_NOTHING },
    456     { "-hfs",                           RTFSISOMAKERCMD_OPT_HFS_ENABLE,                     RTGETOPT_REQ_NOTHING },
    457     { "--apple",                        RTFSISOMAKERCMD_OPT_APPLE,                          RTGETOPT_REQ_NOTHING },
    458     { "-apple",                         RTFSISOMAKERCMD_OPT_APPLE,                          RTGETOPT_REQ_NOTHING },
    459     { "--map",                          RTFSISOMAKERCMD_OPT_HFS_MAP,                        RTGETOPT_REQ_STRING  },
    460     { "-map",                           RTFSISOMAKERCMD_OPT_HFS_MAP,                        RTGETOPT_REQ_STRING  },
    461     { "--magic",                        RTFSISOMAKERCMD_OPT_HFS_MAGIC,                      RTGETOPT_REQ_STRING  },
    462     { "-magic",                         RTFSISOMAKERCMD_OPT_HFS_MAGIC,                      RTGETOPT_REQ_STRING  },
    463     { "--hfs-creator",                  RTFSISOMAKERCMD_OPT_HFS_CREATOR,                    RTGETOPT_REQ_STRING  },
    464     { "-hfs-creator",                   RTFSISOMAKERCMD_OPT_HFS_CREATOR,                    RTGETOPT_REQ_STRING  },
    465     { "--hfs-type",                     RTFSISOMAKERCMD_OPT_HFS_TYPE,                       RTGETOPT_REQ_STRING  },
    466     { "-hfs-type",                      RTFSISOMAKERCMD_OPT_HFS_TYPE,                       RTGETOPT_REQ_STRING  },
    467     { "--probe",                        RTFSISOMAKERCMD_OPT_HFS_PROBE,                      RTGETOPT_REQ_NOTHING },
    468     { "-probe",                         RTFSISOMAKERCMD_OPT_HFS_PROBE,                      RTGETOPT_REQ_NOTHING },
    469     { "--no-desktop",                   RTFSISOMAKERCMD_OPT_HFS_NO_DESKTOP,                 RTGETOPT_REQ_NOTHING },
    470     { "-no-desktop",                    RTFSISOMAKERCMD_OPT_HFS_NO_DESKTOP,                 RTGETOPT_REQ_NOTHING },
    471     { "--mac-name",                     RTFSISOMAKERCMD_OPT_HFS_MAC_NAME,                   RTGETOPT_REQ_NOTHING },
    472     { "-mac-name",                      RTFSISOMAKERCMD_OPT_HFS_MAC_NAME,                   RTGETOPT_REQ_NOTHING },
    473     { "--boot-hfs-file",                RTFSISOMAKERCMD_OPT_HFS_BOOT_FILE,                  RTGETOPT_REQ_STRING  },
    474     { "-boot-hfs-file",                 RTFSISOMAKERCMD_OPT_HFS_BOOT_FILE,                  RTGETOPT_REQ_STRING  },
    475     { "--part",                         RTFSISOMAKERCMD_OPT_HFS_PART,                       RTGETOPT_REQ_NOTHING },
    476     { "-part",                          RTFSISOMAKERCMD_OPT_HFS_PART,                       RTGETOPT_REQ_NOTHING },
    477     { "--auto",                         RTFSISOMAKERCMD_OPT_HFS_AUTO,                       RTGETOPT_REQ_STRING  },
    478     { "-auto",                          RTFSISOMAKERCMD_OPT_HFS_AUTO,                       RTGETOPT_REQ_STRING  },
    479     { "--cluster-size",                 RTFSISOMAKERCMD_OPT_HFS_CLUSTER_SIZE,               RTGETOPT_REQ_UINT32  },
    480     { "-cluster-size",                  RTFSISOMAKERCMD_OPT_HFS_CLUSTER_SIZE,               RTGETOPT_REQ_UINT32  },
    481     { "--hide-hfs",                     RTFSISOMAKERCMD_OPT_HFS_HIDE,                       RTGETOPT_REQ_STRING  },
    482     { "-hide-hfs",                      RTFSISOMAKERCMD_OPT_HFS_HIDE,                       RTGETOPT_REQ_STRING  },
    483     { "--hide-hfs-list",                RTFSISOMAKERCMD_OPT_HFS_HIDE_LIST,                  RTGETOPT_REQ_STRING  },
    484     { "-hide-hfs-list",                 RTFSISOMAKERCMD_OPT_HFS_HIDE_LIST,                  RTGETOPT_REQ_STRING  },
    485     { "--hfs-volid",                    RTFSISOMAKERCMD_OPT_HFS_VOL_ID,                     RTGETOPT_REQ_STRING  },
    486     { "-hfs-volid",                     RTFSISOMAKERCMD_OPT_HFS_VOL_ID,                     RTGETOPT_REQ_STRING  },
    487     { "--icon-position",                RTFSISOMAKERCMD_OPT_HFS_ICON_POSITION,              RTGETOPT_REQ_NOTHING },
    488     { "-icon-position",                 RTFSISOMAKERCMD_OPT_HFS_ICON_POSITION,              RTGETOPT_REQ_NOTHING },
    489     { "--root-info",                    RTFSISOMAKERCMD_OPT_HFS_ROOT_INFO,                  RTGETOPT_REQ_STRING  },
    490     { "-root-info",                     RTFSISOMAKERCMD_OPT_HFS_ROOT_INFO,                  RTGETOPT_REQ_STRING  },
    491     { "--prep-boot",                    RTFSISOMAKERCMD_OPT_HFS_PREP_BOOT,                  RTGETOPT_REQ_STRING  },
    492     { "-prep-boot",                     RTFSISOMAKERCMD_OPT_HFS_PREP_BOOT,                  RTGETOPT_REQ_STRING  },
    493     { "--chrp-boot",                    RTFSISOMAKERCMD_OPT_HFS_CHRP_BOOT,                  RTGETOPT_REQ_NOTHING },
    494     { "-chrp-boot",                     RTFSISOMAKERCMD_OPT_HFS_CHRP_BOOT,                  RTGETOPT_REQ_NOTHING },
    495     { "--input-hfs-charset",            RTFSISOMAKERCMD_OPT_HFS_INPUT_CHARSET,              RTGETOPT_REQ_STRING  },
    496     { "-input-hfs-charset",             RTFSISOMAKERCMD_OPT_HFS_INPUT_CHARSET,              RTGETOPT_REQ_STRING  },
    497     { "--output-hfs-charset",           RTFSISOMAKERCMD_OPT_HFS_OUTPUT_CHARSET,             RTGETOPT_REQ_STRING  },
    498     { "-output-hfs-charset",            RTFSISOMAKERCMD_OPT_HFS_OUTPUT_CHARSET,             RTGETOPT_REQ_STRING  },
    499     { "--hfs-unlock",                   RTFSISOMAKERCMD_OPT_HFS_UNLOCK,                     RTGETOPT_REQ_NOTHING },
    500     { "-hfs-unlock",                    RTFSISOMAKERCMD_OPT_HFS_UNLOCK,                     RTGETOPT_REQ_NOTHING },
    501     { "--hfs-bless",                    RTFSISOMAKERCMD_OPT_HFS_BLESS,                      RTGETOPT_REQ_STRING  },
    502     { "-hfs-bless",                     RTFSISOMAKERCMD_OPT_HFS_BLESS,                      RTGETOPT_REQ_STRING  },
    503     { "--hfs-parms",                    RTFSISOMAKERCMD_OPT_HFS_PARMS,                      RTGETOPT_REQ_STRING  },
    504     { "-hfs-parms",                     RTFSISOMAKERCMD_OPT_HFS_PARMS,                      RTGETOPT_REQ_STRING  },
     429    DD("-hfs",                          RTFSISOMAKERCMD_OPT_HFS_ENABLE,                     RTGETOPT_REQ_NOTHING ),
     430    DD("-apple",                        RTFSISOMAKERCMD_OPT_APPLE,                          RTGETOPT_REQ_NOTHING ),
     431    DD("-map",                          RTFSISOMAKERCMD_OPT_HFS_MAP,                        RTGETOPT_REQ_STRING  ),
     432    DD("-magic",                        RTFSISOMAKERCMD_OPT_HFS_MAGIC,                      RTGETOPT_REQ_STRING  ),
     433    DD("-hfs-creator",                  RTFSISOMAKERCMD_OPT_HFS_CREATOR,                    RTGETOPT_REQ_STRING  ),
     434    DD("-hfs-type",                     RTFSISOMAKERCMD_OPT_HFS_TYPE,                       RTGETOPT_REQ_STRING  ),
     435    DD("-probe",                        RTFSISOMAKERCMD_OPT_HFS_PROBE,                      RTGETOPT_REQ_NOTHING ),
     436    DD("-no-desktop",                   RTFSISOMAKERCMD_OPT_HFS_NO_DESKTOP,                 RTGETOPT_REQ_NOTHING ),
     437    DD("-mac-name",                     RTFSISOMAKERCMD_OPT_HFS_MAC_NAME,                   RTGETOPT_REQ_NOTHING ),
     438    DD("-boot-hfs-file",                RTFSISOMAKERCMD_OPT_HFS_BOOT_FILE,                  RTGETOPT_REQ_STRING  ),
     439    DD("-part",                         RTFSISOMAKERCMD_OPT_HFS_PART,                       RTGETOPT_REQ_NOTHING ),
     440    DD("-auto",                         RTFSISOMAKERCMD_OPT_HFS_AUTO,                       RTGETOPT_REQ_STRING  ),
     441    DD("-cluster-size",                 RTFSISOMAKERCMD_OPT_HFS_CLUSTER_SIZE,               RTGETOPT_REQ_UINT32  ),
     442    DD("-hide-hfs",                     RTFSISOMAKERCMD_OPT_HFS_HIDE,                       RTGETOPT_REQ_STRING  ),
     443    DD("-hide-hfs-list",                RTFSISOMAKERCMD_OPT_HFS_HIDE_LIST,                  RTGETOPT_REQ_STRING  ),
     444    DD("-hfs-volid",                    RTFSISOMAKERCMD_OPT_HFS_VOL_ID,                     RTGETOPT_REQ_STRING  ),
     445    DD("-icon-position",                RTFSISOMAKERCMD_OPT_HFS_ICON_POSITION,              RTGETOPT_REQ_NOTHING ),
     446    DD("-root-info",                    RTFSISOMAKERCMD_OPT_HFS_ROOT_INFO,                  RTGETOPT_REQ_STRING  ),
     447    DD("-prep-boot",                    RTFSISOMAKERCMD_OPT_HFS_PREP_BOOT,                  RTGETOPT_REQ_STRING  ),
     448    DD("-chrp-boot",                    RTFSISOMAKERCMD_OPT_HFS_CHRP_BOOT,                  RTGETOPT_REQ_NOTHING ),
     449    DD("-input-hfs-charset",            RTFSISOMAKERCMD_OPT_HFS_INPUT_CHARSET,              RTGETOPT_REQ_STRING  ),
     450    DD("-output-hfs-charset",           RTFSISOMAKERCMD_OPT_HFS_OUTPUT_CHARSET,             RTGETOPT_REQ_STRING  ),
     451    DD("-hfs-unlock",                   RTFSISOMAKERCMD_OPT_HFS_UNLOCK,                     RTGETOPT_REQ_NOTHING ),
     452    DD("-hfs-bless",                    RTFSISOMAKERCMD_OPT_HFS_BLESS,                      RTGETOPT_REQ_STRING  ),
     453    DD("-hfs-parms",                    RTFSISOMAKERCMD_OPT_HFS_PARMS,                      RTGETOPT_REQ_STRING  ),
    505454    { "--cap",                          RTFSISOMAKERCMD_OPT_HFS_CAP,                        RTGETOPT_REQ_NOTHING },
    506455    { "--netatalk",                     RTFSISOMAKERCMD_OPT_HFS_NETATALK,                   RTGETOPT_REQ_NOTHING },
     
    517466    { "--osx-double",                   RTFSISOMAKERCMD_OPT_HFS_OSX_DOUBLE,                 RTGETOPT_REQ_NOTHING },
    518467    { "--osx-hfs",                      RTFSISOMAKERCMD_OPT_HFS_OSX_HFS,                    RTGETOPT_REQ_NOTHING },
     468#undef DD
    519469};
    520470
     
    524474 *
    525475 * @returns @a rc
    526  * @param   pOpts               The CMD instance.
     476 * @param   pOpts               The ISO maker command instance.
    527477 * @param   rc                  The return code.
    528478 * @param   pszFormat           The message format.
    529479 * @param   ...                 The message format arguments.
    530480 */
    531 static int rtFsIsoMakerErrorRc(PRTFSISOMAKERCMDOPTS pOpts, int rc, const char *pszFormat, ...)
     481static int rtFsIsoMakerCmdErrorRc(PRTFSISOMAKERCMDOPTS pOpts, int rc, const char *pszFormat, ...)
    532482{
    533483    va_list va;
     
    546496 *
    547497 * @returns VERR_INVALID_PARAMETER
    548  * @param   pOpts               The CMD instance.
     498 * @param   pOpts               The ISO maker command instance.
    549499 * @param   pszFormat           The message format.
    550500 * @param   ...                 The message format arguments.
    551501 */
    552 static int rtFsIsoMakerSyntaxError(PRTFSISOMAKERCMDOPTS pOpts, const char *pszFormat, ...)
     502static int rtFsIsoMakerCmdSyntaxError(PRTFSISOMAKERCMDOPTS pOpts, const char *pszFormat, ...)
    553503{
    554504    va_list va;
     
    566516 * Wrapper around RTPrintfV / RTLogRelPrintfV.
    567517 *
    568  * @param   pOpts               The CMD instance.
     518 * @param   pOpts               The ISO maker command instance.
    569519 * @param   pszFormat           The message format.
    570520 * @param   ...                 The message format arguments.
     
    585535 *
    586536 * @returns @a rc.
    587  * @param   pOpts               The CMD instance to delete.
     537 * @param   pOpts               The ISO maker command instance to delete.
    588538 * @param   rc                  The status code to return.
    589539 */
     
    610560 *
    611561 * @returns IPRT status code.
    612  * @param   pOpts               The CMD instance.
     562 * @param   pOpts               The ISO maker command instance.
    613563 * @param   hVfsSrcFile         The source file from the ISO maker.
    614564 */
     
    662612                        else
    663613                        {
    664                             rc = rtFsIsoMakerErrorRc(pOpts, rc, "Error %Rrc writing %#zx bytes at offset %#RX64 to '%s'",
     614                            rc = rtFsIsoMakerCmdErrorRc(pOpts, rc, "Error %Rrc writing %#zx bytes at offset %#RX64 to '%s'",
    665615                                                     rc, cbToCopy, offImage, pOpts->pszOutFile);
    666616                            break;
     
    669619                    else
    670620                    {
    671                         rc = rtFsIsoMakerErrorRc(pOpts, rc, "Error %Rrc read %#zx bytes at offset %#RX64", rc, cbToCopy, offImage);
     621                        rc = rtFsIsoMakerCmdErrorRc(pOpts, rc, "Error %Rrc read %#zx bytes at offset %#RX64", rc, cbToCopy, offImage);
    672622                        break;
    673623                    }
     
    681631                    rc = RTVfsFileFlush(hVfsDstFile);
    682632                    if (RT_FAILURE(rc))
    683                         rc = rtFsIsoMakerErrorRc(pOpts, rc, "RTVfsFileFlush failed on '%s': %Rrc", pOpts->pszOutFile, rc);
     633                        rc = rtFsIsoMakerCmdErrorRc(pOpts, rc, "RTVfsFileFlush failed on '%s': %Rrc", pOpts->pszOutFile, rc);
    684634                }
    685635
     
    687637            }
    688638            else if (RTErrInfoIsSet(&ErrInfo.Core))
    689                 rc = rtFsIsoMakerErrorRc(pOpts, rc, "RTVfsChainOpenFile(%s) failed: %Rrc - %s",
     639                rc = rtFsIsoMakerCmdErrorRc(pOpts, rc, "RTVfsChainOpenFile(%s) failed: %Rrc - %s",
    690640                                         pOpts->cbOutputReadBuffer, rc, ErrInfo.Core.pszMsg);
    691641            else
    692                 rc = rtFsIsoMakerErrorRc(pOpts, rc, "RTVfsChainOpenFile(%s) failed: %Rrc", pOpts->cbOutputReadBuffer, rc);
     642                rc = rtFsIsoMakerCmdErrorRc(pOpts, rc, "RTVfsChainOpenFile(%s) failed: %Rrc", pOpts->cbOutputReadBuffer, rc);
    693643
    694644            RTMemTmpFree(pvBuf);
    695645        }
    696646        else
    697             rc = rtFsIsoMakerErrorRc(pOpts, rc, "RTMemTmpAlloc(%zu) failed: %Rrc", pOpts->cbOutputReadBuffer, rc);
     647            rc = rtFsIsoMakerCmdErrorRc(pOpts, rc, "RTMemTmpAlloc(%zu) failed: %Rrc", pOpts->cbOutputReadBuffer, rc);
    698648    }
    699649    else
    700         rc = rtFsIsoMakerErrorRc(pOpts, rc, "RTVfsFileGetSize failed: %Rrc", rc);
     650        rc = rtFsIsoMakerCmdErrorRc(pOpts, rc, "RTVfsFileGetSize failed: %Rrc", rc);
    701651    return rc;
    702652}
    703653
     654
     655/**
     656 * Formats @a fNameSpecifiers into a '+' separated list of names.
     657 *
     658 * @returns pszDst
     659 * @param   fNameSpecifiers The name specifiers.
     660 * @param   pszDst          The destination bufer.
     661 * @param   cbDst           The size of the destination buffer.
     662 */
     663static char *rtFsIsoMakerCmdNameSpecifiersToString(uint32_t fNameSpecifiers, char *pszDst, size_t cbDst)
     664{
     665    static struct { const char *pszName; uint32_t cchName; uint32_t fSpec; } const s_aSpecs[] =
     666    {
     667        { RT_STR_TUPLE("primary"),           RTFSISOMAKERCMDNAME_PRIMARY_ISO            },
     668        { RT_STR_TUPLE("primary-rock"),      RTFSISOMAKERCMDNAME_PRIMARY_ISO_ROCK_RIDGE },
     669        { RT_STR_TUPLE("primary-trans-tbl"), RTFSISOMAKERCMDNAME_PRIMARY_ISO_TRANS_TBL  },
     670        { RT_STR_TUPLE("joliet"),            RTFSISOMAKERCMDNAME_JOLIET                 },
     671        { RT_STR_TUPLE("joliet-rock"),       RTFSISOMAKERCMDNAME_JOLIET_ROCK_RIDGE      },
     672        { RT_STR_TUPLE("joliet-trans-tbl"),  RTFSISOMAKERCMDNAME_JOLIET_TRANS_TBL       },
     673        { RT_STR_TUPLE("udf"),               RTFSISOMAKERCMDNAME_UDF                    },
     674        { RT_STR_TUPLE("udf-trans-tbl"),     RTFSISOMAKERCMDNAME_UDF_TRANS_TBL          },
     675        { RT_STR_TUPLE("hfs"),               RTFSISOMAKERCMDNAME_HFS                    },
     676        { RT_STR_TUPLE("hfs-trans-tbl"),     RTFSISOMAKERCMDNAME_HFS_TRANS_TBL          },
     677    };
     678
     679    Assert(cbDst > 0);
     680    char *pszRet = pszDst;
     681    for (uint32_t i = 0; i < RT_ELEMENTS(s_aSpecs); i++)
     682        if (s_aSpecs[i].fSpec & fNameSpecifiers)
     683        {
     684            if (pszDst != pszRet && cbDst > 1)
     685            {
     686                *pszDst++ = '+';
     687                cbDst--;
     688            }
     689            if (cbDst > s_aSpecs[i].cchName)
     690            {
     691                memcpy(pszDst, s_aSpecs[i].pszName, s_aSpecs[i].cchName);
     692                cbDst  -= s_aSpecs[i].cchName;
     693                pszDst += s_aSpecs[i].cchName;
     694            }
     695            else if (cbDst > 1)
     696            {
     697                memcpy(pszDst, s_aSpecs[i].pszName, cbDst - 1);
     698                pszDst += cbDst - 1;
     699                cbDst  = 1;
     700            }
     701
     702            fNameSpecifiers &= ~s_aSpecs[i].fSpec;
     703            if (!fNameSpecifiers)
     704                break;
     705        }
     706    *pszDst = '\0';
     707    return pszRet;
     708}
     709
     710
     711/**
     712 * Parses the --name-setup option.
     713 *
     714 * @returns IPRT status code.
     715 * @param   pOpts               The ISO maker command instance.
     716 * @param   pszSpec             The name setup specification.
     717 */
     718static int rtFsIsoMakerCmdOptNameSetup(PRTFSISOMAKERCMDOPTS pOpts, const char *pszSpec)
     719{
     720    /*
     721     * Comma separated list of one or more specifiers.
     722     */
     723    uint32_t fNamespaces    = 0;
     724    uint32_t fPrevMajor     = 0;
     725    uint32_t iNameSpecifier = 0;
     726    uint32_t offSpec        = 0;
     727    do
     728    {
     729        /*
     730         * Parse up to the next colon or end of string.
     731         */
     732        uint32_t fNameSpecifier = 0;
     733        char     ch;
     734        while (  (ch = pszSpec[offSpec]) != '\0'
     735               && ch != ',')
     736        {
     737            if (RT_C_IS_SPACE(ch) || ch == '+' || ch == '|') /* space, '+' and '|' are allowed as name separators. */
     738                offSpec++;
     739            else
     740            {
     741                /* Find the end of the name. */
     742                uint32_t offEndSpec = offSpec + 1;
     743                while (  (ch = pszSpec[offEndSpec]) != '\0'
     744                       && ch != ','
     745                       && ch != '+'
     746                       && ch != '|'
     747                       && !RT_C_IS_SPACE(ch))
     748                    offEndSpec++;
     749
     750#define IS_EQUAL(a_sz) (cchName == sizeof(a_sz) - 1U && strncmp(pchName, a_sz, sizeof(a_sz) - 1U) == 0)
     751                const char * const pchName = &pszSpec[offSpec];
     752                uint32_t const     cchName = offEndSpec - offSpec;
     753                /* major namespaces */
     754                if (   IS_EQUAL("iso")
     755                    || IS_EQUAL("primary")
     756                    || IS_EQUAL("iso9660")
     757                    || IS_EQUAL("iso-9660")
     758                    || IS_EQUAL("primary-iso")
     759                    || IS_EQUAL("iso-primary") )
     760                {
     761                    fNameSpecifier |= RTFSISOMAKERCMDNAME_PRIMARY_ISO;
     762                    fNamespaces |= fPrevMajor = RTFSISOMAKER_NAMESPACE_ISO_9660;
     763                }
     764                else if (IS_EQUAL("joliet"))
     765                {
     766                    fNameSpecifier |= RTFSISOMAKERCMDNAME_JOLIET;
     767                    fNamespaces |= fPrevMajor = RTFSISOMAKER_NAMESPACE_JOLIET;
     768                }
     769                else if (IS_EQUAL("udf"))
     770                {
     771#if 0
     772                    fNameSpecifier |= RTFSISOMAKERCMDNAME_UDF;
     773                    fNamespaces |= fPrevMajor = RTFSISOMAKER_NAMESPACE_UDF;
     774#else
     775                    return rtFsIsoMakerCmdSyntaxError(pOpts, "UDF support is currently not implemented");
     776#endif
     777                }
     778                else if (IS_EQUAL("hfs") || IS_EQUAL("hfsplus"))
     779                {
     780#if 0
     781                    fNameSpecifier |= RTFSISOMAKERCMDNAME_HFS;
     782                    fNamespaces |= fPrevMajor = RTFSISOMAKER_NAMESPACE_HFS;
     783#else
     784                    return rtFsIsoMakerCmdSyntaxError(pOpts, "Hybrid HFS+ support is currently not implemented");
     785#endif
     786                }
     787                /* rock ridge */
     788                else if (   IS_EQUAL("rr")
     789                         || IS_EQUAL("rock")
     790                         || IS_EQUAL("rock-ridge"))
     791                {
     792                    if (fPrevMajor == RTFSISOMAKERCMDNAME_PRIMARY_ISO)
     793                        fNameSpecifier |= RTFSISOMAKERCMDNAME_PRIMARY_ISO_ROCK_RIDGE;
     794                    else if (fPrevMajor == RTFSISOMAKERCMDNAME_JOLIET)
     795                        fNameSpecifier |= RTFSISOMAKERCMDNAME_JOLIET_ROCK_RIDGE;
     796                    else
     797                        return rtFsIsoMakerCmdSyntaxError(pOpts, "unqualified rock-ridge name specifier");
     798                }
     799                else if (   IS_EQUAL("iso-rr")         || IS_EQUAL("iso-rock")         || IS_EQUAL("iso-rock-ridge")
     800                         || IS_EQUAL("primary-rr")     || IS_EQUAL("primary-rock")     || IS_EQUAL("primary-rock-ridge")
     801                         || IS_EQUAL("iso9660-rr")     || IS_EQUAL("iso9660-rock")     || IS_EQUAL("iso9660-rock-ridge")
     802                         || IS_EQUAL("iso-9660-rr")    || IS_EQUAL("iso-9660-rock")    || IS_EQUAL("iso-9660-rock-ridge")
     803                         || IS_EQUAL("primaryiso-rr")  || IS_EQUAL("primaryiso-rock")  || IS_EQUAL("primaryiso-rock-ridge")
     804                         || IS_EQUAL("primary-iso-rr") || IS_EQUAL("primary-iso-rock") || IS_EQUAL("primary-iso-rock-ridge") )
     805                {
     806                    fNameSpecifier |= RTFSISOMAKERCMDNAME_PRIMARY_ISO_ROCK_RIDGE;
     807                    if (!(fNamespaces & RTFSISOMAKERCMDNAME_PRIMARY_ISO))
     808                        return rtFsIsoMakerCmdSyntaxError(pOpts, "iso-9660-rock-ridge must come after the iso-9660 name specifier");
     809                }
     810                else if (IS_EQUAL("joliet-rr") || IS_EQUAL("joliet-rock") || IS_EQUAL("joliet-rock-ridge"))
     811                {
     812                    fNameSpecifier |= RTFSISOMAKERCMDNAME_JOLIET_ROCK_RIDGE;
     813                    if (!(fNamespaces & RTFSISOMAKERCMDNAME_JOLIET))
     814                        return rtFsIsoMakerCmdSyntaxError(pOpts, "joliet-rock-ridge must come after the joliet name specifier");
     815                }
     816                /* trans.tbl */
     817                else if (IS_EQUAL("trans") || IS_EQUAL("trans-tbl"))
     818                {
     819                    if (fPrevMajor == RTFSISOMAKERCMDNAME_PRIMARY_ISO)
     820                        fNameSpecifier |= RTFSISOMAKERCMDNAME_PRIMARY_ISO_TRANS_TBL;
     821                    else if (fPrevMajor == RTFSISOMAKERCMDNAME_JOLIET)
     822                        fNameSpecifier |= RTFSISOMAKERCMDNAME_JOLIET_TRANS_TBL;
     823                    else
     824                        return rtFsIsoMakerCmdSyntaxError(pOpts, "unqualified trans-tbl name specifier");
     825                }
     826                else if (   IS_EQUAL("iso-trans")         || IS_EQUAL("iso-trans-tbl")
     827                         || IS_EQUAL("primary-trans")     || IS_EQUAL("primary-trans-tbl")
     828                         || IS_EQUAL("iso9660-trans")     || IS_EQUAL("iso9660-trans-tbl")
     829                         || IS_EQUAL("iso-9660-trans")    || IS_EQUAL("iso-9660-trans-tbl")
     830                         || IS_EQUAL("primaryiso-trans")  || IS_EQUAL("primaryiso-trans-tbl")
     831                         || IS_EQUAL("primary-iso-trans") || IS_EQUAL("primary-iso-trans-tbl") )
     832                {
     833                    fNameSpecifier |= RTFSISOMAKERCMDNAME_PRIMARY_ISO_TRANS_TBL;
     834                    if (!(fNamespaces & RTFSISOMAKERCMDNAME_PRIMARY_ISO))
     835                        return rtFsIsoMakerCmdSyntaxError(pOpts, "iso-9660-trans-tbl must come after the iso-9660 name specifier");
     836                }
     837                else if (IS_EQUAL("joliet-trans") || IS_EQUAL("joliet-trans-tbl"))
     838                {
     839                    fNameSpecifier |= RTFSISOMAKERCMDNAME_JOLIET_TRANS_TBL;
     840                    if (!(fNamespaces & RTFSISOMAKERCMDNAME_JOLIET))
     841                        return rtFsIsoMakerCmdSyntaxError(pOpts, "joliet-trans-tbl must come after the joliet name specifier");
     842                }
     843                else if (IS_EQUAL("udf-trans") || IS_EQUAL("udf-trans-tbl"))
     844                {
     845                    fNameSpecifier |= RTFSISOMAKERCMDNAME_UDF_TRANS_TBL;
     846                    if (!(fNamespaces & RTFSISOMAKERCMDNAME_UDF))
     847                        return rtFsIsoMakerCmdSyntaxError(pOpts, "udf-trans-tbl must come after the udf name specifier");
     848                }
     849                else if (IS_EQUAL("hfs-trans") || IS_EQUAL("hfs-trans-tbl"))
     850                {
     851                    fNameSpecifier |= RTFSISOMAKERCMDNAME_HFS_TRANS_TBL;
     852                    if (!(fNamespaces & RTFSISOMAKERCMDNAME_HFS))
     853                        return rtFsIsoMakerCmdSyntaxError(pOpts, "hfs-trans-tbl must come after the hfs name specifier");
     854                }
     855                else
     856                    return rtFsIsoMakerCmdSyntaxError(pOpts, "unknown name specifier '%.*s'", cchName, pchName);
     857#undef IS_EQUAL
     858                offSpec = offEndSpec;
     859            }
     860        } /* while same specifier */
     861
     862        /*
     863         * Check that it wasn't empty.
     864         */
     865        if (fNameSpecifier == 0)
     866            return rtFsIsoMakerCmdSyntaxError(pOpts, "name specifier #%u (0-based) is empty ", iNameSpecifier);
     867
     868        /*
     869         * Complain if a major namespace name is duplicated.  The rock-ridge and
     870         * trans.tbl names are simple to replace, the others affect the two former
     871         * names and are therefore not allowed twice in the list.
     872         */
     873        uint32_t i = iNameSpecifier;
     874        while (i-- > 0)
     875        {
     876            uint32_t fRepeated = (fNameSpecifier             & RTFSISOMAKERCMDNAME_MAJOR_MASK)
     877                               & (pOpts->afNameSpecifiers[i] & RTFSISOMAKERCMDNAME_MAJOR_MASK);
     878            if (fRepeated)
     879            {
     880                char szTmp[128];
     881                return rtFsIsoMakerCmdSyntaxError(pOpts, "repeating name specifier%s: %s", RT_IS_POWER_OF_TWO(fRepeated) ? "" : "s",
     882                                                  rtFsIsoMakerCmdNameSpecifiersToString(fRepeated, szTmp, sizeof(szTmp)));
     883            }
     884        }
     885
     886        /*
     887         * Add it.
     888         */
     889        if (iNameSpecifier >= RT_ELEMENTS(pOpts->afNameSpecifiers))
     890            return rtFsIsoMakerCmdSyntaxError(pOpts, "too many name specifiers (max %d)", RT_ELEMENTS(pOpts->afNameSpecifiers));
     891        pOpts->afNameSpecifiers[iNameSpecifier] = fNameSpecifier;
     892    } while (pszSpec[offSpec] != '\0');
     893
     894    pOpts->cNameSpecifiers = iNameSpecifier;
     895    pOpts->fDstNamespaces  = fNamespaces;
     896
     897    return VINF_SUCCESS;
     898}
     899
     900
     901/**
     902 * Processes a non-option argument.
     903 *
     904 * @returns
     905 * @param   pOpts               .
     906 * @param   pszSpec             .
     907 */
     908static int rtFsIsoMakerCmdAddSomething(PRTFSISOMAKERCMDOPTS pOpts, const char *pszSpec)
     909{
     910    const char * const pszSpecIn = pszSpec;
     911
     912    /*
     913     * Split it up by '='.  Because of the source, which comes last,
     914     */
     915    RTFSISOMAKERCMDPARSEDNAME   aParsedNames[RTFSISOMAKERCMD_MAX_NAMES + 1];
     916    uint32_t                    cParsedNames = 0;
     917    for (;;)
     918    {
     919        const char *pszEqual = strchr(pszSpec, '=');
     920        size_t      cchName  = pszEqual ? pszEqual - pszSpec : strlen(pszSpec);
     921        if (cchName >= sizeof(aParsedNames[cParsedNames].szPath))
     922            return rtFsIsoMakerCmdSyntaxError(pOpts, "name #%u (0-based) is too long: %s", cParsedNames, pszSpecIn);
     923        if (cParsedNames >= pOpts->cNameSpecifiers + 1)
     924            return rtFsIsoMakerCmdSyntaxError(pOpts, "too many names specified (max %u + source): %s",
     925                                              pOpts->cNameSpecifiers,  pszSpecIn);
     926        memcpy(aParsedNames[cParsedNames].szPath, pszSpec, cchName);
     927        aParsedNames[cParsedNames].szPath[cchName] = '\0';
     928        aParsedNames[cParsedNames].cchPath = (uint32_t)cchName;
     929        cParsedNames++;
     930        if (!pszEqual)
     931        {
     932            if (!cchName)
     933                return rtFsIsoMakerCmdSyntaxError(pOpts, "empty source file name: %s", pszSpecIn);
     934            break;
     935        }
     936        pszSpec = pszEqual + 1;
     937    }
     938
     939    /*
     940     * If there are too few names specified, move the source and repeat the penultimate name.
     941     */
     942    if (cParsedNames < pOpts->cNameSpecifiers + 1)
     943    {
     944        aParsedNames[pOpts->cNameSpecifiers] = aParsedNames[cParsedNames - 1];
     945        uint32_t iSrc = cParsedNames >= 2 ? cParsedNames - 2 : 0;
     946        for (uint32_t iDst = cParsedNames; iDst < pOpts->cNameSpecifiers; iDst++)
     947            aParsedNames[iDst] = aParsedNames[iSrc];
     948        cParsedNames = pOpts->cNameSpecifiers + 1;
     949    }
     950
     951    /* Copy the specifier flags. */
     952    for (uint32_t i = 0; i < pOpts->cNameSpecifiers; i++)
     953        aParsedNames[i].fNameSpecifiers = pOpts->afNameSpecifiers[i];
     954
     955    /*
     956     * Deal with special source filenames used to remove/change stuff.
     957     */
     958    const char * const pszSrc = aParsedNames[cParsedNames - 1].szPath;
     959    if (strcmp(pszSrc, ":remove:") == 0)
     960    {
     961
     962    }
     963    else
     964    {
     965        /*
     966         * Regular source.
     967         */
     968
     969    }
     970
     971    return VINF_SUCCESS;
     972}
    704973
    705974
     
    7361005                          1 /*iFirst*/, 0 /*fFlags*/);
    7371006    if (RT_FAILURE(rc))
    738         return rtFsIsoMakerErrorRc(&Opts, rc, "RTGetOpt failed: %Rrc", rc);
     1007        return rtFsIsoMakerCmdErrorRc(&Opts, rc, "RTGetOpt failed: %Rrc", rc);
    7391008
    7401009    /* Create the ISO creator instance. */
    7411010    rc = RTFsIsoMakerCreate(&Opts.hIsoMaker);
    7421011    if (RT_FAILURE(rc))
    743         return rtFsIsoMakerErrorRc(&Opts, rc, "RTFsIsoMakerCreate failed: %Rrc", rc);
     1012        return rtFsIsoMakerCmdErrorRc(&Opts, rc, "RTFsIsoMakerCreate failed: %Rrc", rc);
    7441013
    7451014    /*
     
    7471016     */
    7481017    RTGETOPTUNION ValueUnion;
    749     while ((rc = RTGetOpt(&GetState, &ValueUnion)) != 0)
     1018    while (   RT_SUCCESS(rc)
     1019           && (rc = RTGetOpt(&GetState, &ValueUnion)) != 0)
    7501020    {
    7511021        switch (rc)
     
    7551025             */
    7561026            case VINF_GETOPT_NOT_OPTION:
     1027                rc = rtFsIsoMakerCmdAddSomething(&Opts, ValueUnion.psz);
    7571028                break;
    7581029
     
    7601031             * Options specific to our ISO maker.
    7611032             */
     1033            case RTFSISOMAKERCMD_OPT_NAME_SETUP:
     1034                rc = rtFsIsoMakerCmdOptNameSetup(&Opts, ValueUnion.psz);
     1035                break;
    7621036
    7631037
     
    7671041            case 'o':
    7681042                if (Opts.fVirtualImageMaker)
    769                     return rtFsIsoMakerSyntaxError(&Opts, "The --output option is not allowed");
     1043                    return rtFsIsoMakerCmdSyntaxError(&Opts, "The --output option is not allowed");
    7701044                if (Opts.pszOutFile)
    771                     return rtFsIsoMakerSyntaxError(&Opts, "The --output option is specified more than once");
     1045                    return rtFsIsoMakerCmdSyntaxError(&Opts, "The --output option is specified more than once");
    7721046                Opts.pszOutFile = ValueUnion.psz;
    7731047                break;
     
    7861060            default:
    7871061                if (rc > 0 && RT_C_IS_GRAPH(rc))
    788                     rc = rtFsIsoMakerErrorRc(&Opts, VERR_GETOPT_UNKNOWN_OPTION, "Unhandled option: -%c", rc);
     1062                    rc = rtFsIsoMakerCmdErrorRc(&Opts, VERR_GETOPT_UNKNOWN_OPTION, "Unhandled option: -%c", rc);
    7891063                else if (rc > 0)
    790                     rc = rtFsIsoMakerErrorRc(&Opts, VERR_GETOPT_UNKNOWN_OPTION, "Unhandled option: %i (%#x)", rc, rc);
     1064                    rc = rtFsIsoMakerCmdErrorRc(&Opts, VERR_GETOPT_UNKNOWN_OPTION, "Unhandled option: %i (%#x)", rc, rc);
    7911065                else if (rc == VERR_GETOPT_UNKNOWN_OPTION)
    792                     rc = rtFsIsoMakerErrorRc(&Opts, rc, "Unknown option: '%s'", ValueUnion.psz);
     1066                    rc = rtFsIsoMakerCmdErrorRc(&Opts, rc, "Unknown option: '%s'", ValueUnion.psz);
    7931067                else if (ValueUnion.pDef)
    794                     rc = rtFsIsoMakerErrorRc(&Opts, rc, "%s: %Rrs\n", ValueUnion.pDef->pszLong, rc);
     1068                    rc = rtFsIsoMakerCmdErrorRc(&Opts, rc, "%s: %Rrs\n", ValueUnion.pDef->pszLong, rc);
    7951069                else
    796                     rc = rtFsIsoMakerErrorRc(&Opts, rc, "%Rrs\n", rc);
     1070                    rc = rtFsIsoMakerCmdErrorRc(&Opts, rc, "%Rrs\n", rc);
    7971071                return rtFsIsoMakerCmdDeleteState(&Opts, rc);
    7981072        }
     
    8021076     * Check for mandatory options.
    8031077     */
    804     if (!Opts.cItemsAdded)
    805         rc = rtFsIsoMakerErrorRc(&Opts, VERR_NO_DATA, "Cowardly refuses to create empty ISO image");
    806     else if (!Opts.pszOutFile && !Opts.fVirtualImageMaker)
    807         rc = rtFsIsoMakerErrorRc(&Opts, VERR_INVALID_PARAMETER, "No output file specified (--output <file>)");
     1078    if (RT_SUCCESS(rc))
     1079    {
     1080        if (!Opts.cItemsAdded)
     1081            rc = rtFsIsoMakerCmdErrorRc(&Opts, VERR_NO_DATA, "Cowardly refuses to create empty ISO image");
     1082        else if (!Opts.pszOutFile && !Opts.fVirtualImageMaker)
     1083            rc = rtFsIsoMakerCmdErrorRc(&Opts, VERR_INVALID_PARAMETER, "No output file specified (--output <file>)");
     1084    }
    8081085    if (RT_SUCCESS(rc))
    8091086    {
     
    8301107            }
    8311108            else
    832                 rc = rtFsIsoMakerErrorRc(&Opts, rc, "RTFsIsoMakerCreateVfsOutputFile failed: %Rrc", rc);
     1109                rc = rtFsIsoMakerCmdErrorRc(&Opts, rc, "RTFsIsoMakerCreateVfsOutputFile failed: %Rrc", rc);
    8331110        }
    8341111        else
    835             rc = rtFsIsoMakerErrorRc(&Opts, rc, "RTFsIsoMakerFinalize failed: %Rrc", rc);
     1112            rc = rtFsIsoMakerCmdErrorRc(&Opts, rc, "RTFsIsoMakerFinalize failed: %Rrc", rc);
    8361113    }
    8371114
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette