void Default::load (const Header& header, size_t) { if (files.empty()) throw Exception ("no files specified in header for image \"" + header.name() + "\""); segsize /= files.size(); if (header.datatype().bits() == 1) { bytes_per_segment = segsize/8; if (bytes_per_segment*8 < int64_t (segsize)) ++bytes_per_segment; } else bytes_per_segment = header.datatype().bytes() * segsize; if (files.size() * double (bytes_per_segment) >= double (std::numeric_limits<size_t>::max())) throw Exception ("image \"" + header.name() + "\" is larger than maximum accessible memory"); if (files.size() > MAX_FILES_PER_IMAGE) copy_to_mem (header); else map_files (header); }
int main(int argc, char *argv[]) { CryptFile *cf = malloc(sizeof(CryptFile)); int chunk_size; int remove_input_file; int remainder_size; int passes; int num_passes = 0; int opt; char *file_in, *file_out; /* get commadline options. */ while ((opt = getopt(argc, argv, "vhrp:i:o:")) != -1){ switch(opt){ case 'p': if (!(passes = atoi(optarg))){ printf("Usage : %s -h -v [-p passes] [-i filein] [-o fileout]\n", argv[0]); printf("passes must be an integer.\n"); exit(1); } break; case 'r': remove_input_file = 1; break; case 'i': file_in = optarg; break; case 'o': file_out = optarg; break; case 'h': printf("Usage : %s -h -v [-r remove] [-p passes] [-i filein] [-o fileout]\n", argv[0]); exit(1); break; case 'v': printf("%s\n", COPY); exit(1); default: exit(1); } } if(!(passes && file_in && file_out) || (argc <= 1)){ printf("Usage : %s -h -v [-r remove] [-p passes] [-i filein] [-o fileout]\n", argv[0]); exit(1); } /* open files for mem mapped I/O */ map_files(cf, file_in, file_out); /* do encryption passes. */ do { /* check if password is acceptable. */ if (get_pass() == -1){ /* free buffer */ if (cf->data_out_buffer) munmap(cf->data_out_buffer, cf->stat_buff.st_size); /* delete output file. */ // is unlink needed? unlink(file_out); free(cf); exit(1); } /* pass_phrase is global and is defined in the header. */ cf->pass_len = (strlen(pass_phrase)-1); pass_phrase[cf->pass_len] = '\0'; cf->pass = pass_phrase; cf->chunk_size = (cf->file_length / cf->pass_len); cf->remaining = (cf->file_length % cf->pass_len); /* encrypt data */ encrypt_data(cf); num_passes++; } while (num_passes < passes); /* done with input file. unlink if requested */ if (remove_input_file){ unlink(file_in); } /* free memory & flush buffers */ munmap(cf->data_out_buffer, cf->stat_buff.st_size); free(cf); exit(0); }