]> git.wh0rd.org - dump.git/blob - compat/include/bsdcompat.h
Fix an issue with the size of dump maps appearing when the filesystem has been resize...
[dump.git] / compat / include / bsdcompat.h
1 /*
2 * Ported to Linux's Second Extended File System as part of the
3 * dump and restore backup suit
4 * Remy Card <card@Linux.EU.Org>, 1994-1997
5 * Stelian Pop <stelian@popies.net>, 1999-2000
6 * Stelian Pop <stelian@popies.net> - AlcĂ´ve <www.alcove.com>, 2000-2002
7 *
8 * $Id: bsdcompat.h,v 1.23 2004/07/01 09:14:48 stelian Exp $
9 */
10
11 #include <config.h>
12 #include <sys/time.h>
13 #include <dirent.h>
14 #include <ext2fs/ext2fs.h>
15
16 #define __dead volatile
17 #define UNUSED(x) x __attribute__ ((unused))
18
19 #ifndef NBBY
20 #define NBBY 8
21 #endif
22
23 #ifndef MIN
24 #define MIN(a,b) ((a < b) ? a : b)
25 #endif
26
27 #define WINO 1
28 #define DEV_BSIZE 512
29 #define DEV_BSHIFT 9
30
31 #ifndef sunos
32 #define MAXBSIZE EXT2_MAX_BLOCK_SIZE
33 #define ROOTINO EXT2_ROOT_INO
34 #else
35 #define ROOTINO 2
36 #endif
37 #ifdef EXT2_NODUMP_FL
38 #define UF_NODUMP EXT2_NODUMP_FL
39 #endif
40
41 #ifndef howmany
42 #define howmany(x,y) (((x)+((y)-1))/(y))
43 #endif
44 #ifndef roundup
45 #define roundup(x, y) ((((x)+((y)-1))/(y))*(y))
46 #endif
47 #ifndef powerof2
48 #define powerof2(x) ((((x)-1)&(x))==0)
49 #endif
50
51 #define fsbtodb(sb,b) ((ext2_loff_t)(((long long)(b) * EXT2_BLOCK_SIZE((sb)->super)) / DEV_BSIZE))
52 #define dbtofsb(sb,b) ((int)(((long long)(b) * DEV_BSIZE) / EXT2_BLOCK_SIZE((sb)->super)))
53
54 #define sblock fs
55 #define fs_fsize fragsize
56 #define fs_bsize blocksize
57 #define fs_size super->s_blocks_count
58
59 #define IFMT S_IFMT
60 #define IFLNK S_IFLNK
61 #define IFREG S_IFREG
62 #define IFDIR S_IFDIR
63 #define IFCHR S_IFCHR
64 #define IFBLK S_IFBLK
65 #define IFSOCK S_IFSOCK
66 #define IFIFO S_IFIFO
67
68 #if 0
69 typedef __s64 quad_t;
70 typedef __u64 u_quad_t;
71 #endif
72
73 /*
74 * The BSD dump format reserves 4 bytes for a time_t, but other architectures
75 * (notably axp) have larger time_t. ctime4() is a modified ctime() which
76 * always accepts short 4-byte times.
77 */
78 #define ctime4(timep) ({ time_t t = *(timep); ctime(&t); })
79
80 /*
81 * This is the ext2_inode structure but the fields have been renamed
82 * to match 4.4BSD's names
83 */
84 #define NDADDR 12
85 #define NIADDR 3
86
87 #define NINDIR(fs) EXT2_ADDR_PER_BLOCK(fs->super)
88
89 #ifdef sunos
90 typedef uint8_t __u8;
91 typedef uint16_t __u16;
92 typedef uint32_t __u32;
93 typedef int8_t __s8;
94 typedef int16_t __s16;
95 typedef int32_t __s32;
96 #ifndef u_int
97 typedef unsigned int u_int;
98 #endif
99 #ifndef u_int16_t
100 typedef unsigned short u_int16_t;
101 #endif
102 #ifndef u_char
103 typedef unsigned char u_char;
104 #endif
105 typedef int64_t quad_t;
106 #endif /* sunos */
107
108 struct dinode {
109 __u16 di_mode;
110 __u16 di_uid;
111 __u32 di_size;
112 __u32 di_atime;
113 __u32 di_ctime;
114 __u32 di_mtime;
115 __u32 di_dtime;
116 __u16 di_gid;
117 __u16 di_nlink;
118 __u32 di_blocks;
119 __u32 di_flags;
120 __u32 di_reserved1;
121 __u32 di_db[NDADDR];
122 __u32 di_ib[NIADDR];
123 __u32 di_gen;
124 __u32 di_file_acl;
125 __u32 di_dir_acl;
126 __u32 di_faddr;
127 __u8 di_frag;
128 __u8 di_fsize;
129 __u16 di_pad1;
130 __u16 di_uidhigh;
131 __u16 di_gidhigh;
132 __u32 di_spare;
133 };
134
135 #define di_rdev di_db[0]
136 /* #define di_ouid di_uid */
137 /* #define di_ogid di_gid */
138 #define di_size_high di_dir_acl
139
140 /*
141 * This is the ext2_dir_entry structure but the fields have been renamed
142 * to match 4.4BSD's names
143 *
144 * This is the 4.4BSD directory entry structure
145 */
146 #define DIRBLKSIZ DEV_BSIZE
147 #ifndef MAXNAMLEN
148 #define MAXNAMLEN 255
149 #endif
150
151 #ifdef sunos
152 #define MAXNAMLEN 255
153 #endif
154
155 /*
156 * For old libc.
157 */
158 #ifndef DT_UNKNOWN
159 #define DT_UNKNOWN 0
160 #define DT_FIFO 1
161 #define DT_CHR 2
162 #define DT_DIR 4
163 #define DT_BLK 6
164 #define DT_REG 8
165 #define DT_LNK 10
166 #define DT_SOCK 12
167
168 #ifdef sunos
169 #define DT_WHT 14
170 #endif
171 #endif
172
173 #ifndef d_fileno
174 #define d_fileno d_ino
175 #endif
176
177 /*
178 * The direct structure used by dump/restore.
179 */
180 struct direct {
181 __u32 d_ino;
182 __u16 d_reclen;
183 __u8 d_type;
184 __u8 d_namlen;
185 char d_name[MAXNAMLEN + 1];
186 };
187 /*
188 * Convert between stat structure types and directory types.
189 */
190 #define IFTODT(mode) (((mode) & 0170000) >> 12)
191 #define DTTOIF(dirtype) ((dirtype) << 12)
192
193 /*
194 * The DIRSIZ macro gives the minimum record length which will hold
195 * the directory entry. This requires the amount of space in struct direct
196 * without the d_name field, plus enough space for the name with a terminating
197 * null byte (dp->d_namlen+1), rounded up to a 4 byte boundary.
198 */
199 #ifdef __linux__
200 #if 0
201 #if (BYTE_ORDER == LITTLE_ENDIAN)
202 #define DIRSIZ(oldfmt, dp) \
203 ((oldfmt) ? \
204 ((sizeof (struct direct) - (MAXNAMLEN+1)) + (((dp)->d_type+1 + 3) &~ 3)) : \
205 ((sizeof (struct direct) - (MAXNAMLEN+1)) + (((dp)->d_namlen+1 + 3) &~ 3)))
206 #else /* BYTE_ORDER */
207 #define DIRSIZ(oldfmt, dp) \
208 ((sizeof (struct direct) - (MAXNAMLEN+1)) + (((dp)->d_namlen+1 + 3) &~ 3))
209 #endif
210 #else /* 0 */
211 #define DIRSIZ(oldfmt,dp) EXT2_DIR_REC_LEN(((dp)->d_namlen & 0xff) + 1)
212 #endif
213 #else /* __linux__ */
214 #define DIRSIZ(oldfmt, dp) \
215 ((sizeof (struct direct) - (MAXNAMLEN+1)) + (((dp)->d_namlen+1 + 3) &~ 3))
216 #endif
217
218 /*
219 * This is the old (Net/2) BSD inode structure
220 * copied from the FreeBSD 1.1.5.1 <ufs/dinode.h> include file
221 */
222 #define MAXFASTLINK (((NDADDR + NIADDR) * sizeof(unsigned long)) - 1)
223
224 struct old_bsd_inode {
225 __u16 di_mode;
226 __s16 di_nlink;
227 __u16 di_uid;
228 __u16 di_gid;
229 #if 1
230 union {
231 u_quad_t v;
232 __u32 val[2];
233 } di_qsize;
234 #else
235 u_quad_t di_size;
236 #endif
237 __u32 di_atime;
238 __s32 di_atspare;
239 __u32 di_mtime;
240 __s32 di_mtspare;
241 __u32 di_ctime;
242 __s32 di_ctspare;
243 #if 0
244 union {
245 struct {
246 daddr_t di_udb[NDADDR];
247 daddr_t di_uib[NIADDR];
248 } di_addr;
249 char di_usymlink[MAXFASTLINK + 1];
250 } di_un;
251 #else
252 __u32 di_db[NDADDR];
253 __u32 di_ib[NIADDR];
254 #endif
255 __s32 di_flags;
256 __s32 di_blocks;
257 __s32 di_gen;
258 __u32 di_spare[4];
259 };
260
261 struct bsdtimeval { /* XXX alpha-*-linux is deviant */
262 __u32 tv_sec;
263 __u32 tv_usec;
264 };
265
266 /*
267 * This is the new (4.4) BSD inode structure
268 * copied from the FreeBSD 2.0 <ufs/ufs/dinode.h> include file
269 */
270 struct new_bsd_inode {
271 __u16 di_mode;
272 __s16 di_nlink;
273 union {
274 __u16 oldids[2];
275 __u32 inumber;
276 } di_u;
277 u_quad_t di_size;
278 struct bsdtimeval di_atime;
279 struct bsdtimeval di_mtime;
280 struct bsdtimeval di_ctime;
281 __u32 di_db[NDADDR];
282 __u32 di_ib[NIADDR];
283 __u32 di_flags;
284 __s32 di_blocks;
285 __s32 di_gen;
286 __u32 di_uid;
287 __u32 di_gid;
288 __s32 di_spare[2];
289 };
290
291 #define di_ouid di_u.oldids[0]
292 #define di_ogid di_u.oldids[1]