int check_ltfs_volume(struct ltfs_volume *vol, struct other_check_opts *opt) { int ret; /* Load tape and read labels */ ret = load_tape(vol); if (ret != LTFSCK_NO_ERRORS) { ltfsmsg(LTFS_ERR, "16080E", ret); return LTFSCK_UNCORRECTED; } /* Performe EOD recovery, if deep_recovery option is set */ if (opt->deep_recovery) { bool is_worm; ret = tape_get_worm_status(vol->device, &is_worm); if (ret < 0) { return LTFSCK_OPERATIONAL_ERROR; } if (is_worm && opt->deep_recovery) { ltfsmsg(LTFS_ERR, "16109E", "Deep Recovery"); return LTFSCK_USAGE_SYNTAX_ERROR; } /* Performe EOD simple recovery first */ ltfs_recover_eod_simple(vol); /* * Performe normal EOD recover procedure * if EOD was recoverd in simple recovery this function does nothing. */ ret = ltfs_recover_eod(vol); if (ret < 0) { ltfsmsg(LTFS_ERR, "16091E", ret); return LTFSCK_UNCORRECTED; } vol->ignore_wrong_version = true; } ret = ltfs_mount(true, true, opt->recover_blocks, true, 0, vol); if (ret < 0) { if(ret == -LTFS_BOTH_EOD_MISSING && opt->deep_recovery) { /* CM corrupted? try -o force_mount_no_eod */ ltfsmsg(LTFS_ERR, "16093E"); ltfsmsg(LTFS_ERR, "16094E"); } else if (ret == -LTFS_UNSUPPORTED_INDEX_VERSION) { ltfsmsg(LTFS_ERR, "16100E"); ltfsmsg(LTFS_ERR, "16101E"); } else /* Could not mount. Please format (mkltfs) or check (ltfsck). */ ltfsmsg(LTFS_ERR, "16021E"); return LTFSCK_UNCORRECTED; } else { print_criteria_info(vol); ltfs_unmount(SYNC_CHECK, vol); ltfsmsg(LTFS_INFO, "16022I"); return LTFSCK_CORRECTED; } }
int main(int argc, char *argv[]) { unsigned char sam_stat; char *progname = argv[0]; char *pcl = NULL; char *mediaType = NULL; char *mediaCapacity = NULL; char *density = NULL; uint64_t size; struct MAM new_mam; char *lib = NULL; int libno = 0; int indx; int rc; char *config = MHVTL_CONFIG_PATH"/device.conf"; FILE *conf; char *b; /* Read from file into this buffer */ char *s; /* Somewhere for sscanf to store results */ if (sizeof(struct MAM) != 1024) { printf("Structure of MAM incorrect size: %d\n", (int)sizeof(struct MAM)); exit(2); } if (argc < 2) { usage(progname); exit(1); } debug = 0; my_id = 0; verbose = 0; wp = 0; while (argc > 0) { if (argv[0][0] == '-') { switch (argv[0][1]) { case 'd': if (argc > 1) density = argv[1]; break; case 'l': if (argc > 1) { lib = argv[1]; } else { puts(" More args needed for -l\n"); exit(1); } break; case 'm': if (argc > 1) { pcl = argv[1]; } else { puts(" More args needed for -m\n"); exit(1); } break; case 's': if (argc > 1) { mediaCapacity = argv[1]; } else { puts(" More args needed for -s\n"); exit(1); } break; case 't': if (argc > 1) { mediaType = argv[1]; } else { puts(" More args needed for -t\n"); exit(1); } break; case 'V': printf("%s: version %s\n%s\n\n", progname, MHVTL_VERSION, (char *)largefile_support); break; case 'v': verbose++; break; case 'w': if (argc > 1) { if (!strncasecmp("yes", argv[1], 3)) wp = WRITE_PROTECT_ON; else if (!strncasecmp("on", argv[1], 3)) wp = WRITE_PROTECT_ON; else wp = WRITE_PROTECT_OFF; } else { puts(" More args needed for -m\n"); exit(1); } break; } } argv++; argc--; } if (pcl == NULL) { printf("Please supply a barcode (-b barcode)\n\n"); usage(progname); exit(1); } conf = fopen(config , "r"); if (!conf) { printf("Can not open config file %s : %s", config, strerror(errno)); perror("Can not open config file"); exit(1); } s = zalloc(MALLOC_SZ); if (!s) { perror("Could not allocate memory"); exit(1); } b = zalloc(MALLOC_SZ); if (!b) { perror("Could not allocate memory"); exit(1); } rc = ENOENT; if (lib) { sscanf(lib, "%d", &libno); printf("Looking for PCL: %s in library %d\n", pcl, libno); find_media_home_directory(home_directory, libno); rc = load_tape(pcl, &sam_stat); } else { /* Walk thru all defined libraries looking for media */ while (readline(b, MALLOC_SZ, conf) != NULL) { if (b[0] == '#') /* Ignore comments */ continue; /* If found a library: Attempt to load media * Break out of loop if found. Otherwise try next lib. */ if (sscanf(b, "Library: %d CHANNEL:", &indx)) { find_media_home_directory(home_directory, indx); rc = load_tape(pcl, &sam_stat); if (!rc) break; } } } fclose(conf); free(s); free(b); if (rc) { fprintf(stderr, "PCL %s cannot be dumped, " "load_tape() returned %d\n", pcl, rc); exit(1); } /* Copy media MAM into temp location */ memcpy(&new_mam, &mam, sizeof(mam)); size = 0L; if (mediaCapacity) { sscanf(mediaCapacity, "%" PRId64, &size); printf("New capacity for %s: %ldMB\n", pcl, (unsigned long)size); } if (mediaType) { if (!strncasecmp("clean", mediaType, 5)) { MHVTL_DBG(1, "Setting media type to CLEAN"); new_mam.MediumType = MEDIA_TYPE_CLEAN; new_mam.MediumTypeInformation = 20; } else if (!strncasecmp("data", mediaType, 4)) { MHVTL_DBG(1, "Setting media type to DATA"); new_mam.MediumType = MEDIA_TYPE_DATA; } else if (!strncasecmp("null", mediaType, 4)) { MHVTL_DBG(1, "Setting media type to NULL"); new_mam.MediumType = MEDIA_TYPE_NULL; } else if (!strncasecmp("WORM", mediaType, 4)) { MHVTL_DBG(1, "Setting media type to NULL"); new_mam.MediumType = MEDIA_TYPE_WORM; } else { printf("Unknown media type: %s\n", mediaType); usage(progname); exit(1); } } if (density) { printf("Setting density to %s\n", density); if (set_media_params(&new_mam, density)) { printf("Could not determine media density: %s\n", density); unload_tape(&sam_stat); exit(1); } } if (size) { put_unaligned_be64(size * 1048576, &new_mam.max_capacity); /* This will set incorrect value to start with but next media * Usage, this will be recalculated correctly */ put_unaligned_be64(size * 1048576, &new_mam.remaining_capacity); } switch (wp) { case WRITE_PROTECT_ON: new_mam.Flags |= MAM_FLAGS_MEDIA_WRITE_PROTECT; printf("Setting write-protect for %s\n", pcl); break; case WRITE_PROTECT_OFF: new_mam.Flags &= ~MAM_FLAGS_MEDIA_WRITE_PROTECT; printf("Turning off write-protect for %s\n", pcl); break; } put_unaligned_be64(sizeof(mam.pad), &new_mam.MAMSpaceRemaining); memcpy(&mam, &new_mam, sizeof(mam)); rewriteMAM(&sam_stat); unload_tape(&sam_stat); exit(0); }