read_bb_file.c revision d1154eb460efe588eaed3d439c1caaca149fa362
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * read_bb_file.c --- read a list of bad blocks from a FILE *
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (C) 1994, 1995, 2000 Theodore Ts'o.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * %Begin-Header%
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This file may be redistributed under the terms of the GNU Library
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * General Public License, version 2.
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * %End-Header%
100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch */
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "config.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h>
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h>
15ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if HAVE_UNISTD_H
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <unistd.h>
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include <fcntl.h>
19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include <time.h>
20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if HAVE_SYS_STAT_H
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <sys/stat.h>
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if HAVE_SYS_TYPES_H
24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include <sys/types.h>
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ext2_fs.h"
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ext2fs.h"
297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)/*
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * Reads a list of bad blocks from  a FILE *
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)errcode_t ext2fs_read_bb_FILE2(ext2_filsys fs, FILE *f,
340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch			       ext2_badblocks_list *bb_list,
350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch			       void *priv_data,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			       void (*invalid)(ext2_filsys fs,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					       blk_t blk,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					       char *badstr,
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)					       void *priv_data))
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	errcode_t	retval;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	blk_t		blockno;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int		count;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	char		buf[128];
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (fs)
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)		EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (!*bb_list) {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		retval = ext2fs_badblocks_list_create(bb_list, 10);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (retval)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return retval;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch	while (!feof (f)) {
56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch		if (fgets(buf, sizeof(buf), f) == NULL)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			break;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		count = sscanf(buf, "%u", &blockno);
59		if (count <= 0)
60			continue;
61		if (fs &&
62		    ((blockno < fs->super->s_first_data_block) ||
63		     (blockno >= ext2fs_blocks_count(fs->super)))) {
64			if (invalid)
65				(invalid)(fs, blockno, buf, priv_data);
66			continue;
67		}
68		retval = ext2fs_badblocks_list_add(*bb_list, blockno);
69		if (retval)
70			return retval;
71	}
72	return 0;
73}
74
75struct compat_struct {
76	void (*invalid)(ext2_filsys, blk_t);
77};
78
79static void call_compat_invalid(ext2_filsys fs, blk_t blk,
80				char *badstr EXT2FS_ATTR((unused)),
81				void *priv_data)
82{
83	struct compat_struct *st;
84
85	st = (struct compat_struct *) priv_data;
86	if (st->invalid)
87		(st->invalid)(fs, blk);
88}
89
90
91/*
92 * Reads a list of bad blocks from  a FILE *
93 */
94errcode_t ext2fs_read_bb_FILE(ext2_filsys fs, FILE *f,
95			      ext2_badblocks_list *bb_list,
96			      void (*invalid)(ext2_filsys fs, blk_t blk))
97{
98	struct compat_struct st;
99
100	st.invalid = invalid;
101
102	return ext2fs_read_bb_FILE2(fs, f, bb_list, &st,
103				    call_compat_invalid);
104}
105
106
107