New API call iso_zisofs_ctrl_susp_z2()

This commit is contained in:
Thomas Schmitt 2020-10-29 09:11:11 +01:00
parent 46186e5f06
commit 9605bbe748
6 changed files with 46 additions and 7 deletions

View File

@ -112,6 +112,11 @@ static double ziso_keep_blocks_free_ratio = ISO_ZISOFS_KBF_RATIO;
*/ */
static int ziso_early_bpt_discard = 0; static int ziso_early_bpt_discard = 0;
/* 1 = produce Z2 entries for zisofs2 , 0 = produce ZF for zisofs2
* This is used as extern variable in rockridge.c
*/
int iso_zisofs2_enable_susp_z2 = 0;
static static
int ziso_decide_v2_usage(off_t orig_size) int ziso_decide_v2_usage(off_t orig_size)
@ -1796,3 +1801,12 @@ int iso_stream_zisofs_discard_bpt(IsoStream *stream, int flag)
#endif /* ! Libisofs_with_zliB */ #endif /* ! Libisofs_with_zliB */
} }
/* API */
int iso_zisofs_ctrl_susp_z2(int enable)
{
if (enable == 0 || enable == 1)
iso_zisofs2_enable_susp_z2 = enable;
return iso_zisofs2_enable_susp_z2;
}

View File

@ -1596,7 +1596,8 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
while ((ret = susp_iter_next(iter, &sue, 0)) > 0) { while ((ret = susp_iter_next(iter, &sue, 0)) > 0) {
/* ignore entries from different version */ /* ignore entries from different version */
if (sue->version[0] != 1 && !(SUSP_SIG(sue, 'Z', 'F'))) if (sue->version[0] != 1 &&
!(SUSP_SIG(sue, 'Z', 'F') || SUSP_SIG(sue, 'Z', '2')))
continue; continue;
if (SUSP_SIG(sue, 'P', 'X')) { if (SUSP_SIG(sue, 'P', 'X')) {
@ -1803,7 +1804,7 @@ if (name != NULL && !namecont) {
#ifdef Libisofs_with_zliB #ifdef Libisofs_with_zliB
} else if (SUSP_SIG(sue, 'Z', 'F')) { } else if (SUSP_SIG(sue, 'Z', 'F') || SUSP_SIG(sue, 'Z', '2')) {
ret = read_zisofs_ZF(sue, zisofs_alg, &zisofs_hs4, ret = read_zisofs_ZF(sue, zisofs_alg, &zisofs_hs4,
&zisofs_bsl2, &zisofs_usize, 0); &zisofs_bsl2, &zisofs_usize, 0);
@ -1811,7 +1812,9 @@ if (name != NULL && !namecont) {
invalid_zf: invalid_zf:
/* notify and continue */ /* notify and continue */
ret = iso_rr_msg_submit(fsdata, 13, ISO_WRONG_RR_WARN, ret, ret = iso_rr_msg_submit(fsdata, 13, ISO_WRONG_RR_WARN, ret,
"Invalid ZF entry"); SUSP_SIG(sue, 'Z', 'F') ?
"Invalid ZF entry" :
"Invalid Z2 entry");
zisofs_hs4 = 0; zisofs_hs4 = 0;
continue; continue;
} }

View File

@ -8182,6 +8182,21 @@ int iso_zisofs_set_params(struct iso_zisofs_ctrl *params, int flag);
int iso_zisofs_get_params(struct iso_zisofs_ctrl *params, int flag); int iso_zisofs_get_params(struct iso_zisofs_ctrl *params, int flag);
/**
* Enable or disable the production and recognition of "Z2" SUSP entries
* instead of "ZF" entries for zisofs2 compressed files.
* "ZF" with zisofs2 causes unaware Linux kernels to complian like:
* isofs: Unknown ZF compression algorithm: PZ
* "Z2" is silently ignored by unaware Linux kernels.
* @param enable
* 1 = produce and recognize "Z2" , 0 = only "ZF" , -1 = do not change
* @return
* 1 = enabled , 0 = not enabled
* @since 1.5.4
*/
int iso_zisofs_ctrl_susp_z2(int enable);
/** /**
* Check for the given node or for its subtree whether the data file content * Check for the given node or for its subtree whether the data file content
* effectively bears zisofs file headers and eventually mark the outcome * effectively bears zisofs file headers and eventually mark the outcome

View File

@ -370,6 +370,7 @@ iso_write_opts_set_system_area;
iso_write_opts_set_tail_blocks; iso_write_opts_set_tail_blocks;
iso_write_opts_set_untranslated_name_len; iso_write_opts_set_untranslated_name_len;
iso_write_opts_set_will_cancel; iso_write_opts_set_will_cancel;
iso_zisofs_ctrl_susp_z2;
iso_zisofs_get_params; iso_zisofs_get_params;
iso_zisofs_get_refcounts; iso_zisofs_get_refcounts;
iso_zisofs_set_params; iso_zisofs_set_params;

View File

@ -961,16 +961,22 @@ int zisofs_add_ZF(Ecma119Image *t, struct susp_info *susp, int to_ce,
{ {
unsigned char *ZF = malloc(16); unsigned char *ZF = malloc(16);
/* Intimate friendship with this variable in filters/zisofs.c */
extern int iso_zisofs2_enable_susp_z2;
if (ZF == NULL) { if (ZF == NULL) {
return ISO_OUT_OF_MEM; return ISO_OUT_OF_MEM;
} }
ZF[0] = 'Z'; ZF[0] = 'Z';
ZF[1] = 'F'; ZF[1] = 'F';
ZF[2] = (unsigned char) 16; ZF[2] = (unsigned char) 16;
if (algo[0] == 'p' && algo[1] == 'z') if (algo[0] == 'p' && algo[1] == 'z') {
ZF[3] = (unsigned char) 1; ZF[3] = (unsigned char) 1;
else } else {
ZF[3] = (unsigned char) 2; ZF[3] = (unsigned char) 2;
if (iso_zisofs2_enable_susp_z2)
ZF[1] = '2';
}
ZF[4] = (unsigned char) algo[0]; ZF[4] = (unsigned char) algo[0];
ZF[5] = (unsigned char) algo[1]; ZF[5] = (unsigned char) algo[1];
ZF[6] = (unsigned char) header_size_div4; ZF[6] = (unsigned char) header_size_div4;

View File

@ -629,9 +629,9 @@ int read_zisofs_ZF(struct susp_sys_user_entry *zf, uint8_t algorithm[2],
if (zf == NULL) { if (zf == NULL) {
return ISO_NULL_POINTER; return ISO_NULL_POINTER;
} }
if (zf->sig[0] != 'Z' || zf->sig[1] != 'F') { if ((zf->sig[0] != 'Z' || zf->sig[1] != 'F') &&
(zf->sig[0] != 'Z' || zf->sig[1] != '2'))
return ISO_WRONG_ARG_VALUE; return ISO_WRONG_ARG_VALUE;
}
if (zf->len_sue[0] != 16) { if (zf->len_sue[0] != 16) {
return ISO_WRONG_RR; return ISO_WRONG_RR;
} }