generic/60[78]: ensure the initial DAX file flag state before test
[xfstests-dev.git] / dmapi / src / suite1 / cmd / struct_test.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (c) 2000-2001 Silicon Graphics, Inc.
4  * All Rights Reserved.
5  */
6         
7 #include <stddef.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10
11 #ifdef linux
12 #include <dmapi.h>
13 #else
14 #include <sys/dmi.h>
15 #endif
16
17 /* The purpose of this test is to make sure that each field in each structure
18    defined in dmi.h is properly aligned so that there is no dead space, and
19    that the sizes and offsets of those fields remain constant no matter what
20    mode the program is compiled with, i.e. -32, -n32 or -64.
21
22    Run the program with no parameters.  If everything is correct, no message
23    will start with the word "ERROR:".  Compile and run the test in each of
24    the three mods and diff the outputs.  They must all be identical.
25
26    Note: this test cannot detect the addition of new structures to dmi.h, so
27    it will have to periodically be compared with dmi.h manually to ensure that
28    all the structures are still being validated!
29 */
30
31 #define S_START(struct_name)    { offset = 0; s_name = #struct_name; }
32
33 #define S_NEXT(struct_name, field_name) \
34 { \
35         struct_name     X; \
36  \
37         f_name = #field_name; \
38         printf("field %s.%s offset is %d\n", s_name, f_name, offset); \
39         if (offsetof(struct_name, field_name) != offset) { \
40                 printf("ERROR: field %s should be %d\n", \
41                         #struct_name "." #field_name, \
42                         (int) offsetof(struct_name, field_name)); \
43         } \
44         offset = offsetof(struct_name, field_name) + sizeof(X.field_name); \
45 }
46
47 #define S_END(struct_name) \
48 { \
49         printf("struct %s size is %d\n", s_name, offset); \
50         if (sizeof(struct_name) != offset) { \
51                 printf("ERROR: struct %s should be %zd\n", \
52                         s_name, sizeof(struct_name)); \
53         } \
54 }
55
56
57 char *Progname;
58
59 int main(
60         int     argc,
61         char    **argv)
62 {
63         char    *s_name = NULL;
64         char    *f_name = NULL;
65         int     offset = 0;
66
67
68         S_START(dm_vardata_t);
69         S_NEXT(dm_vardata_t, vd_offset);
70         S_NEXT(dm_vardata_t, vd_length);
71         S_END(dm_vardata_t);
72
73
74         S_START(dm_attrname_t);
75         S_NEXT(dm_attrname_t, an_chars);
76         S_END(dm_attrname_t);
77
78
79         S_START(dm_attrlist_t);
80         S_NEXT(dm_attrlist_t,   _link);
81         S_NEXT(dm_attrlist_t, al_name);
82         S_NEXT(dm_attrlist_t, al_data);
83         S_END(dm_attrlist_t);
84
85
86         S_START(dm_dispinfo_t);
87         S_NEXT(dm_dispinfo_t, _link);
88         S_NEXT(dm_dispinfo_t, di_pad1);
89         S_NEXT(dm_dispinfo_t, di_fshandle);
90         S_NEXT(dm_dispinfo_t, di_eventset);
91         S_END(dm_dispinfo_t);
92
93
94         S_START(dm_eventmsg_t);
95         S_NEXT(dm_eventmsg_t, _link);
96         S_NEXT(dm_eventmsg_t, ev_type);
97         S_NEXT(dm_eventmsg_t, ev_token);
98         S_NEXT(dm_eventmsg_t, ev_sequence);
99         S_NEXT(dm_eventmsg_t, ev_data);
100         S_END(dm_eventmsg_t);
101
102
103         S_START(dm_cancel_event_t);
104         S_NEXT(dm_cancel_event_t, ce_sequence);
105         S_NEXT(dm_cancel_event_t, ce_token);
106         S_END(dm_cancel_event_t);
107
108
109         S_START(dm_data_event_t);
110         S_NEXT(dm_data_event_t, de_handle);
111         S_NEXT(dm_data_event_t, de_offset);
112         S_NEXT(dm_data_event_t, de_length);
113         S_END(dm_data_event_t);
114
115
116         S_START(dm_destroy_event_t);
117         S_NEXT(dm_destroy_event_t, ds_handle);
118         S_NEXT(dm_destroy_event_t, ds_attrname);
119         S_NEXT(dm_destroy_event_t, ds_attrcopy);
120         S_END(dm_destroy_event_t);
121
122
123         S_START(dm_mount_event_t);
124         S_NEXT(dm_mount_event_t, me_mode);
125         S_NEXT(dm_mount_event_t, me_handle1);
126         S_NEXT(dm_mount_event_t, me_handle2);
127         S_NEXT(dm_mount_event_t, me_name1);
128         S_NEXT(dm_mount_event_t, me_name2);
129         S_NEXT(dm_mount_event_t, me_roothandle);
130         S_END(dm_mount_event_t);
131
132
133         S_START(dm_namesp_event_t);
134         S_NEXT(dm_namesp_event_t, ne_mode);
135         S_NEXT(dm_namesp_event_t, ne_handle1);
136         S_NEXT(dm_namesp_event_t, ne_handle2);
137         S_NEXT(dm_namesp_event_t, ne_name1);
138         S_NEXT(dm_namesp_event_t, ne_name2);
139         S_NEXT(dm_namesp_event_t, ne_retcode);
140         S_END(dm_namesp_event_t);
141
142
143         S_START(dm_extent_t);
144         S_NEXT(dm_extent_t, ex_type);
145         S_NEXT(dm_extent_t, ex_pad1);
146         S_NEXT(dm_extent_t, ex_offset);
147         S_NEXT(dm_extent_t, ex_length);
148         S_END(dm_extent_t);
149
150
151         S_START(dm_fileattr_t);
152         S_NEXT(dm_fileattr_t, fa_mode);
153         S_NEXT(dm_fileattr_t, fa_uid);
154         S_NEXT(dm_fileattr_t, fa_gid);
155         S_NEXT(dm_fileattr_t, fa_atime);
156         S_NEXT(dm_fileattr_t, fa_mtime);
157         S_NEXT(dm_fileattr_t, fa_ctime);
158         S_NEXT(dm_fileattr_t, fa_dtime);
159         S_NEXT(dm_fileattr_t, fa_pad1);
160         S_NEXT(dm_fileattr_t, fa_size);
161         S_END(dm_fileattr_t);
162
163
164         S_START(dm_inherit_t);
165         S_NEXT(dm_inherit_t, ih_name);
166         S_NEXT(dm_inherit_t, ih_filetype);
167         S_END(dm_inherit_t);
168
169
170         S_START(dm_region_t);
171         S_NEXT(dm_region_t, rg_offset);
172         S_NEXT(dm_region_t, rg_size);
173         S_NEXT(dm_region_t, rg_flags);
174         S_NEXT(dm_region_t, rg_pad1);
175         S_END(dm_region_t);
176
177
178         S_START(dm_stat_t);
179         S_NEXT(dm_stat_t, _link);
180         S_NEXT(dm_stat_t, dt_handle);
181         S_NEXT(dm_stat_t, dt_compname);
182         S_NEXT(dm_stat_t, dt_nevents);
183         S_NEXT(dm_stat_t, dt_emask);
184         S_NEXT(dm_stat_t, dt_pers);
185         S_NEXT(dm_stat_t, dt_pmanreg);
186         S_NEXT(dm_stat_t, dt_dtime);
187         S_NEXT(dm_stat_t, dt_change);
188         S_NEXT(dm_stat_t, dt_pad1);
189
190         S_NEXT(dm_stat_t, dt_dev);
191         S_NEXT(dm_stat_t, dt_ino);
192         S_NEXT(dm_stat_t, dt_mode);
193         S_NEXT(dm_stat_t, dt_nlink);
194         S_NEXT(dm_stat_t, dt_uid);
195         S_NEXT(dm_stat_t, dt_gid);
196         S_NEXT(dm_stat_t, dt_rdev);
197         S_NEXT(dm_stat_t, dt_pad2);
198         S_NEXT(dm_stat_t, dt_size);
199         S_NEXT(dm_stat_t, dt_atime);
200         S_NEXT(dm_stat_t, dt_mtime);
201         S_NEXT(dm_stat_t, dt_ctime);
202         S_NEXT(dm_stat_t, dt_blksize);
203         S_NEXT(dm_stat_t, dt_blocks);
204
205         S_NEXT(dm_stat_t, dt_pad3);
206         S_NEXT(dm_stat_t, dt_fstype);
207
208         S_NEXT(dm_stat_t, dt_xfs_igen);
209         S_NEXT(dm_stat_t, dt_xfs_xflags);
210         S_NEXT(dm_stat_t, dt_xfs_extsize);
211         S_NEXT(dm_stat_t, dt_xfs_extents);
212         S_NEXT(dm_stat_t, dt_xfs_aextents);
213         S_NEXT(dm_stat_t, dt_xfs_dmstate);
214         S_END(dm_stat_t);
215
216
217         S_START(dm_xstat_t);
218         S_NEXT(dm_xstat_t, dx_statinfo);
219         S_NEXT(dm_xstat_t, dx_attrdata);
220         S_END(dm_xstat_t);
221         exit(0);
222 }