// // main function // int ARCH_MAINDECL main(int argc, char *argv[]) { imgcopy_settings *settings = imgcopy_get_default_settings(); char *tm = NULL; char *src_arg; char *dst_arg; char *adapter = NULL; int c; int rv = 1; int l; int src_is_cbm; int dst_is_cbm; struct option longopts[] = { { "help" , no_argument , NULL, 'h' }, { "version" , no_argument , NULL, 'V' }, { "adapter" , required_argument, NULL, '@' }, { "warp" , no_argument , NULL, 'w' }, { "no-warp" , no_argument , &settings->warp, 0 }, { "quiet" , no_argument , NULL, 'q' }, { "verbose" , no_argument , NULL, 'v' }, { "no-progress", no_argument , NULL, 'n' }, { "interleave" , required_argument, NULL, 'i' }, { "start-track", required_argument, NULL, 's' }, { "end-track" , required_argument, NULL, 'e' }, { "transfer" , required_argument, NULL, 't' }, { "bam-only" , no_argument , NULL, 'b' }, { "bam-save" , no_argument , NULL, 'B' }, { "drive-type" , required_argument, NULL, 'd' }, { "retry-count", required_argument, NULL, 'r' }, { "one-sided" , no_argument , NULL, '1' }, { "two-sided" , no_argument , NULL, '2' }, { "error-map" , required_argument, NULL, 'E' }, { NULL , 0 , NULL, 0 } }; const char shortopts[] ="hVwqbBt:i:s:e:d:r:2vnE:@:"; while((c=getopt_long(argc, argv, shortopts, longopts, NULL)) != -1) { switch(c) { case 'h': help(); return 0; case 'V': printf("imgcopy %s\n", OPENCBM_VERSION); return 0; case 'w': settings->warp = 1; break; case 'q': if(verbosity > 0) verbosity--; break; case 'v': verbosity++; break; case 'n': no_progress = 1; break; case 'i': settings->interleave = arch_atoc(optarg); break; case 's': settings->start_track = atoi(optarg); break; case 'e': settings->end_track = atoi(optarg); break; case 't': tm = optarg; break; case 'b': settings->bam_mode = bm_allocated; break; case 'B': settings->bam_mode = bm_save; break; case 'd': if(strcmp(optarg, "8050") == 0) { settings->drive_type = cbm_dt_cbm8050; } else if(strcmp(optarg, "8250") == 0) { settings->drive_type = cbm_dt_cbm8250; } else if(strcmp(optarg, "1001") == 0) { settings->drive_type = cbm_dt_sfd1001; } else if(strcmp(optarg, "1001") == 0) { settings->drive_type = cbm_dt_sfd1001; } else if(strcmp(optarg, "1541") == 0) { settings->drive_type = cbm_dt_cbm1541; } else if(strcmp(optarg, "1571") == 0) { settings->drive_type = cbm_dt_cbm1571; } else if(strcmp(optarg, "1581") == 0) { settings->drive_type = cbm_dt_cbm1581; } else if(strcmp(optarg, "2031") == 0) { settings->drive_type = cbm_dt_cbm2031; } else if(strcmp(optarg, "2040") == 0) { settings->drive_type = cbm_dt_cbm2040; } else if(strcmp(optarg, "3040") == 0) { settings->drive_type = cbm_dt_cbm3040; } else if(strcmp(optarg, "4031") == 0) { settings->drive_type = cbm_dt_cbm4031; } else if(strcmp(optarg, "4040") == 0) { settings->drive_type = cbm_dt_cbm4040; } else { settings->drive_type = atoi(optarg) != 0 ? cbm_dt_cbm8250 : cbm_dt_cbm8050; } break; case 'r': settings->retries = atoi(optarg); break; case '1': settings->two_sided = 0; break; case '2': settings->two_sided = 1; break; case 'E': l = strlen(optarg); if(strncmp(optarg, "always", l) == 0) { settings->error_mode = em_always; } else if(strncmp(optarg, "on_errors", l) == 0) { settings->error_mode = em_on_error; } else if(strncmp(optarg, "never", l) == 0) { settings->error_mode = em_never; } else { hint(argv[0]); return 1; } break; case '@': if (adapter == NULL) adapter = cbmlibmisc_strdup(optarg); else { my_message_cb(sev_fatal, "--adapter/-@ given more than once."); hint(argv[0]); exit(1); } break; case 0: break; // needed for --no-warp default : hint(argv[0]); return 1; } } //printf("transfermode: %s\n", tm); settings->transfer_mode = imgcopy_get_transfer_mode_index(tm); if(settings->transfer_mode < 0) { char *modes = imgcopy_get_transfer_modes(); char *m; fprintf(stderr, "Unknown transfer mode: %s\nAvailable modes:\n", tm); for(m = modes; *m; m+=(strlen(m)+1)) { fprintf(stderr, " %s\n", m); } free(modes); return 1; } my_message_cb(3, "transfer mode is %d", settings->transfer_mode ); if(optind + 2 != argc) { fprintf(stderr, "Usage: %s [OPTION]... [SOURCE] [TARGET]\n", argv[0]); hint(argv[0]); return 1; } src_arg = argv[optind]; dst_arg = argv[optind+1]; src_is_cbm = is_cbm(src_arg); dst_is_cbm = is_cbm(dst_arg); if(src_is_cbm == dst_is_cbm) { my_message_cb(0, "either source or target must be a CBM drive"); return 1; } if(cbm_driver_open_ex(&fd_cbm, adapter) == 0) { /* * If the user specified auto transfer mode, find out * which transfer mode to use. */ settings->transfer_mode = imgcopy_check_auto_transfer_mode(fd_cbm, settings->transfer_mode, atoi(src_is_cbm ? src_arg : dst_arg)); my_message_cb(3, "decided to use transfer mode %d", settings->transfer_mode ); arch_set_ctrlbreak_handler(reset); if(src_is_cbm) { rv = imgcopy_read_image(fd_cbm, settings, atoi(src_arg), dst_arg, my_message_cb, my_status_cb); } else { rv = imgcopy_write_image(fd_cbm, settings, src_arg, atoi(dst_arg), my_message_cb, my_status_cb); } if(!no_progress && rv >= 0) { printf("\n%d blocks copied.\n", rv); } cbm_driver_close(fd_cbm); rv = 0; } else { arch_error(0, arch_get_errno(), "%s", cbm_get_driver_name_ex(adapter)); } cbmlibmisc_strfree(adapter); free(settings); return rv; }
if( cbm_sendUxCommand(fd, drive, ResetVIA2ShiftRegConfig) != 0 ) break; if( cbm_sendUxCommand(fd, drive, ResetUxVectorTable) != 0 ) break; if( cbm_exec_command(fd, drive, "I", 2) != 0 ) break; if(!berror && status) { cbm_device_status(fd, drive, cmd, sizeof(cmd)); printf("%s\n", cmd); } cbm_driver_close(fd); cbmlibmisc_strfree(adapter); return 0; } while(0); else { arch_error(0, arch_get_errno(), "%s", cbm_get_driver_name_ex(adapter)); cbmlibmisc_strfree(adapter); return 1; } // if the do{}while(0) loop is exited with a break, we get here arch_error(0, arch_get_errno(), "%s", cbm_get_driver_name_ex(adapter)); cbm_reset(fd); cbmlibmisc_strfree(adapter); cbm_driver_close(fd); return 1; }