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