read_bb_file.c revision 18a1444b4f1e6a0948fd38fa0de382d86cfe04de
14b6829f0d28990dd645e16386eb226d0f10c8731shiqian/* 24b6829f0d28990dd645e16386eb226d0f10c8731shiqian * read_bb_file.c --- read a list of bad blocks from a FILE * 34b6829f0d28990dd645e16386eb226d0f10c8731shiqian * 44b6829f0d28990dd645e16386eb226d0f10c8731shiqian * Copyright (C) 1994, 1995, 2000 Theodore Ts'o. 54b6829f0d28990dd645e16386eb226d0f10c8731shiqian * 64b6829f0d28990dd645e16386eb226d0f10c8731shiqian * %Begin-Header% 7adf85093a9659fc9bbfb7f4bb973be557c4849b9shiqian * This file may be redistributed under the terms of the GNU Library 84b6829f0d28990dd645e16386eb226d0f10c8731shiqian * General Public License, version 2. 94b6829f0d28990dd645e16386eb226d0f10c8731shiqian * %End-Header% 104b6829f0d28990dd645e16386eb226d0f10c8731shiqian */ 114b6829f0d28990dd645e16386eb226d0f10c8731shiqian 12f904a612d9444ab36c07a8e619c113432e046f49vladlosev#include <stdio.h> 137219189f0890d36f233d0048b09e12690e3ab63ashiqian#include <string.h> 149a81031e741589166504ebae64ffc5467c994ed5zhanyong.wan#if HAVE_UNISTD_H 154b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include <unistd.h> 16e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian#endif 174b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include <fcntl.h> 184b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include <time.h> 194b6829f0d28990dd645e16386eb226d0f10c8731shiqian#if HAVE_SYS_STAT_H 209a81031e741589166504ebae64ffc5467c994ed5zhanyong.wan#include <sys/stat.h> 214b6829f0d28990dd645e16386eb226d0f10c8731shiqian#endif 224b6829f0d28990dd645e16386eb226d0f10c8731shiqian#if HAVE_SYS_TYPES_H 231abaaec65d0e42e95857f6dcb76726122cb3e5a6vladlosev#include <sys/types.h> 24e1247c5d8dfdf051dfb6035df1dae84827089385zhanyong.wan#endif 254b6829f0d28990dd645e16386eb226d0f10c8731shiqian 264b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include "ext2_fs.h" 274b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include "ext2fs.h" 280ee54f996f44ba697e6e13f6a4430c154b38625dpreston.a.jackson 29941b5ee8ebaad627df59eaa03509021b3cfa3bafshiqian/* 304b6829f0d28990dd645e16386eb226d0f10c8731shiqian * Reads a list of bad blocks from a FILE * 314b6829f0d28990dd645e16386eb226d0f10c8731shiqian */ 324b6829f0d28990dd645e16386eb226d0f10c8731shiqianerrcode_t ext2fs_read_bb_FILE2(ext2_filsys fs, FILE *f, 334b6829f0d28990dd645e16386eb226d0f10c8731shiqian ext2_badblocks_list *bb_list, 344b6829f0d28990dd645e16386eb226d0f10c8731shiqian void *priv_data, 35f904a612d9444ab36c07a8e619c113432e046f49vladlosev void (*invalid)(ext2_filsys fs, 364834581321d60c17997d65a2360c7674f15f9bbcshiqian blk_t blk, 374b6829f0d28990dd645e16386eb226d0f10c8731shiqian char *badstr, 38 void *priv_data)) 39{ 40 errcode_t retval; 41 blk64_t blockno; 42 int count; 43 char buf[128]; 44 45 if (fs) 46 EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS); 47 48 if (!*bb_list) { 49 retval = ext2fs_badblocks_list_create(bb_list, 10); 50 if (retval) 51 return retval; 52 } 53 54 while (!feof (f)) { 55 if (fgets(buf, sizeof(buf), f) == NULL) 56 break; 57 count = sscanf(buf, "%llu", &blockno); 58 if (count <= 0) 59 continue; 60 /* Badblocks isn't going to be updated for 64bit */ 61 if (blockno >> 32) 62 return EOVERFLOW; 63 if (fs && 64 ((blockno < fs->super->s_first_data_block) || 65 (blockno >= ext2fs_blocks_count(fs->super)))) { 66 if (invalid) 67 (invalid)(fs, blockno, buf, priv_data); 68 continue; 69 } 70 retval = ext2fs_badblocks_list_add(*bb_list, blockno); 71 if (retval) 72 return retval; 73 } 74 return 0; 75} 76 77struct compat_struct { 78 void (*invalid)(ext2_filsys, blk_t); 79}; 80 81static void call_compat_invalid(ext2_filsys fs, blk_t blk, 82 char *badstr EXT2FS_ATTR((unused)), 83 void *priv_data) 84{ 85 struct compat_struct *st; 86 87 st = (struct compat_struct *) priv_data; 88 if (st->invalid) 89 (st->invalid)(fs, blk); 90} 91 92 93/* 94 * Reads a list of bad blocks from a FILE * 95 */ 96errcode_t ext2fs_read_bb_FILE(ext2_filsys fs, FILE *f, 97 ext2_badblocks_list *bb_list, 98 void (*invalid)(ext2_filsys fs, blk_t blk)) 99{ 100 struct compat_struct st; 101 102 st.invalid = invalid; 103 104 return ext2fs_read_bb_FILE2(fs, f, bb_list, &st, 105 call_compat_invalid); 106} 107 108 109