119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * This testing program makes sure the badblocks implementation works. 319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Copyright (C) 1996 by Theodore Ts'o. 53984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * 619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * %Begin-Header% 719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * This file may be redistributed under the terms of the GNU Public 819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * License. 919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * %End-Header% 1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdio.h> 1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <string.h> 1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_UNISTD_H 1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <unistd.h> 1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <fcntl.h> 1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <time.h> 1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/stat.h> 2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/types.h> 2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_ERRNO_H 2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <errno.h> 2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "ext2_fs.h" 2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "ext2fs.h" 2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define ADD_BLK 0x0001 2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define DEL_BLK 0x0002 3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectblk_t test1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0 }; 3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectblk_t test2[] = { 11, 10, 9, 8, 7, 6, 5, 4, 3, 3, 2, 1 }; 3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectblk_t test3[] = { 3, 1, 4, 5, 9, 2, 7, 10, 5, 6, 10, 8, 0 }; 3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectblk_t test4[] = { 20, 50, 12, 17, 13, 2, 66, 23, 56, 0 }; 3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectblk_t test4a[] = { 3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 20, 1, 3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 50, 1, 3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3, 0, 3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 17, 1, 4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 18, 0, 4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 16, 0, 4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 11, 0, 4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 12, 1, 4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 13, 1, 453984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 14, 0, 4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 80, 0, 4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 45, 0, 4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 66, 1, 4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 0 }; 5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectblk_t test5[] = { 31, 20, 17, 51, 23, 1, 56, 57, 0 }; 5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectblk_t test5a[] = { 5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 50, ADD_BLK, 5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 51, DEL_BLK, 5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 57, DEL_BLK, 5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 66, ADD_BLK, 5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 31, DEL_BLK, 5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 12, ADD_BLK, 5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 2, ADD_BLK, 5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 13, ADD_BLK, 6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1, DEL_BLK, 6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 0 6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project }; 633984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic int test_fail = 0; 6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic int test_expected_fail = 0; 6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic errcode_t create_test_list(blk_t *vec, badblocks_list *ret) 6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project badblocks_list bb; 7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int i; 733984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_badblocks_list_create(&bb, 5); 7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("create_test_list", retval, "while creating list"); 7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (i=0; vec[i]; i++) { 8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_badblocks_list_add(bb, vec[i]); 8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("create_test_list", retval, 8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "while adding test vector %d", i); 8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_badblocks_list_free(bb); 8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *ret = bb; 8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void print_list(badblocks_list bb, int verify) 9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 9419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project badblocks_iterate iter; 9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t blk; 9719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int i, ok; 983984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 9919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_badblocks_list_iterate_begin(bb, &iter); 10019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 10119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("print_list", retval, "while setting up iterator"); 10219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 10319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 10419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ok = i = 1; 10519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project while (ext2fs_badblocks_list_iterate(iter, &blk)) { 10619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("%u ", blk); 10719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (i++ != blk) 10819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ok = 0; 10919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 11019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_badblocks_list_iterate_end(iter); 11119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (verify) { 11219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (ok) 11319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("--- OK"); 11419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else { 11519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("--- NOT OK"); 11619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project test_fail++; 11719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 11819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 11919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 12019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 12119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void validate_test_seq(badblocks_list bb, blk_t *vec) 12219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 12319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int i, match, ok; 12419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 12519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (i = 0; vec[i]; i += 2) { 12619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project match = ext2fs_badblocks_list_test(bb, vec[i]); 12719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (match == vec[i+1]) 12819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ok = 1; 12919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else { 13019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ok = 0; 13119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project test_fail++; 13219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 13319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("\tblock %u is %s --- %s\n", vec[i], 13419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project match ? "present" : "absent", 13519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ok ? "OK" : "NOT OK"); 13619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 13719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 13819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 13919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void do_test_seq(badblocks_list bb, blk_t *vec) 14019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 14119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int i, match; 14219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 14319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (i = 0; vec[i]; i += 2) { 14419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project switch (vec[i+1]) { 14519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case ADD_BLK: 14619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_badblocks_list_add(bb, vec[i]); 14719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project match = ext2fs_badblocks_list_test(bb, vec[i]); 14819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Adding block %u --- now %s\n", vec[i], 14919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project match ? "present" : "absent"); 15019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!match) { 15119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("FAILURE!\n"); 15219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project test_fail++; 15319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 15419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 15519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case DEL_BLK: 15619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_badblocks_list_del(bb, vec[i]); 15719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project match = ext2fs_badblocks_list_test(bb, vec[i]); 15819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Removing block %u --- now %s\n", vec[i], 1593984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2fs_badblocks_list_test(bb, vec[i]) ? 16019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "present" : "absent"); 16119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (match) { 16219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("FAILURE!\n"); 16319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project test_fail++; 16419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 16519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 16619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 16719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 16819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 16919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 17019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 17119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint file_test(badblocks_list bb) 17219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 17319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project badblocks_list new_bb = 0; 17419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 17519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project FILE *f; 17619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 17719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project f = tmpfile(); 17819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!f) { 17919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(stderr, "Error opening temp file: %s\n", 18019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project error_message(errno)); 18119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 1; 18219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 18319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_write_bb_FILE(bb, 0, f); 18419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 18519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("file_test", retval, "while writing bad blocks"); 18619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 1; 18719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 18819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 18919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project rewind(f); 19019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_read_bb_FILE2(0, f, &new_bb, 0, 0); 19119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 19219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("file_test", retval, "while reading bad blocks"); 19319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 1; 19419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 19519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fclose(f); 19619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 19719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (ext2fs_badblocks_equal(bb, new_bb)) { 19819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Block bitmap matched after reading and writing.\n"); 19919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else { 20019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Block bitmap NOT matched.\n"); 20119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project test_fail++; 20219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 20319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 20419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 20519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 20619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void invalid_proc(ext2_filsys fs, blk_t blk) 20719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 20819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (blk == 34500) { 20919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Expected invalid block\n"); 21019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project test_expected_fail++; 21119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else { 21219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Invalid block #: %u\n", blk); 21319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project test_fail++; 21419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 21519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 21619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 21719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint file_test_invalid(badblocks_list bb) 21819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 21919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project badblocks_list new_bb = 0; 22019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 22119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_filsys fs; 22219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project FILE *f; 22319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 22419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs = malloc(sizeof(struct struct_ext2_filsys)); 22519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project memset(fs, 0, sizeof(struct struct_ext2_filsys)); 22619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->magic = EXT2_ET_MAGIC_EXT2FS_FILSYS; 22719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->super = malloc(SUPERBLOCK_SIZE); 22819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project memset(fs->super, 0, SUPERBLOCK_SIZE); 22919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->super->s_first_data_block = 1; 23019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->super->s_blocks_count = 100; 23119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 23219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project f = tmpfile(); 23319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!f) { 23419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(stderr, "Error opening temp file: %s\n", 23519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project error_message(errno)); 23619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 1; 23719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 23819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_write_bb_FILE(bb, 0, f); 23919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 24019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("file_test", retval, "while writing bad blocks"); 24119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 1; 24219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 24319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(f, "34500\n"); 24419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 24519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project rewind(f); 24619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project test_expected_fail = 0; 24719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_read_bb_FILE(fs, f, &new_bb, invalid_proc); 24819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 24919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("file_test", retval, "while reading bad blocks"); 25019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 1; 25119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 25219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fclose(f); 25319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!test_expected_fail) { 25419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Expected test failure didn't happen!\n"); 25519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project test_fail++; 25619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 2573984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 25819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 25919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (ext2fs_badblocks_equal(bb, new_bb)) { 26019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Block bitmap matched after reading and writing.\n"); 26119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else { 26219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Block bitmap NOT matched.\n"); 26319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project test_fail++; 26419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 26519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 26619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 26719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 26819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint main(int argc, char **argv) 26919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 27019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project badblocks_list bb1, bb2, bb3, bb4, bb5; 27119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int equal; 27219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 27319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 2743984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt add_error_table(&et_ext2_error_table); 2753984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 27619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project bb1 = bb2 = bb3 = bb4 = bb5 = 0; 27719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 27819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("test1: "); 27919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = create_test_list(test1, &bb1); 28019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval == 0) 28119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project print_list(bb1, 1); 28219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("\n"); 2833984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 28419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("test2: "); 28519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = create_test_list(test2, &bb2); 28619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval == 0) 28719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project print_list(bb2, 1); 28819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("\n"); 28919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 29019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("test3: "); 29119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = create_test_list(test3, &bb3); 29219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval == 0) 29319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project print_list(bb3, 1); 29419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("\n"); 2953984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 29619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("test4: "); 29719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = create_test_list(test4, &bb4); 29819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval == 0) { 29919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project print_list(bb4, 0); 30019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("\n"); 30119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project validate_test_seq(bb4, test4a); 30219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 30319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("\n"); 30419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 30519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("test5: "); 30619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = create_test_list(test5, &bb5); 30719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval == 0) { 30819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project print_list(bb5, 0); 30919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("\n"); 31019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project do_test_seq(bb5, test5a); 31119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("After test5 sequence: "); 31219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project print_list(bb5, 0); 31319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("\n"); 31419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 31519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("\n"); 31619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 31719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (bb1 && bb2 && bb3 && bb4 && bb5) { 31819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Comparison tests:\n"); 31919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project equal = ext2fs_badblocks_equal(bb1, bb2); 3203984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printf("bb1 and bb2 are %sequal.\n", equal ? "" : "NOT "); 32119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (equal) 32219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project test_fail++; 32319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 32419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project equal = ext2fs_badblocks_equal(bb1, bb3); 3253984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printf("bb1 and bb3 are %sequal.\n", equal ? "" : "NOT "); 32619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!equal) 32719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project test_fail++; 3283984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 32919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project equal = ext2fs_badblocks_equal(bb1, bb4); 3303984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printf("bb1 and bb4 are %sequal.\n", equal ? "" : "NOT "); 33119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (equal) 33219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project test_fail++; 33319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 33419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project equal = ext2fs_badblocks_equal(bb4, bb5); 3353984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printf("bb4 and bb5 are %sequal.\n", equal ? "" : "NOT "); 33619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!equal) 33719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project test_fail++; 33819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("\n"); 33919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 3403984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 34119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project file_test(bb4); 34219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 34319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project file_test_invalid(bb4); 3443984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 34519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (test_fail == 0) 34619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("ext2fs library badblocks tests checks out OK!\n"); 34719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 34819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (bb1) 34919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_badblocks_list_free(bb1); 35019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (bb2) 35119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_badblocks_list_free(bb2); 35219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (bb3) 35319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_badblocks_list_free(bb3); 35419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (bb4) 35519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_badblocks_list_free(bb4); 35619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 35719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return test_fail; 35819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 35919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 360