int main( int argc, char * const argv[] ) #endif { libcerror_error_t *error = NULL; libcfile_file_t *source_file = NULL; uint8_t *buffer = NULL; char *program = "crc32sum"; char *source = NULL; libcstring_system_integer_t option = 0; size64_t source_size = 0; off_t source_offset = 0; ssize_t read_count = 0; uint32_t calculated_crc32 = 0; uint32_t crc32 = 0; uint32_t initial_value = 0; uint32_t polynomial = 0xedb88320UL; uint8_t bit_index = 0; uint8_t weak_crc = 0; int calculation_method = 2; int result = 0; int validate_crc = 0; int verbose = 0; assorted_output_version_fprint( stdout, program ); while( ( option = libcsystem_getopt( argc, argv, _LIBCSTRING_SYSTEM_STRING( "12c:hi:o:p:s:vVw" ) ) ) != (libcstring_system_integer_t) -1 ) { switch( option ) { case '?': default: fprintf( stderr, "Invalid argument: %" PRIs_LIBCSTRING_SYSTEM "\n", argv[ optind ] ); usage_fprint( stdout ); return( EXIT_FAILURE ); case '1': calculation_method = 1; break; case '2': calculation_method = 2; break; case 'c': crc32 = atol( optarg ); validate_crc = 1; break; case 'h': usage_fprint( stdout ); return( EXIT_SUCCESS ); case 'i': initial_value = atol( optarg ); break; case 'o': source_offset = atol( optarg ); break; case 'p': polynomial = atol( optarg ); break; case 's': source_size = atol( optarg ); break; case 'v': verbose = 1; break; case 'V': assorted_output_copyright_fprint( stdout ); return( EXIT_SUCCESS ); case 'w': weak_crc = 1; break; } } if( optind == argc ) { fprintf( stderr, "Missing source file.\n" ); usage_fprint( stdout ); return( EXIT_FAILURE ); } source = argv[ optind ]; libcnotify_stream_set( stderr, NULL ); libcnotify_verbose_set( verbose ); /* Open the source file */ if( libcfile_file_initialize( &source_file, &error ) != 1 ) { fprintf( stderr, "Unable to create source file.\n" ); goto on_error; } if( libcfile_file_open( source_file, source, LIBCFILE_OPEN_READ, &error ) != 1 ) { fprintf( stderr, "Unable to open source file.\n" ); goto on_error; } if( source_size == 0 ) { if( libcfile_file_get_size( source_file, &source_size, &error ) == -1 ) { fprintf( stderr, "Unable to determine size of source file.\n" ); goto on_error; } } if( source_size == 0 ) { fprintf( stderr, "Invalid source size value is zero.\n" ); goto on_error; } if( source_size > (size_t) SSIZE_MAX ) { fprintf( stderr, "Invalid source size value exceeds maximum.\n" ); goto on_error; } buffer = (uint8_t *) memory_allocate( sizeof( uint8_t ) * source_size ); if( buffer == NULL ) { fprintf( stderr, "Unable to create buffer.\n" ); goto on_error; } /* Position the source file at the right offset */ if( libcfile_file_seek_offset( source_file, source_offset, SEEK_SET, &error ) == -1 ) { fprintf( stderr, "Unable to seek offset in source file.\n" ); goto on_error; } read_count = libcfile_file_read_buffer( source_file, buffer, source_size, &error ); if( read_count != (ssize_t) source_size ) { fprintf( stderr, "Unable to read from source file.\n" ); goto on_error; } /* Clean up */ if( libcfile_file_close( source_file, &error ) != 0 ) { fprintf( stderr, "Unable to close source file.\n" ); goto on_error; } if( libcfile_file_free( &source_file, &error ) != 1 ) { fprintf( stderr, "Unable to free source file.\n" ); goto on_error; } if( calculation_method == 1 ) { result = crc32_calculate_modulo2( &calculated_crc32, buffer, source_size, initial_value, weak_crc, &error ); } else if( calculation_method == 2 ) { initialize_crc32_table( polynomial ); result = crc32_calculate( &calculated_crc32, buffer, source_size, initial_value, weak_crc, &error ); } if( result != 1 ) { fprintf( stderr, "Unable to calculate CRC-32.\n" ); goto on_error; } if( libcnotify_verbose != 0 ) { libcnotify_print_data( buffer, source_size, 0 ); } fprintf( stdout, "Calculated CRC-32: %" PRIu32 " (0x%08" PRIx32 ")\n", calculated_crc32, calculated_crc32 ); if( validate_crc != 0 ) { if( calculated_crc32 != crc32 ) { fprintf( stdout, "Mismatch between CRC-32: %" PRIu32 " and calculated CRC-32: %" PRIu32 "\n", crc32, calculated_crc32 ); result = crc32_validate( crc32, calculated_crc32, &bit_index, &error ); if( result == -1 ) { fprintf( stderr, "Unable to locate error.\n" ); goto on_error; } else if( result != 0 ) { fprintf( stdout, "Single bit-error in bit: %" PRIu8 " of CRC-32\n", bit_index ); } result = crc32_locate_error_offset( crc32, calculated_crc32, buffer, source_size, initial_value, &error ); if( result == -1 ) { fprintf( stderr, "Unable to locate error.\n" ); goto on_error; } } else { fprintf( stdout, "Match between CRC-32: %" PRIu32 " and calculated CRC-32: %" PRIu32 "\n", crc32, calculated_crc32 ); } } memory_free( buffer ); return( EXIT_SUCCESS ); on_error: if( error != NULL ) { libcnotify_print_error_backtrace( error ); libcerror_error_free( &error ); } if( buffer != NULL ) { memory_free( buffer ); } if( source_file != NULL ) { libcfile_file_free( &source_file, NULL ); } return( EXIT_FAILURE ); }
if (s->check_type == XZ_CHECK_CRC32) { ret = crc32_validate(s, b); if (ret != XZ_STREAM_END) return ret; } #ifdef XZ_DEC_ANY_CHECK else if (!check_skip(s, b)) { return XZ_OK; } #endif