read_bb_file.c revision 4cbe8af4b0d0c72fb28bb500c1bd8a46b00fdde3
13839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* 23839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * read_bb_file.c --- read a list of bad blocks for a FILE * 33839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * 419c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * Copyright (C) 1994, 1995 Theodore Ts'o. 519c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * 619c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * %Begin-Header% 719c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * This file may be redistributed under the terms of the GNU Public 819c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * License. 919c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * %End-Header% 103839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 113839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <stdio.h> 133839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <string.h> 144cbe8af4b0d0c72fb28bb500c1bd8a46b00fdde3Theodore Ts'o#if HAVE_UNISTD_H 153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <unistd.h> 164cbe8af4b0d0c72fb28bb500c1bd8a46b00fdde3Theodore Ts'o#endif 173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <stdlib.h> 183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <fcntl.h> 193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <time.h> 203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <sys/stat.h> 213839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <sys/types.h> 223839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 233839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <linux/ext2_fs.h> 243839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 253839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "ext2fs.h" 263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 273839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* 283839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Reads a list of bad blocks from a FILE * 293839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oerrcode_t ext2fs_read_bb_FILE(ext2_filsys fs, FILE *f, 3119c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o ext2_badblocks_list *bb_list, 323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o void (*invalid)(ext2_filsys fs, blk_t blk)) 333839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 343839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o errcode_t retval; 353839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o blk_t blockno; 363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o int count; 37f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o char buf[128]; 38f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o 39f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS); 403839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 413839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (!*bb_list) { 4219c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o retval = ext2fs_badblocks_list_create(bb_list, 10); 433839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) 443839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return retval; 453839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 463839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 473839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o while (!feof (f)) { 48f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o if (fgets(buf, sizeof(buf), f) == NULL) 493839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o break; 5050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o count = sscanf(buf, "%u", &blockno); 51f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o if (count <= 0) 52f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o continue; 533839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if ((blockno < fs->super->s_first_data_block) || 543839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o (blockno >= fs->super->s_blocks_count)) { 553839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (invalid) 563839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o (invalid)(fs, blockno); 573839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o continue; 583839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 5919c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o retval = ext2fs_badblocks_list_add(*bb_list, blockno); 60f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o if (retval) 61f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o return retval; 623839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 633839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return 0; 643839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 653839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 663839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 67