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