~ubuntu-branches/ubuntu/edgy/e2fsprogs/edgy

« back to all changes in this revision

Viewing changes to lib/ext2fs/read_bb_file.c

  • Committer: Bazaar Package Importer
  • Author(s): Yann Dirson
  • Date: 2002-03-21 23:58:48 UTC
  • Revision ID: james.westby@ubuntu.com-20020321235848-cmmy98hy0nihp922
Tags: upstream-1.27
ImportĀ upstreamĀ versionĀ 1.27

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * read_bb_file.c --- read a list of bad blocks from a FILE *
 
3
 *
 
4
 * Copyright (C) 1994, 1995, 2000 Theodore Ts'o.
 
5
 *
 
6
 * %Begin-Header%
 
7
 * This file may be redistributed under the terms of the GNU Public
 
8
 * License.
 
9
 * %End-Header%
 
10
 */
 
11
 
 
12
#include <stdio.h>
 
13
#include <string.h>
 
14
#if HAVE_UNISTD_H
 
15
#include <unistd.h>
 
16
#endif
 
17
#include <fcntl.h>
 
18
#include <time.h>
 
19
#if HAVE_SYS_STAT_H
 
20
#include <sys/stat.h>
 
21
#endif
 
22
#if HAVE_SYS_TYPES_H
 
23
#include <sys/types.h>
 
24
#endif
 
25
 
 
26
#include "ext2_fs.h"
 
27
#include "ext2fs.h"
 
28
 
 
29
/*
 
30
 * Reads a list of bad blocks from  a FILE *
 
31
 */
 
32
errcode_t ext2fs_read_bb_FILE2(ext2_filsys fs, FILE *f, 
 
33
                               ext2_badblocks_list *bb_list,
 
34
                               void *private,
 
35
                               void (*invalid)(ext2_filsys fs,
 
36
                                               blk_t blk,
 
37
                                               char *badstr,
 
38
                                               void *private))
 
39
{
 
40
        errcode_t       retval;
 
41
        blk_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, "%u", &blockno);
 
58
                if (count <= 0)
 
59
                        continue;
 
60
                if (fs &&
 
61
                    ((blockno < fs->super->s_first_data_block) ||
 
62
                    (blockno >= fs->super->s_blocks_count))) {
 
63
                        if (invalid)
 
64
                                (invalid)(fs, blockno, buf, private);
 
65
                        continue;
 
66
                }
 
67
                retval = ext2fs_badblocks_list_add(*bb_list, blockno);
 
68
                if (retval)
 
69
                        return retval;
 
70
        }
 
71
        return 0;
 
72
}
 
73
 
 
74
static void call_compat_invalid(ext2_filsys fs, blk_t blk,
 
75
                                char *badstr, void *private)
 
76
{
 
77
        void (*invalid)(ext2_filsys, blk_t);
 
78
 
 
79
        invalid = (void (*)(ext2_filsys, blk_t)) private;
 
80
        if (invalid)
 
81
                invalid(fs, blk);
 
82
}
 
83
 
 
84
 
 
85
/*
 
86
 * Reads a list of bad blocks from  a FILE *
 
87
 */
 
88
errcode_t ext2fs_read_bb_FILE(ext2_filsys fs, FILE *f, 
 
89
                              ext2_badblocks_list *bb_list,
 
90
                              void (*invalid)(ext2_filsys fs, blk_t blk))
 
91
{
 
92
        return ext2fs_read_bb_FILE2(fs, f, bb_list, (void *) invalid,
 
93
                                    call_compat_invalid);
 
94
}
 
95
 
 
96