+
+ case O(ASSEMBLE,'b'): /* here we simply set the bitmap file */
+ if (!optarg) {
+ fprintf(stderr, Name ": bitmap file needed with -b in --assemble mode\n");
+ exit(2);
+ }
+ if (strcmp(optarg, "internal")==0) {
+ fprintf(stderr, Name ": there is no need to specify --bitmap when assembling arrays with internal bitmaps\n");
+ continue;
+ }
+ bitmap_fd = open(optarg, O_RDWR);
+ if (!*optarg || bitmap_fd < 0) {
+ fprintf(stderr, Name ": cannot open bitmap file %s: %s\n", optarg, strerror(errno));
+ exit(2);
+ }
+ ident.bitmap_fd = bitmap_fd; /* for Assemble */
+ continue;
+
+ case O(ASSEMBLE, BackupFile):
+ case O(GROW, BackupFile):
+ /* Specify a file into which grow might place a backup,
+ * or from which assemble might recover a backup
+ */
+ if (backup_file) {
+ fprintf(stderr, Name ": backup file already specified, rejecting %s\n", optarg);
+ exit(2);
+ }
+ backup_file = optarg;
+ continue;
+
+ case O(BUILD,'b'):
+ case O(CREATE,'b'): /* here we create the bitmap */
+ if (strcmp(optarg, "none") == 0) {
+ fprintf(stderr, Name ": '--bitmap none' only"
+ " support for --grow\n");
+ exit(2);
+ }
+ /* FALL THROUGH */
+ case O(GROW,'b'):
+ if (strcmp(optarg, "internal")== 0 ||
+ strcmp(optarg, "none")== 0 ||
+ strchr(optarg, '/') != NULL) {
+ bitmap_file = optarg;
+ continue;
+ }
+ /* probable typo */
+ fprintf(stderr, Name ": bitmap file must contain a '/', or be 'internal', or 'none'\n");
+ exit(2);
+
+ case O(GROW,BitmapChunk):
+ case O(BUILD,BitmapChunk):
+ case O(CREATE,BitmapChunk): /* bitmap chunksize */
+ bitmap_chunk = strtol(optarg, &c, 10);
+ if (!optarg[0] || *c || bitmap_chunk < 0 ||
+ bitmap_chunk & (bitmap_chunk - 1)) {
+ fprintf(stderr, Name ": invalid bitmap chunksize: %s\n",
+ optarg);
+ exit(2);
+ }
+ /* convert K to B, chunk of 0K means 512B */
+ bitmap_chunk = bitmap_chunk ? bitmap_chunk * 1024 : 512;
+ continue;
+
+ case O(GROW, WriteBehind):
+ case O(BUILD, WriteBehind):
+ case O(CREATE, WriteBehind): /* write-behind mode */
+ write_behind = DEFAULT_MAX_WRITE_BEHIND;
+ if (optarg) {
+ write_behind = strtol(optarg, &c, 10);
+ if (write_behind < 0 || *c ||
+ write_behind > 16383) {
+ fprintf(stderr, Name ": Invalid value for maximum outstanding write-behind writes: %s.\n\tMust be between 0 and 16383.\n", optarg);
+ exit(2);
+ }
+ }
+ continue;
+
+ case O(INCREMENTAL, 'r'):
+ rebuild_map = 1;
+ continue;