DumpEntries that are created from the header bytes read from an archive are instantiated with the DumpArchiveEntry( byte[] ) constructor. These entries will be used when extracting from or listing the contents of an archive. These entries have their header filled in using the header bytes. They also set the File to null, since they reference an archive entry not a file.
DumpEntries can also be constructed from nothing but a name. This allows the programmer to construct the entry by hand, for instance when only an InputStream is available for writing to the archive, and the header information is constructed from other information. In this case the header fields are set to defaults and the File is set to null.
The C structure for a Dump Entry's header is:
#define TP_BSIZE 1024 // size of each file block
#define NTREC 10 // number of blocks to write at once
#define HIGHDENSITYTREC 32 // number of blocks to write on high-density tapes
#define TP_NINDIR (TP_BSIZE/2) // number if indirect inodes in record
#define TP_NINOS (TP_NINDIR / sizeof (int32_t))
#define LBLSIZE 16
#define NAMELEN 64
#define OFS_MAGIC (int) 60011 // old format magic value
#define NFS_MAGIC (int) 60012 // new format magic value
#define FS_UFS2_MAGIC (int) 0x19540119
#define CHECKSUM (int) 84446 // constant used in checksum algorithm
struct s_spcl {
int32_t c_type; // record type (see below)
int32_t c_date; // date of this dump
int32_t c_ddate; // date of previous dump
int32_t c_volume; // dump volume number
u_int32_t c_tapea; // logical block of this record
dump_ino_t c_ino; // number of inode
int32_t c_magic; // magic number (see above)
int32_t c_checksum; // record checksum
#ifdef __linux__
struct new_bsd_inode c_dinode;
#else
#ifdef sunos
struct new_bsd_inode c_dinode;
#else
struct dinode c_dinode; // ownership and mode of inode
#endif
#endif
int32_t c_count; // number of valid c_addr entries
union u_data c_data; // see above
char c_label[LBLSIZE]; // dump label
int32_t c_level; // level of this dump
char c_filesys[NAMELEN]; // name of dumpped file system
char c_dev[NAMELEN]; // name of dumpped device
char c_host[NAMELEN]; // name of dumpped host
int32_t c_flags; // additional information (see below)
int32_t c_firstrec; // first record on volume
int32_t c_ntrec; // blocksize on volume
int32_t c_extattributes; // additional inode info (see below)
int32_t c_spare[30]; // reserved for future uses
} s_spcl;
//
// flag values
//
#define DR_NEWHEADER 0x0001 // new format tape header
#define DR_NEWINODEFMT 0x0002 // new format inodes on tape
#define DR_COMPRESSED 0x0080 // dump tape is compressed
#define DR_METAONLY 0x0100 // only the metadata of the inode has been dumped
#define DR_INODEINFO 0x0002 // [SIC] TS_END header contains c_inos information
#define DR_EXTATTRIBUTES 0x8000
//
// extattributes inode info
//
#define EXT_REGULAR 0
#define EXT_MACOSFNDRINFO 1
#define EXT_MACOSRESFORK 2
#define EXT_XATTR 3
// used for EA on tape
#define EXT2_GOOD_OLD_INODE_SIZE 128
#define EXT2_XATTR_MAGIC 0xEA020000 // block EA
#define EXT2_XATTR_MAGIC2 0xEA020001 // in inode EA
The fields in bold are the same for all blocks. (This permitted multiple dumps to be written to a single tape.)
The C structure for the inode (file) information is:
struct bsdtimeval { // **** alpha-*-linux is deviant
__u32 tv_sec;
__u32 tv_usec;
};
#define NDADDR 12
#define NIADDR 3
//
// 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; // file type, standard Unix permissions
__s16 di_nlink; // number of hard links to file.
union {
__u16 oldids[2];
__u32 inumber;
} di_u;
u_quad_t di_size; // file size
struct bsdtimeval di_atime; // time file was last accessed
struct bsdtimeval di_mtime; // time file was last modified
struct bsdtimeval di_ctime; // time file was created
__u32 di_db[NDADDR];
__u32 di_ib[NIADDR];
__u32 di_flags; //
__s32 di_blocks; // number of disk blocks
__s32 di_gen; // generation number
__u32 di_uid; // user id (see /etc/passwd)
__u32 di_gid; // group id (see /etc/group)
__s32 di_spare[2]; // unused
};
It is important to note that the header DOES NOT have the name of the file. It can't since hard links mean that you may have multiple file names for a single physical file. You must read the contents of the directory entries to learn the mapping(s) from file name to inode.
The C structure that indicates if a specific block is a real block that contains data or is a sparse block that is not persisted to the disk is:
#define TP_BSIZE 1024
#define TP_NINDIR (TP_BSIZE/2)
union u_data {
char s_addrs[TP_NINDIR]; // 1 => data; 0 => hole in inode
int32_t s_inos[TP_NINOS]; // table of first inode on each volume
} u_data;
| Modifier and Type | Class and Description |
|---|---|
| public static enum | |
| pack-priv static class | DumpArchiveEntry.TapeSegmentHeader
Archive entry as stored on tape. |
| public static enum |
| Modifier and Type | Field and Description |
|---|---|
| private long | |
| private long | |
| private int | |
| private int | |
| private final DumpArchiveEntry. | |
| private int | |
| private boolean | |
| private int | |
| private long | |
| private String | |
| private int | |
| private long | |
| private String | |
| private Set | |
| private String | |
| private long | |
| private final DumpArchiveSummary | summary
Currently unused |
| private DumpArchiveEntry. | |
| private int | |
| private int |
| Access | Constructor and Description |
|---|---|
| public | |
| public | DumpArchiveEntry(final String
path name name, final String actual file name. simpleName)Constructor taking only file name. |
| protected | DumpArchiveEntry(final String
the name name, final String the simple name simpleName, final int the ino ino, final DumpArchiveEntry.the type typeConstructor taking name, inode and type. |
| Modifier and Type | Method and Description |
|---|---|
| public boolean | equals(final Object
the reference object with which to compare. o)Overrides java. |
| public Date | |
| public Date | |
| pack-priv long | |
| public int | |
| public int | |
| public int | |
| public int | Returns: the number of sparse recordsGets the number of sparse records in this segment. |
| public DumpArchiveConstants. | |
| public int | |
| public Date | Returns: the last modified dateImplements org. |
| public int | |
| public String | Returns: the name of the entry.Implements org. |
| public int | |
| public long | |
| pack-priv String | |
| public Set | |
| public String | |
| public long | Returns: the sizeImplements org. |
| public DumpArchiveEntry. | |
| public int | |
| public int | |
| public int | |
| public boolean | |
| public boolean | |
| public boolean | |
| public boolean | Returns: whether this is a directoryImplements org. |
| public boolean | |
| public boolean | |
| public boolean | |
| public boolean | Returns: whether this is a sparse recordindex of the record to check idx)Is this a sparse record? |
| pack-priv static DumpArchiveEntry | parse(final byte[]
buffer to read content from buffer)Populate the dump archive entry and tape segment header with the contents of the buffer. |
| public void | |
| public void | |
| public void | setDeleted(final boolean
whether the file has been deleted isDeleted)Sets whether this file has been deleted. |
| public void | |
| public void | |
| public void | setLastModifiedDate(final Date
the last modified time mtime)Sets the time the file was last modified. |
| public void | |
| public final void | |
| public void | |
| public void | |
| protected void | |
| public void | |
| public void | |
| public void | |
| public void | |
| public String | |
| pack-priv void |