Changeset 67370 in vbox for trunk/src/VBox/Runtime/common/fs/isomakercmd.cpp
- Timestamp:
- Jun 13, 2017 2:32:01 PM (8 years ago)
- svn:sync-xref-src-repo-rev:
- 116090
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/common/fs/isomakercmd.cpp
r67343 r67370 42 42 #include <iprt/mem.h> 43 43 #include <iprt/message.h> 44 #include <iprt/path.h> 44 45 #include <iprt/rand.h> 45 46 #include <iprt/stream.h> … … 49 50 50 51 /********************************************************************************************************************************* 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 /********************************************************************************************************************************* 51 80 * Structures and Typedefs * 52 81 *********************************************************************************************************************************/ … … 58 87 RTFSISOMAKERCMD_OPT_OUTPUT_BUFFER_SIZE, 59 88 RTFSISOMAKERCMD_OPT_RANDOM_OUTPUT_BUFFER_SIZE, 89 RTFSISOMAKERCMD_OPT_NAME_SETUP, 60 90 61 91 /* … … 215 245 bool fRandomOutputReadBufferSize; 216 246 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 /** @} */ 217 264 218 265 /** Number of items (files, directories, images, whatever) we've added. */ … … 221 268 typedef RTFSISOMAKERCMDOPTS *PRTFSISOMAKERCMDOPTS; 222 269 typedef RTFSISOMAKERCMDOPTS const *PCRTFSISOMAKERCMDOPTS; 270 271 272 /** 273 * Parsed name. 274 */ 275 typedef 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. */ 286 typedef RTFSISOMAKERCMDPARSEDNAME *PRTFSISOMAKERCMDPARSEDNAME; 223 287 224 288 … … 238 302 { "--output-buffer-size", RTFSISOMAKERCMD_OPT_OUTPUT_BUFFER_SIZE, RTGETOPT_REQ_UINT32 }, 239 303 { "--random-output-buffer-size", RTFSISOMAKERCMD_OPT_RANDOM_OUTPUT_BUFFER_SIZE, RTGETOPT_REQ_NOTHING }, 304 { "--name-setup", RTFSISOMAKERCMD_OPT_NAME_SETUP, RTGETOPT_REQ_STRING }, 240 305 241 306 … … 243 308 * genisoimage/mkisofs compatibility: 244 309 */ 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 ), 247 312 { "--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 ), 282 330 { "--generic-boot", 'G', RTGETOPT_REQ_STRING }, 283 331 { "--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 ), 297 339 { "--cd-extra", 'C', RTGETOPT_REQ_STRING }, 298 340 { "--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 ), 305 344 { "--dont-append-dot", 'd', RTGETOPT_REQ_NOTHING }, 306 345 { "--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 ), 341 363 { "--iso-level", RTFSISOMAKERCMD_OPT_ISO_LEVEL, RTGETOPT_REQ_UINT8 }, 342 364 { "--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 ), 347 367 { "--long-names", 'l', RTGETOPT_REQ_NOTHING }, 348 368 { "--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 ), 367 378 { "--exclude", 'm', RTGETOPT_REQ_STRING }, 368 379 { "--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 ), 373 382 { "--merge", 'M', RTGETOPT_REQ_STRING }, 374 { "--dev", 'M', RTGETOPT_REQ_STRING }, 375 { "-dev", 'M', RTGETOPT_REQ_STRING }, 383 DD("-dev", 'M', RTGETOPT_REQ_STRING ), 376 384 { "--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 ), 391 392 { "--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 ), 400 397 { "--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 ), 405 400 { "--rock-ridge", 'R', RTGETOPT_REQ_NOTHING }, 406 401 { "--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 ), 431 414 { "--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 ), 442 420 { "--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 ), 445 422 { "--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 ), 452 426 { "--transpared-compression", 'z', RTGETOPT_REQ_NOTHING }, 453 427 454 428 /* 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 ), 505 454 { "--cap", RTFSISOMAKERCMD_OPT_HFS_CAP, RTGETOPT_REQ_NOTHING }, 506 455 { "--netatalk", RTFSISOMAKERCMD_OPT_HFS_NETATALK, RTGETOPT_REQ_NOTHING }, … … 517 466 { "--osx-double", RTFSISOMAKERCMD_OPT_HFS_OSX_DOUBLE, RTGETOPT_REQ_NOTHING }, 518 467 { "--osx-hfs", RTFSISOMAKERCMD_OPT_HFS_OSX_HFS, RTGETOPT_REQ_NOTHING }, 468 #undef DD 519 469 }; 520 470 … … 524 474 * 525 475 * @returns @a rc 526 * @param pOpts The CMDinstance.476 * @param pOpts The ISO maker command instance. 527 477 * @param rc The return code. 528 478 * @param pszFormat The message format. 529 479 * @param ... The message format arguments. 530 480 */ 531 static int rtFsIsoMaker ErrorRc(PRTFSISOMAKERCMDOPTS pOpts, int rc, const char *pszFormat, ...)481 static int rtFsIsoMakerCmdErrorRc(PRTFSISOMAKERCMDOPTS pOpts, int rc, const char *pszFormat, ...) 532 482 { 533 483 va_list va; … … 546 496 * 547 497 * @returns VERR_INVALID_PARAMETER 548 * @param pOpts The CMDinstance.498 * @param pOpts The ISO maker command instance. 549 499 * @param pszFormat The message format. 550 500 * @param ... The message format arguments. 551 501 */ 552 static int rtFsIsoMaker SyntaxError(PRTFSISOMAKERCMDOPTS pOpts, const char *pszFormat, ...)502 static int rtFsIsoMakerCmdSyntaxError(PRTFSISOMAKERCMDOPTS pOpts, const char *pszFormat, ...) 553 503 { 554 504 va_list va; … … 566 516 * Wrapper around RTPrintfV / RTLogRelPrintfV. 567 517 * 568 * @param pOpts The CMDinstance.518 * @param pOpts The ISO maker command instance. 569 519 * @param pszFormat The message format. 570 520 * @param ... The message format arguments. … … 585 535 * 586 536 * @returns @a rc. 587 * @param pOpts The CMDinstance to delete.537 * @param pOpts The ISO maker command instance to delete. 588 538 * @param rc The status code to return. 589 539 */ … … 610 560 * 611 561 * @returns IPRT status code. 612 * @param pOpts The CMDinstance.562 * @param pOpts The ISO maker command instance. 613 563 * @param hVfsSrcFile The source file from the ISO maker. 614 564 */ … … 662 612 else 663 613 { 664 rc = rtFsIsoMaker ErrorRc(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'", 665 615 rc, cbToCopy, offImage, pOpts->pszOutFile); 666 616 break; … … 669 619 else 670 620 { 671 rc = rtFsIsoMaker ErrorRc(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); 672 622 break; 673 623 } … … 681 631 rc = RTVfsFileFlush(hVfsDstFile); 682 632 if (RT_FAILURE(rc)) 683 rc = rtFsIsoMaker ErrorRc(pOpts, rc, "RTVfsFileFlush failed on '%s': %Rrc", pOpts->pszOutFile, rc);633 rc = rtFsIsoMakerCmdErrorRc(pOpts, rc, "RTVfsFileFlush failed on '%s': %Rrc", pOpts->pszOutFile, rc); 684 634 } 685 635 … … 687 637 } 688 638 else if (RTErrInfoIsSet(&ErrInfo.Core)) 689 rc = rtFsIsoMaker ErrorRc(pOpts, rc, "RTVfsChainOpenFile(%s) failed: %Rrc - %s",639 rc = rtFsIsoMakerCmdErrorRc(pOpts, rc, "RTVfsChainOpenFile(%s) failed: %Rrc - %s", 690 640 pOpts->cbOutputReadBuffer, rc, ErrInfo.Core.pszMsg); 691 641 else 692 rc = rtFsIsoMaker ErrorRc(pOpts, rc, "RTVfsChainOpenFile(%s) failed: %Rrc", pOpts->cbOutputReadBuffer, rc);642 rc = rtFsIsoMakerCmdErrorRc(pOpts, rc, "RTVfsChainOpenFile(%s) failed: %Rrc", pOpts->cbOutputReadBuffer, rc); 693 643 694 644 RTMemTmpFree(pvBuf); 695 645 } 696 646 else 697 rc = rtFsIsoMaker ErrorRc(pOpts, rc, "RTMemTmpAlloc(%zu) failed: %Rrc", pOpts->cbOutputReadBuffer, rc);647 rc = rtFsIsoMakerCmdErrorRc(pOpts, rc, "RTMemTmpAlloc(%zu) failed: %Rrc", pOpts->cbOutputReadBuffer, rc); 698 648 } 699 649 else 700 rc = rtFsIsoMaker ErrorRc(pOpts, rc, "RTVfsFileGetSize failed: %Rrc", rc);650 rc = rtFsIsoMakerCmdErrorRc(pOpts, rc, "RTVfsFileGetSize failed: %Rrc", rc); 701 651 return rc; 702 652 } 703 653 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 */ 663 static 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 */ 718 static 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 */ 908 static 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 } 704 973 705 974 … … 736 1005 1 /*iFirst*/, 0 /*fFlags*/); 737 1006 if (RT_FAILURE(rc)) 738 return rtFsIsoMaker ErrorRc(&Opts, rc, "RTGetOpt failed: %Rrc", rc);1007 return rtFsIsoMakerCmdErrorRc(&Opts, rc, "RTGetOpt failed: %Rrc", rc); 739 1008 740 1009 /* Create the ISO creator instance. */ 741 1010 rc = RTFsIsoMakerCreate(&Opts.hIsoMaker); 742 1011 if (RT_FAILURE(rc)) 743 return rtFsIsoMaker ErrorRc(&Opts, rc, "RTFsIsoMakerCreate failed: %Rrc", rc);1012 return rtFsIsoMakerCmdErrorRc(&Opts, rc, "RTFsIsoMakerCreate failed: %Rrc", rc); 744 1013 745 1014 /* … … 747 1016 */ 748 1017 RTGETOPTUNION ValueUnion; 749 while ((rc = RTGetOpt(&GetState, &ValueUnion)) != 0) 1018 while ( RT_SUCCESS(rc) 1019 && (rc = RTGetOpt(&GetState, &ValueUnion)) != 0) 750 1020 { 751 1021 switch (rc) … … 755 1025 */ 756 1026 case VINF_GETOPT_NOT_OPTION: 1027 rc = rtFsIsoMakerCmdAddSomething(&Opts, ValueUnion.psz); 757 1028 break; 758 1029 … … 760 1031 * Options specific to our ISO maker. 761 1032 */ 1033 case RTFSISOMAKERCMD_OPT_NAME_SETUP: 1034 rc = rtFsIsoMakerCmdOptNameSetup(&Opts, ValueUnion.psz); 1035 break; 762 1036 763 1037 … … 767 1041 case 'o': 768 1042 if (Opts.fVirtualImageMaker) 769 return rtFsIsoMaker SyntaxError(&Opts, "The --output option is not allowed");1043 return rtFsIsoMakerCmdSyntaxError(&Opts, "The --output option is not allowed"); 770 1044 if (Opts.pszOutFile) 771 return rtFsIsoMaker SyntaxError(&Opts, "The --output option is specified more than once");1045 return rtFsIsoMakerCmdSyntaxError(&Opts, "The --output option is specified more than once"); 772 1046 Opts.pszOutFile = ValueUnion.psz; 773 1047 break; … … 786 1060 default: 787 1061 if (rc > 0 && RT_C_IS_GRAPH(rc)) 788 rc = rtFsIsoMaker ErrorRc(&Opts, VERR_GETOPT_UNKNOWN_OPTION, "Unhandled option: -%c", rc);1062 rc = rtFsIsoMakerCmdErrorRc(&Opts, VERR_GETOPT_UNKNOWN_OPTION, "Unhandled option: -%c", rc); 789 1063 else if (rc > 0) 790 rc = rtFsIsoMaker ErrorRc(&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); 791 1065 else if (rc == VERR_GETOPT_UNKNOWN_OPTION) 792 rc = rtFsIsoMaker ErrorRc(&Opts, rc, "Unknown option: '%s'", ValueUnion.psz);1066 rc = rtFsIsoMakerCmdErrorRc(&Opts, rc, "Unknown option: '%s'", ValueUnion.psz); 793 1067 else if (ValueUnion.pDef) 794 rc = rtFsIsoMaker ErrorRc(&Opts, rc, "%s: %Rrs\n", ValueUnion.pDef->pszLong, rc);1068 rc = rtFsIsoMakerCmdErrorRc(&Opts, rc, "%s: %Rrs\n", ValueUnion.pDef->pszLong, rc); 795 1069 else 796 rc = rtFsIsoMaker ErrorRc(&Opts, rc, "%Rrs\n", rc);1070 rc = rtFsIsoMakerCmdErrorRc(&Opts, rc, "%Rrs\n", rc); 797 1071 return rtFsIsoMakerCmdDeleteState(&Opts, rc); 798 1072 } … … 802 1076 * Check for mandatory options. 803 1077 */ 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 } 808 1085 if (RT_SUCCESS(rc)) 809 1086 { … … 830 1107 } 831 1108 else 832 rc = rtFsIsoMaker ErrorRc(&Opts, rc, "RTFsIsoMakerCreateVfsOutputFile failed: %Rrc", rc);1109 rc = rtFsIsoMakerCmdErrorRc(&Opts, rc, "RTFsIsoMakerCreateVfsOutputFile failed: %Rrc", rc); 833 1110 } 834 1111 else 835 rc = rtFsIsoMaker ErrorRc(&Opts, rc, "RTFsIsoMakerFinalize failed: %Rrc", rc);1112 rc = rtFsIsoMakerCmdErrorRc(&Opts, rc, "RTFsIsoMakerFinalize failed: %Rrc", rc); 836 1113 } 837 1114
Note:
See TracChangeset
for help on using the changeset viewer.