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