img2simg: Add support for converting holes to "don't care" chunks

This adds support for converting files with holes to "don't care"
chunks. This can result in a substantial reduction in the time it takes
to program an image if it has many holes.

Generally, constants compared to argc have been reduced by one, since we
no longer have the program name as the first argument.

Change-Id: I00750edc07d6415dcc07ae0351e9397b0222b7ba
This commit is contained in:
Sean Anderson 2021-12-30 15:34:28 -05:00
parent f96466b055
commit 6150b00b60

View file

@ -38,24 +38,41 @@
#endif
void usage() {
fprintf(stderr, "Usage: img2simg <raw_image_file> <sparse_image_file> [<block_size>]\n");
fprintf(stderr, "Usage: img2simg [-s] <raw_image_file> <sparse_image_file> [<block_size>]\n");
}
int main(int argc, char* argv[]) {
char *arg_in;
char *arg_out;
enum sparse_read_mode mode = SPARSE_READ_MODE_NORMAL;
int extra;
int in;
int opt;
int out;
int ret;
struct sparse_file* s;
unsigned int block_size = 4096;
off64_t len;
if (argc < 3 || argc > 4) {
while ((opt = getopt(argc, argv, "s")) != -1) {
switch (opt) {
case 's':
mode = SPARSE_READ_MODE_HOLE;
break;
default:
usage();
exit(-1);
}
}
extra = argc - optind;
if (extra < 2 || extra > 3) {
usage();
exit(-1);
}
if (argc == 4) {
block_size = atoi(argv[3]);
if (extra == 3) {
block_size = atoi(argv[optind + 2]);
}
if (block_size < 1024 || block_size % 4 != 0) {
@ -63,22 +80,24 @@ int main(int argc, char* argv[]) {
exit(-1);
}
if (strcmp(argv[1], "-") == 0) {
arg_in = argv[optind];
if (strcmp(arg_in, "-") == 0) {
in = STDIN_FILENO;
} else {
in = open(argv[1], O_RDONLY | O_BINARY);
in = open(arg_in, O_RDONLY | O_BINARY);
if (in < 0) {
fprintf(stderr, "Cannot open input file %s\n", argv[1]);
fprintf(stderr, "Cannot open input file %s\n", arg_in);
exit(-1);
}
}
if (strcmp(argv[2], "-") == 0) {
arg_out = argv[optind + 1];
if (strcmp(arg_out, "-") == 0) {
out = STDOUT_FILENO;
} else {
out = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0664);
out = open(arg_out, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0664);
if (out < 0) {
fprintf(stderr, "Cannot open output file %s\n", argv[2]);
fprintf(stderr, "Cannot open output file %s\n", arg_out);
exit(-1);
}
}
@ -93,7 +112,7 @@ int main(int argc, char* argv[]) {
}
sparse_file_verbose(s);
ret = sparse_file_read(s, in, SPARSE_READ_MODE_NORMAL, false);
ret = sparse_file_read(s, in, mode, false);
if (ret) {
fprintf(stderr, "Failed to read file\n");
exit(-1);