]>
Commit | Line | Data |
---|---|---|
1227625a SP |
1 | /* |
2 | * Ported to Linux's Second Extended File System as part of the | |
3 | * dump and restore backup suit | |
b45f51d6 | 4 | * Remy Card <card@Linux.EU.Org>, 1994-1997 |
df9ae507 | 5 | * Stelian Pop <pop@cybercable.fr>, 1999 |
1227625a | 6 | * |
df9ae507 | 7 | * $Id: bsdcompat.h,v 1.6 1999/10/13 09:57:18 stelian Exp $ |
1227625a SP |
8 | */ |
9 | ||
10 | #include <config.h> | |
b45f51d6 | 11 | #include <sys/time.h> |
8d4197bb | 12 | #include <dirent.h> |
1227625a SP |
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 | |
8d4197bb | 112 | #ifndef MAXNAMLEN |
1227625a | 113 | #define MAXNAMLEN 255 |
8d4197bb | 114 | #endif |
1227625a SP |
115 | |
116 | struct direct { | |
117 | __u32 d_ino; | |
118 | __u16 d_reclen; | |
119 | #if 1 | |
120 | __u8 d_namlen; | |
121 | __u8 d_type; | |
122 | #else | |
123 | __u16 d_namlen; | |
124 | #endif | |
125 | char d_name[MAXNAMLEN + 1]; | |
126 | }; | |
127 | ||
1227625a SP |
128 | /* |
129 | * Convert between stat structure types and directory types. | |
130 | */ | |
131 | #define IFTODT(mode) (((mode) & 0170000) >> 12) | |
132 | #define DTTOIF(dirtype) ((dirtype) << 12) | |
133 | ||
134 | /* | |
135 | * The DIRSIZ macro gives the minimum record length which will hold | |
136 | * the directory entry. This requires the amount of space in struct direct | |
137 | * without the d_name field, plus enough space for the name with a terminating | |
138 | * null byte (dp->d_namlen+1), rounded up to a 4 byte boundary. | |
139 | */ | |
140 | #if 0 | |
141 | #if (BYTE_ORDER == LITTLE_ENDIAN) | |
142 | #define DIRSIZ(oldfmt, dp) \ | |
143 | ((oldfmt) ? \ | |
144 | ((sizeof (struct direct) - (MAXNAMLEN+1)) + (((dp)->d_type+1 + 3) &~ 3)) : \ | |
145 | ((sizeof (struct direct) - (MAXNAMLEN+1)) + (((dp)->d_namlen+1 + 3) &~ 3))) | |
146 | #else | |
147 | #define DIRSIZ(oldfmt, dp) \ | |
148 | ((sizeof (struct direct) - (MAXNAMLEN+1)) + (((dp)->d_namlen+1 + 3) &~ 3)) | |
149 | #endif | |
150 | #else | |
151 | ||
152 | #define DIRSIZ(oldfmt,dp) EXT2_DIR_REC_LEN(((dp)->d_namlen & 0xff) + 1) | |
153 | ||
154 | #endif | |
155 | ||
156 | /* | |
157 | * This is the old (Net/2) BSD inode structure | |
158 | * copied from the FreeBSD 1.1.5.1 <ufs/dinode.h> include file | |
159 | */ | |
160 | #define MAXFASTLINK (((NDADDR + NIADDR) * sizeof(unsigned long)) - 1) | |
161 | ||
162 | struct old_bsd_inode { | |
163 | __u16 di_mode; | |
164 | __s16 di_nlink; | |
165 | __u16 di_uid; | |
166 | __u16 di_gid; | |
167 | #if 1 | |
168 | union { | |
169 | u_quad_t v; | |
170 | __u32 val[2]; | |
171 | } di_qsize; | |
172 | #else | |
173 | u_quad_t di_size; | |
174 | #endif | |
175 | __u32 di_atime; | |
176 | __s32 di_atspare; | |
177 | __u32 di_mtime; | |
178 | __s32 di_mtspare; | |
179 | __u32 di_ctime; | |
180 | __s32 di_ctspare; | |
181 | #if 0 | |
182 | union { | |
183 | struct { | |
184 | daddr_t di_udb[NDADDR]; | |
185 | daddr_t di_uib[NIADDR]; | |
186 | } di_addr; | |
187 | char di_usymlink[MAXFASTLINK + 1]; | |
188 | } di_un; | |
189 | #else | |
190 | daddr_t di_db[NDADDR]; | |
191 | daddr_t di_ib[NIADDR]; | |
192 | #endif | |
193 | __s32 di_flags; | |
194 | __s32 di_blocks; | |
195 | __s32 di_gen; | |
196 | __u32 di_spare[4]; | |
197 | }; | |
198 | ||
ddd2ef55 SP |
199 | struct bsdtimeval { /* XXX alpha-*-linux is deviant */ |
200 | __u32 tv_sec; | |
201 | __u32 tv_usec; | |
202 | }; | |
203 | ||
1227625a SP |
204 | /* |
205 | * This is the new (4.4) BSD inode structure | |
206 | * copied from the FreeBSD 2.0 <ufs/ufs/dinode.h> include file | |
207 | */ | |
208 | struct new_bsd_inode { | |
209 | __u16 di_mode; | |
210 | __s16 di_nlink; | |
211 | union { | |
212 | __u16 oldids[2]; | |
213 | __u32 inumber; | |
214 | } di_u; | |
215 | u_quad_t di_size; | |
ddd2ef55 SP |
216 | struct bsdtimeval di_atime; |
217 | struct bsdtimeval di_mtime; | |
218 | struct bsdtimeval di_ctime; | |
1227625a SP |
219 | daddr_t di_db[NDADDR]; |
220 | daddr_t di_ib[NIADDR]; | |
221 | __u32 di_flags; | |
222 | __s32 di_blocks; | |
223 | __s32 di_gen; | |
224 | __u32 di_uid; | |
225 | __u32 di_gid; | |
226 | __s32 di_spare[2]; | |
227 | }; | |
228 | ||
229 | #define di_ouid di_u.oldids[0] | |
230 | #define di_ogid di_u.oldids[1] |