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