diff --git a/programs/fileio.c b/programs/fileio.c index b5aa2b27c..a72f88511 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -1437,6 +1437,16 @@ enum { FIO_RUST_LZMA_CODE_ERROR = 4, FIO_RUST_LZMA_INVALID_PROJECTION = 5 }; +enum { + FIO_RUST_LZMA_DIAGNOSTIC_OK = 0, + FIO_RUST_LZMA_DIAGNOSTIC_INIT_PRESET_ERROR = 1, + FIO_RUST_LZMA_DIAGNOSTIC_INIT_ALONE_ERROR = 2, + FIO_RUST_LZMA_DIAGNOSTIC_INIT_XZ_ERROR = 3, + FIO_RUST_LZMA_DIAGNOSTIC_CODE_ERROR = 4, + FIO_RUST_LZMA_DIAGNOSTIC_INVALID_PROJECTION = 5, + FIO_RUST_LZMA_DIAGNOSTIC_UNKNOWN = 6 +}; +int FIO_rust_lzmaCompressionDiagnostic(int status); typedef void (*FIO_rust_lzma_read_fill_fn)( void* opaque, size_t requested, const unsigned char** buffer, size_t* loaded); @@ -1490,6 +1500,16 @@ enum { FIO_RUST_LZ4_END_ERROR = 4, FIO_RUST_LZ4_INVALID_PROJECTION = 5 }; +enum { + FIO_RUST_LZ4_DIAGNOSTIC_OK = 0, + FIO_RUST_LZ4_DIAGNOSTIC_CREATE_ERROR = 1, + FIO_RUST_LZ4_DIAGNOSTIC_HEADER_ERROR = 2, + FIO_RUST_LZ4_DIAGNOSTIC_UPDATE_ERROR = 3, + FIO_RUST_LZ4_DIAGNOSTIC_END_ERROR = 4, + FIO_RUST_LZ4_DIAGNOSTIC_INVALID_PROJECTION = 5, + FIO_RUST_LZ4_DIAGNOSTIC_UNKNOWN = 6 +}; +int FIO_rust_lz4CompressionDiagnostic(int status); typedef int (*FIO_rust_lz4_create_fn)(void* opaque, unsigned version, size_t* result); @@ -2145,6 +2165,7 @@ FIO_compressLzmaFrame(cRess_t* ress, U64 compressedSize = 0; int lzmaResult = (int)LZMA_OK; int status; + int diagnostic; memset(&projection, 0, sizeof(projection)); projection.readOpaque = (void*)ress->readCtx; @@ -2166,19 +2187,22 @@ FIO_compressLzmaFrame(cRess_t* ress, status = FIO_rust_compressLzmaFrame( &projection, srcFileName, srcFileSize, compressionLevel, plain_lzma, readsize, &compressedSize, &lzmaResult); - switch (status) { - case FIO_RUST_LZMA_OK: + diagnostic = FIO_rust_lzmaCompressionDiagnostic(status); + switch (diagnostic) { + case FIO_RUST_LZMA_DIAGNOSTIC_OK: return compressedSize; - case FIO_RUST_LZMA_INIT_PRESET_ERROR: + case FIO_RUST_LZMA_DIAGNOSTIC_INIT_PRESET_ERROR: EXM_THROW(81, "zstd: %s: lzma_lzma_preset error", srcFileName); - case FIO_RUST_LZMA_INIT_ALONE_ERROR: + case FIO_RUST_LZMA_DIAGNOSTIC_INIT_ALONE_ERROR: EXM_THROW(82, "zstd: %s: lzma_alone_encoder error %d", srcFileName, lzmaResult); - case FIO_RUST_LZMA_INIT_XZ_ERROR: + case FIO_RUST_LZMA_DIAGNOSTIC_INIT_XZ_ERROR: EXM_THROW(83, "zstd: %s: lzma_easy_encoder error %d", srcFileName, lzmaResult); - case FIO_RUST_LZMA_CODE_ERROR: + case FIO_RUST_LZMA_DIAGNOSTIC_CODE_ERROR: + EXM_THROW(84, "zstd: %s: lzma_code encoding error %d", srcFileName, lzmaResult); + case FIO_RUST_LZMA_DIAGNOSTIC_INVALID_PROJECTION: EXM_THROW(84, "zstd: %s: lzma_code encoding error %d", srcFileName, lzmaResult); default: - assert(status == FIO_RUST_LZMA_INVALID_PROJECTION); + assert(diagnostic == FIO_RUST_LZMA_DIAGNOSTIC_UNKNOWN); EXM_THROW(84, "zstd: %s: lzma_code encoding error %d", srcFileName, lzmaResult); } } @@ -2341,6 +2365,7 @@ FIO_compressLz4Frame(cRess_t* ress, U64 compressedSize = 0; size_t lz4Result = 0; int status; + int diagnostic; memset(&codec, 0, sizeof(codec)); memset(&projection, 0, sizeof(projection)); @@ -2367,22 +2392,25 @@ FIO_compressLz4Frame(cRess_t* ress, status = FIO_rust_compressLz4Frame( &projection, srcFileName, srcFileSize, compressionLevel, checksumFlag, readsize, &compressedSize, &lz4Result); - switch (status) { - case FIO_RUST_LZ4_OK: + diagnostic = FIO_rust_lz4CompressionDiagnostic(status); + switch (diagnostic) { + case FIO_RUST_LZ4_DIAGNOSTIC_OK: return compressedSize; - case FIO_RUST_LZ4_CREATE_ERROR: + case FIO_RUST_LZ4_DIAGNOSTIC_CREATE_ERROR: EXM_THROW(31, "zstd: failed to create lz4 compression context"); - case FIO_RUST_LZ4_HEADER_ERROR: + case FIO_RUST_LZ4_DIAGNOSTIC_HEADER_ERROR: EXM_THROW(33, "File header generation failed : %s", LZ4F_getErrorName(lz4Result)); - case FIO_RUST_LZ4_UPDATE_ERROR: + case FIO_RUST_LZ4_DIAGNOSTIC_UPDATE_ERROR: EXM_THROW(35, "zstd: %s: lz4 compression failed : %s", srcFileName, LZ4F_getErrorName(lz4Result)); - case FIO_RUST_LZ4_END_ERROR: + case FIO_RUST_LZ4_DIAGNOSTIC_END_ERROR: EXM_THROW(38, "zstd: %s: lz4 end of file generation failed : %s", srcFileName, LZ4F_getErrorName(lz4Result)); + case FIO_RUST_LZ4_DIAGNOSTIC_INVALID_PROJECTION: + EXM_THROW(31, "zstd: failed to create lz4 compression context"); default: - assert(status == FIO_RUST_LZ4_INVALID_PROJECTION); + assert(diagnostic == FIO_RUST_LZ4_DIAGNOSTIC_UNKNOWN); EXM_THROW(31, "zstd: failed to create lz4 compression context"); } } diff --git a/rust/src/fileio_asyncio.rs b/rust/src/fileio_asyncio.rs index a14067e9e..09daf0e29 100644 --- a/rust/src/fileio_asyncio.rs +++ b/rust/src/fileio_asyncio.rs @@ -1010,6 +1010,29 @@ pub const FIO_RUST_LZMA_INIT_XZ_ERROR: c_int = 3; pub const FIO_RUST_LZMA_CODE_ERROR: c_int = 4; pub const FIO_RUST_LZMA_INVALID_PROJECTION: c_int = 5; +pub const FIO_RUST_LZMA_DIAGNOSTIC_OK: c_int = 0; +pub const FIO_RUST_LZMA_DIAGNOSTIC_INIT_PRESET_ERROR: c_int = 1; +pub const FIO_RUST_LZMA_DIAGNOSTIC_INIT_ALONE_ERROR: c_int = 2; +pub const FIO_RUST_LZMA_DIAGNOSTIC_INIT_XZ_ERROR: c_int = 3; +pub const FIO_RUST_LZMA_DIAGNOSTIC_CODE_ERROR: c_int = 4; +pub const FIO_RUST_LZMA_DIAGNOSTIC_INVALID_PROJECTION: c_int = 5; +pub const FIO_RUST_LZMA_DIAGNOSTIC_UNKNOWN: c_int = 6; + +/// Classifies LZMA compression statuses without owning the C CLI's messages. +/// The operational status values remain unchanged for the existing ABI. +#[no_mangle] +pub extern "C" fn FIO_rust_lzmaCompressionDiagnostic(status: c_int) -> c_int { + match status { + FIO_RUST_LZMA_OK => FIO_RUST_LZMA_DIAGNOSTIC_OK, + FIO_RUST_LZMA_INIT_PRESET_ERROR => FIO_RUST_LZMA_DIAGNOSTIC_INIT_PRESET_ERROR, + FIO_RUST_LZMA_INIT_ALONE_ERROR => FIO_RUST_LZMA_DIAGNOSTIC_INIT_ALONE_ERROR, + FIO_RUST_LZMA_INIT_XZ_ERROR => FIO_RUST_LZMA_DIAGNOSTIC_INIT_XZ_ERROR, + FIO_RUST_LZMA_CODE_ERROR => FIO_RUST_LZMA_DIAGNOSTIC_CODE_ERROR, + FIO_RUST_LZMA_INVALID_PROJECTION => FIO_RUST_LZMA_DIAGNOSTIC_INVALID_PROJECTION, + _ => FIO_RUST_LZMA_DIAGNOSTIC_UNKNOWN, + } +} + const FIO_RUST_LZMA_OK_CODE: c_int = 0; const FIO_RUST_LZMA_STREAM_END: c_int = 1; const FIO_RUST_LZMA_RUN: c_int = 0; @@ -1068,6 +1091,29 @@ pub const FIO_RUST_LZ4_UPDATE_ERROR: c_int = 3; pub const FIO_RUST_LZ4_END_ERROR: c_int = 4; pub const FIO_RUST_LZ4_INVALID_PROJECTION: c_int = 5; +pub const FIO_RUST_LZ4_DIAGNOSTIC_OK: c_int = 0; +pub const FIO_RUST_LZ4_DIAGNOSTIC_CREATE_ERROR: c_int = 1; +pub const FIO_RUST_LZ4_DIAGNOSTIC_HEADER_ERROR: c_int = 2; +pub const FIO_RUST_LZ4_DIAGNOSTIC_UPDATE_ERROR: c_int = 3; +pub const FIO_RUST_LZ4_DIAGNOSTIC_END_ERROR: c_int = 4; +pub const FIO_RUST_LZ4_DIAGNOSTIC_INVALID_PROJECTION: c_int = 5; +pub const FIO_RUST_LZ4_DIAGNOSTIC_UNKNOWN: c_int = 6; + +/// Classifies LZ4 compression statuses without owning the C CLI's messages. +/// The operational status values remain unchanged for the existing ABI. +#[no_mangle] +pub extern "C" fn FIO_rust_lz4CompressionDiagnostic(status: c_int) -> c_int { + match status { + FIO_RUST_LZ4_OK => FIO_RUST_LZ4_DIAGNOSTIC_OK, + FIO_RUST_LZ4_CREATE_ERROR => FIO_RUST_LZ4_DIAGNOSTIC_CREATE_ERROR, + FIO_RUST_LZ4_HEADER_ERROR => FIO_RUST_LZ4_DIAGNOSTIC_HEADER_ERROR, + FIO_RUST_LZ4_UPDATE_ERROR => FIO_RUST_LZ4_DIAGNOSTIC_UPDATE_ERROR, + FIO_RUST_LZ4_END_ERROR => FIO_RUST_LZ4_DIAGNOSTIC_END_ERROR, + FIO_RUST_LZ4_INVALID_PROJECTION => FIO_RUST_LZ4_DIAGNOSTIC_INVALID_PROJECTION, + _ => FIO_RUST_LZ4_DIAGNOSTIC_UNKNOWN, + } +} + pub type FIO_rust_lz4_create_fn = unsafe extern "C" fn(*mut c_void, c_uint, *mut usize) -> c_int; pub type FIO_rust_lz4_prepare_fn = unsafe extern "C" fn(*mut c_void, u64, c_int, c_int, usize, usize); @@ -5082,6 +5128,75 @@ mod tests { } } + #[test] + fn lzma_compression_status_diagnostic_preserves_cli_mapping() { + for (status, diagnostic) in [ + (FIO_RUST_LZMA_OK, FIO_RUST_LZMA_DIAGNOSTIC_OK), + ( + FIO_RUST_LZMA_INIT_PRESET_ERROR, + FIO_RUST_LZMA_DIAGNOSTIC_INIT_PRESET_ERROR, + ), + ( + FIO_RUST_LZMA_INIT_ALONE_ERROR, + FIO_RUST_LZMA_DIAGNOSTIC_INIT_ALONE_ERROR, + ), + ( + FIO_RUST_LZMA_INIT_XZ_ERROR, + FIO_RUST_LZMA_DIAGNOSTIC_INIT_XZ_ERROR, + ), + ( + FIO_RUST_LZMA_CODE_ERROR, + FIO_RUST_LZMA_DIAGNOSTIC_CODE_ERROR, + ), + ( + FIO_RUST_LZMA_INVALID_PROJECTION, + FIO_RUST_LZMA_DIAGNOSTIC_INVALID_PROJECTION, + ), + ] { + assert_eq!(FIO_rust_lzmaCompressionDiagnostic(status), diagnostic); + } + + for status in [-1, 99] { + assert_eq!( + FIO_rust_lzmaCompressionDiagnostic(status), + FIO_RUST_LZMA_DIAGNOSTIC_UNKNOWN + ); + } + } + + #[test] + fn lz4_compression_status_diagnostic_preserves_cli_mapping() { + for (status, diagnostic) in [ + (FIO_RUST_LZ4_OK, FIO_RUST_LZ4_DIAGNOSTIC_OK), + ( + FIO_RUST_LZ4_CREATE_ERROR, + FIO_RUST_LZ4_DIAGNOSTIC_CREATE_ERROR, + ), + ( + FIO_RUST_LZ4_HEADER_ERROR, + FIO_RUST_LZ4_DIAGNOSTIC_HEADER_ERROR, + ), + ( + FIO_RUST_LZ4_UPDATE_ERROR, + FIO_RUST_LZ4_DIAGNOSTIC_UPDATE_ERROR, + ), + (FIO_RUST_LZ4_END_ERROR, FIO_RUST_LZ4_DIAGNOSTIC_END_ERROR), + ( + FIO_RUST_LZ4_INVALID_PROJECTION, + FIO_RUST_LZ4_DIAGNOSTIC_INVALID_PROJECTION, + ), + ] { + assert_eq!(FIO_rust_lz4CompressionDiagnostic(status), diagnostic); + } + + for status in [-1, 99] { + assert_eq!( + FIO_rust_lz4CompressionDiagnostic(status), + FIO_RUST_LZ4_DIAGNOSTIC_UNKNOWN + ); + } + } + const SOURCE_POLICY_STAT: u8 = 1; const SOURCE_POLICY_EXCLUDED: u8 = 2; const SOURCE_POLICY_OPEN: u8 = 3;