tzh
2024-08-22 c7d0944258c7d0943aa7b2211498fd612971ce27
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/*
 * This testing program checks the offset of the ext2_filsys structure
 *
 * Copyright (C) 2007 by Theodore Ts'o.
 *
 * %Begin-Header%
 * This file may be redistributed under the terms of the GNU Library
 * General Public License, version 2.
 * %End-Header%
 */
 
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
 
#include "ext2fs.h"
 
struct struct_ext2_filsys fs;
 
#ifndef offsetof
#define offsetof(type, member)  __builtin_offsetof (type, member)
#endif
#define check_field(x) cur_offset = do_field(#x, sizeof(fs.x),        \
                   offsetof(struct struct_ext2_filsys, x), \
                   cur_offset)
 
static int do_field(const char *field, size_t size, int offset, int cur_offset)
{
   if (offset != cur_offset) {
       printf("\t(padding %d bytes?)\n", offset - cur_offset);
   }
   printf("%8d %-30s %3u\n", offset, field, (unsigned) size);
   return offset + size;
}
 
int main(int argc, char **argv)
{
#if (__GNUC__ >= 4)
   int cur_offset = 0;
 
   printf("%8s %-30s %3s\n", "offset", "field", "size");
   check_field(magic);
   check_field(io);
   check_field(flags);
   check_field(device_name);
   check_field(super);
   check_field(blocksize);
   check_field(fragsize);
   check_field(group_desc_count);
   check_field(desc_blocks);
   check_field(group_desc);
   check_field(inode_blocks_per_group);
   check_field(inode_map);
   check_field(block_map);
   check_field(get_blocks);
   check_field(check_directory);
   check_field(write_bitmaps);
   check_field(read_inode);
   check_field(write_inode);
   check_field(badblocks);
   check_field(dblist);
   check_field(stride);
   check_field(orig_super);
   check_field(image_header);
   check_field(umask);
   check_field(now);
   check_field(cluster_ratio_bits);
   check_field(reserved);
   check_field(priv_data);
   check_field(icache);
   check_field(image_io);
   check_field(get_alloc_block);
   check_field(block_alloc_stats);
   check_field(mmp_buf);
   check_field(mmp_cmp);
   check_field(mmp_fd);
   check_field(mmp_last_written);
   printf("Ending offset is %d\n\n", cur_offset);
#endif
   exit(0);
}