1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
|
/*
* Ported to Linux's Second Extended File System as part of the
* dump and restore backup suit
* Remy Card <card@Linux.EU.Org>, 1994-1997
* Stelian Pop <stelian@popies.net>, 1999-2000
* Stelian Pop <stelian@popies.net> - AlcĂ´ve <www.alcove.com>, 2000-2002
*/
#include <config.h>
#include <sys/time.h>
#include <dirent.h>
#include <stdio.h>
#ifdef HAVE_STDINT_H
#include <stdint.h>
#endif
#ifdef HAVE_INTTYPES_H
#include <inttypes.h>
#endif
#ifdef HAVE_EXT2FS_EXT2_FS_H
#include <ext2fs/ext2_fs.h>
#else
#include <linux/ext2_fs.h>
#endif
#include <ext2fs/ext2fs.h>
#ifndef _BSDCOMPAT_H
#define _BSDCOMPAT_H 1
#define UNUSED(x) x __attribute__ ((unused))
#ifndef NBBY
#define NBBY 8
#endif
#ifndef MIN
#define MIN(a,b) ((a < b) ? a : b)
#endif
#define WINO 1
#define DEV_BSIZE 512
#define DEV_BSHIFT 9
#define MAXBSIZE EXT2_MAX_BLOCK_SIZE
#define ROOTINO EXT2_ROOT_INO
#ifdef EXT2_NODUMP_FL
#define UF_NODUMP EXT2_NODUMP_FL
#endif
#ifndef howmany
#define howmany(x,y) (((x)+((y)-1))/(y))
#endif
#ifndef roundup
#define roundup(x, y) ((((x)+((y)-1))/(y))*(y))
#endif
#ifndef powerof2
#define powerof2(x) ((((x)-1)&(x))==0)
#endif
#define fsbtodb(sb,b) ((ext2_loff_t)(((long long)(b) * EXT2_BLOCK_SIZE((sb)->super)) / DEV_BSIZE))
#define dbtofsb(sb,b) ((int)(((long long)(b) * DEV_BSIZE) / EXT2_BLOCK_SIZE((sb)->super)))
#define sblock fs
#define fs_fsize fragsize
#define fs_bsize blocksize
#define fs_size super->s_blocks_count
#define IFMT S_IFMT
#define IFLNK S_IFLNK
#define IFREG S_IFREG
#define IFDIR S_IFDIR
#define IFCHR S_IFCHR
#define IFBLK S_IFBLK
#define IFSOCK S_IFSOCK
#define IFIFO S_IFIFO
/*
* The BSD dump format reserves 4 bytes for a time_t, but other architectures
* (notably axp) have larger time_t. ctime4() is a modified ctime() which
* always accepts short 4-byte times.
*/
#define ctime4(timep) ({ time_t t = *(timep); ctime(&t); })
/*
* This is the ext2_inode structure but the fields have been renamed
* to match 4.4BSD's names
*/
#define NDADDR 12
#define NIADDR 3
#define NINDIR(fs) EXT2_ADDR_PER_BLOCK(fs->super)
// This structure is written to tape as part of u_spcl.s_spcl
struct dinode_tape {
__u16 di_mode;
__u16 di_uid;
__u32 di_size;
__u32 di_atime;
__u32 di_ctime;
__u32 di_mtime;
__u32 di_dtime;
__u16 di_gid;
__u16 di_nlink;
__u32 di_blocks;
__u32 di_flags;
__u32 di_reserved1;
__u32 di_db[NDADDR];
__u32 di_ib[NIADDR];
__u32 di_gen;
__u32 di_file_acl;
__u32 di_dir_acl;
__u32 di_faddr;
__u8 di_frag;
__u8 di_fsize;
__u16 di_pad1;
__u16 di_uidhigh;
__u16 di_gidhigh;
__u32 di_spare;
#if 0
// Added in 0.4b40 when EA support was added.
__u16 di_extraisize;
__u16 di_pad2;
#endif
};
/*
* This is the ext2_dir_entry structure but the fields have been renamed
* to match 4.4BSD's names
*
* This is the 4.4BSD directory entry structure
*/
#define DIRBLKSIZ DEV_BSIZE
#ifndef MAXNAMLEN
#define MAXNAMLEN 255
#endif
/*
* For old libc.
*/
#ifndef DT_UNKNOWN
#define DT_UNKNOWN 0
#define DT_FIFO 1
#define DT_CHR 2
#define DT_DIR 4
#define DT_BLK 6
#define DT_REG 8
#define DT_LNK 10
#define DT_SOCK 12
#endif
/*
* The direct structure used by dump/restore.
*/
struct direct {
__u32 d_ino;
__u16 d_reclen;
__u8 d_type;
__u8 d_namlen;
char d_name[MAXNAMLEN + 1];
};
/*
* The DIRSIZ macro gives the minimum record length which will hold
* the directory entry. This requires the amount of space in struct direct
* without the d_name field, plus enough space for the name with a terminating
* null byte (dp->d_namlen+1), rounded up to a 4 byte boundary.
*/
#define DIRSIZ(oldfmt,dp) EXT2_DIR_REC_LEN(((dp)->d_namlen & 0xff) + 1)
struct bsdtimeval { /* XXX alpha-*-linux is deviant */
__u32 tv_sec;
__u32 tv_usec;
};
/*
* This is the new (4.4) BSD inode structure
* copied from the FreeBSD 2.0 <ufs/ufs/dinode.h> include file
*/
struct new_bsd_inode {
__u16 di_mode;
__s16 di_nlink;
union {
__u16 oldids[2];
__u32 inumber;
} di_u;
uint64_t di_size;
struct bsdtimeval di_atime;
struct bsdtimeval di_mtime;
struct bsdtimeval di_ctime;
__u32 di_db[NDADDR];
__u32 di_ib[NIADDR];
__u32 di_flags;
__s32 di_blocks;
__s32 di_gen;
__u32 di_uid;
__u32 di_gid;
__s32 di_spare[2];
};
#define di_ouid di_u.oldids[0]
#define di_ogid di_u.oldids[1]
#endif /* _BSDCOMPAT_H */
|