New -zisofs parameters version_2=, block_size_v2=, max_bpt=, max_bpt_f=

This commit is contained in:
2020-10-14 22:59:35 +02:00
parent 9a7dfd7721
commit dcb13954bd
11 changed files with 349 additions and 6026 deletions

View File

@ -2245,15 +2245,34 @@ int Xorriso_option_xattr(struct XorrisO *xorriso, char *mode, int flag)
}
static int parse_zisofs_param(char *cpt, int key_l, int l, double *num)
{
char text[16];
*num= 0.0;
if(l <= key_l || l >= key_l + 16)
return(0);
strncpy(text, cpt + key_l, l - key_l);
text[l - key_l]= 0;
*num= Scanf_io_size(text, 0);
return(1);
}
/* Option -zisofs */
int Xorriso_option_zisofs(struct XorrisO *xorriso, char *mode, int flag)
{
int was_level, was_blocksize, ret, l;
int was_level, was_blocksize, was_v2_enabled, was_blocksize_v2;
uint64_t was_max_total_blocks, was_max_file_blocks;
int ret, l, i;
double num;
char *cpt, *npt, text[16];
was_level= xorriso->zlib_level;
was_blocksize= xorriso->zisofs_block_size;
was_v2_enabled= xorriso->zisofs_v2_enabled;
was_max_total_blocks= xorriso->zisofs_max_total_blocks;
was_max_file_blocks= xorriso->zisofs_max_file_blocks;
was_blocksize_v2= xorriso->zisofs_v2_block_size;
npt= cpt= mode;
for(cpt= mode; npt!=NULL; cpt= npt+1) {
npt= strchr(cpt,':');
@ -2277,7 +2296,8 @@ int Xorriso_option_zisofs(struct XorrisO *xorriso, char *mode, int flag)
} else if(strncmp(cpt, "ziso_used=", 10) == 0 ||
strncmp(cpt, "osiz_used=", 10) == 0 ||
strncmp(cpt, "gzip_used=", 10) == 0 ||
strncmp(cpt, "gunzip_used=", 12) == 0) {
strncmp(cpt, "gunzip_used=", 12) == 0 ||
strncmp(cpt, "bpt_used=", 9) == 0) {
/* (ignored info from -status) */;
} else if(strncmp(cpt, "block_size=", 11)==0) {
@ -2294,16 +2314,67 @@ int Xorriso_option_zisofs(struct XorrisO *xorriso, char *mode, int flag)
}
xorriso->zisofs_block_size= num;
} else if(strncmp(cpt, "by_magic=", 8)==0) {
} else if(strncmp(cpt, "by_magic=", 9)==0) {
if(strncmp(cpt + 9, "on", l - 9) == 0)
xorriso->zisofs_by_magic= 1;
else
xorriso->zisofs_by_magic= 0;
} else if(strncmp(cpt, "version_2=", 10) == 0) {
if(strncmp(cpt + 10, "off", l - 10) == 0) {
xorriso->zisofs_v2_enabled= 0;
} else if(strncmp(cpt + 10, "as_needed", l - 11) == 0) {
xorriso->zisofs_v2_enabled= 1;
} else if(strncmp(cpt + 10, "on", l - 11) == 0) {
xorriso->zisofs_v2_enabled= 2;
} else {
sprintf(xorriso->info_text,
"-zisofs: Unrecognized version_2 mode (allowed: on, off, as_needed)");
goto sorry_ex;
}
} else if(strncmp(cpt, "max_bpt=", 8) == 0) {
parse_zisofs_param(cpt, 8, l, &num);
if(num < 1024.0 || num > 128.0 * 1024.0 * 1024.0 * 1024.0) {
sprintf(xorriso->info_text,
"-zisofs: Unsupported block pointer pool size (allowed: 1k to 128g)");
goto sorry_ex;
}
xorriso->zisofs_max_total_blocks= num / 8.0;
if(xorriso->zisofs_max_total_blocks < xorriso->zisofs_max_file_blocks)
xorriso->zisofs_max_file_blocks= xorriso->zisofs_max_total_blocks;
} else if(strncmp(cpt, "max_bpt_f=", 10) == 0) {
parse_zisofs_param(cpt, 10, l, &num);
if(num < 1024.0 || num > 128.0 * 1024.0 * 1024.0 * 1024.0) {
sprintf(xorriso->info_text,
"-zisofs: Unsupported block pointer list size (allowed: 1k to 128g)");
goto sorry_ex;
}
xorriso->zisofs_max_file_blocks= num / 8.0;
if(xorriso->zisofs_max_file_blocks > xorriso->zisofs_max_total_blocks)
xorriso->zisofs_max_total_blocks= xorriso->zisofs_max_file_blocks;
} else if(strncmp(cpt, "block_size_v2=", 14) == 0) {
parse_zisofs_param(cpt, 14, l, &num);
for(i= 15 ; i <= 20; i++)
if(num == (1 << i))
break;
if(i > 20) {
sprintf(xorriso->info_text,
"-zisofs: Unsupported block size (allowed 32k, 64k, 128k, ... 1024k)");
goto sorry_ex;
}
xorriso->zisofs_v2_block_size= num;
} else if(strncmp(cpt, "default", l)==0) {
xorriso->zlib_level= xorriso->zlib_level_default;
xorriso->zisofs_block_size= xorriso->zisofs_block_size_default;
xorriso->zisofs_by_magic= 0;
xorriso->zisofs_v2_enabled= 0;
xorriso->zisofs_max_total_blocks= xorriso->zisofs_max_total_blocks_default;
xorriso->zisofs_max_file_blocks= xorriso->zisofs_max_file_blocks_default;
xorriso->zisofs_v2_block_size= xorriso->zisofs_v2_block_size_default;
} else {
unknown_mode:;
@ -2315,6 +2386,10 @@ sorry_ex:
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
xorriso->zlib_level= was_level;
xorriso->zisofs_block_size= was_blocksize;
xorriso->zisofs_v2_enabled= was_v2_enabled;
xorriso->zisofs_max_total_blocks= was_max_total_blocks;
xorriso->zisofs_max_file_blocks= was_max_file_blocks;
xorriso->zisofs_v2_block_size= was_blocksize_v2;
return(0);
}
}