busybox/e2fsprogs/old_e2fsprogs/ext2fs/read_bb_file.c
<<
>>
Prefs
   1/* vi: set sw=4 ts=4: */
   2/*
   3 * read_bb_file.c --- read a list of bad blocks from a FILE *
   4 *
   5 * Copyright (C) 1994, 1995, 2000 Theodore Ts'o.
   6 *
   7 * %Begin-Header%
   8 * This file may be redistributed under the terms of the GNU Public
   9 * License.
  10 * %End-Header%
  11 */
  12
  13#include <stdio.h>
  14#include <string.h>
  15#if HAVE_UNISTD_H
  16#include <unistd.h>
  17#endif
  18#include <fcntl.h>
  19#include <time.h>
  20#if HAVE_SYS_STAT_H
  21#include <sys/stat.h>
  22#endif
  23#if HAVE_SYS_TYPES_H
  24#include <sys/types.h>
  25#endif
  26
  27#include "ext2_fs.h"
  28#include "ext2fs.h"
  29
  30/*
  31 * Reads a list of bad blocks from  a FILE *
  32 */
  33errcode_t ext2fs_read_bb_FILE2(ext2_filsys fs, FILE *f,
  34                               ext2_badblocks_list *bb_list,
  35                               void *priv_data,
  36                               void (*invalid)(ext2_filsys fs,
  37                                               blk_t blk,
  38                                               char *badstr,
  39                                               void *priv_data))
  40{
  41        errcode_t       retval;
  42        blk_t           blockno;
  43        int             count;
  44        char            buf[128];
  45
  46        if (fs)
  47                EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS);
  48
  49        if (!*bb_list) {
  50                retval = ext2fs_badblocks_list_create(bb_list, 10);
  51                if (retval)
  52                        return retval;
  53        }
  54
  55        while (!feof (f)) {
  56                if (fgets(buf, sizeof(buf), f) == NULL)
  57                        break;
  58                count = sscanf(buf, "%u", &blockno);
  59                if (count <= 0)
  60                        continue;
  61                if (fs &&
  62                    ((blockno < fs->super->s_first_data_block) ||
  63                    (blockno >= fs->super->s_blocks_count))) {
  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
  75static void call_compat_invalid(ext2_filsys fs, blk_t blk,
  76                                char *badstr EXT2FS_ATTR((unused)),
  77                                void *priv_data)
  78{
  79        void (*invalid)(ext2_filsys, blk_t);
  80
  81        invalid = (void (*)(ext2_filsys, blk_t)) priv_data;
  82        if (invalid)
  83                invalid(fs, blk);
  84}
  85
  86
  87/*
  88 * Reads a list of bad blocks from  a FILE *
  89 */
  90errcode_t ext2fs_read_bb_FILE(ext2_filsys fs, FILE *f,
  91                              ext2_badblocks_list *bb_list,
  92                              void (*invalid)(ext2_filsys fs, blk_t blk))
  93{
  94        return ext2fs_read_bb_FILE2(fs, f, bb_list, (void *) invalid,
  95                                    call_compat_invalid);
  96}
  97
  98
  99