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