VirtualBox

source: vbox/trunk/src/VBox/Runtime/common/zip/tar.h@ 42072

Last change on this file since 42072 was 34179, checked in by vboxsync, 14 years ago

iprt/tarvfs: Rewrote the tar parser to deal with header sequences used by solaris, gnu and pax while being offline yesterday. Only GNU long link and long names are supported, but adding pax and solaris support is possible. This also resolves some of the ustar<space><space> vs. ustart<null>00 problems (the latter was not readable previously).

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.7 KB
Line 
1/* $Id: tar.h 34179 2010-11-18 15:49:17Z vboxsync $ */
2/** @file
3 * IPRT - TAR Virtual Filesystem.
4 */
5
6/*
7 * Copyright (C) 2010 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 */
26
27#ifndef __common_zip_tar_h
28#define __common_zip_tar_h
29
30#include <iprt/assert.h>
31
32/** @name RTZIPTARHDRPOSIX::typeflag
33 * @{ */
34#define RTZIPTAR_TF_OLDNORMAL '\0' /**< Normal disk file, Unix compatible */
35#define RTZIPTAR_TF_NORMAL '0' /**< Normal disk file */
36#define RTZIPTAR_TF_LINK '1' /**< Link to previously dumped file */
37#define RTZIPTAR_TF_SYMLINK '2' /**< Symbolic link */
38#define RTZIPTAR_TF_CHR '3' /**< Character special file */
39#define RTZIPTAR_TF_BLK '4' /**< Block special file */
40#define RTZIPTAR_TF_DIR '5' /**< Directory */
41#define RTZIPTAR_TF_FIFO '6' /**< FIFO special file */
42#define RTZIPTAR_TF_CONTIG '7' /**< Contiguous file */
43
44#define RTZIPTAR_TF_X_HDR 'x' /**< Extended header. */
45#define RTZIPTAR_TF_X_GLOBAL 'g' /**< Global extended header. */
46
47#define RTZIPTAR_TF_SOLARIS_XHDR 'X'
48
49#define RTZIPTAR_TF_GNU_DUMPDIR 'D'
50#define RTZIPTAR_TF_GNU_LONGLINK 'K' /**< GNU long link header. */
51#define RTZIPTAR_TF_GNU_LONGNAME 'L' /**< GNU long name header. */
52#define RTZIPTAR_TF_GNU_MULTIVOL 'M'
53#define RTZIPTAR_TF_GNU_SPARSE 'S'
54#define RTZIPTAR_TF_GNU_VOLDHR 'V'
55/** @} */
56
57
58/**
59 * The ancient tar header.
60 *
61 * The posix and gnu headers are compatible with the members up to and including
62 * link name, from there on they differ.
63 */
64typedef struct RTZIPTARHDRANCIENT
65{
66 char name[100];
67 char mode[8];
68 char uid[8];
69 char gid[8];
70 char size[12];
71 char mtime[12];
72 char chksum[8];
73 char typeflag;
74 char linkname[100]; /**< Was called linkflag. */
75 char unused[8+64+16+155+12];
76} RTZIPTARHDRANCIENT;
77AssertCompileSize(RTZIPTARHDRANCIENT, 512);
78AssertCompileMemberOffset(RTZIPTARHDRANCIENT, name, 0);
79AssertCompileMemberOffset(RTZIPTARHDRANCIENT, mode, 100);
80AssertCompileMemberOffset(RTZIPTARHDRANCIENT, uid, 108);
81AssertCompileMemberOffset(RTZIPTARHDRANCIENT, gid, 116);
82AssertCompileMemberOffset(RTZIPTARHDRANCIENT, size, 124);
83AssertCompileMemberOffset(RTZIPTARHDRANCIENT, mtime, 136);
84AssertCompileMemberOffset(RTZIPTARHDRANCIENT, chksum, 148);
85AssertCompileMemberOffset(RTZIPTARHDRANCIENT, typeflag, 156);
86AssertCompileMemberOffset(RTZIPTARHDRANCIENT, linkname, 157);
87AssertCompileMemberOffset(RTZIPTARHDRANCIENT, unused, 257);
88
89
90/** The uniform standard tape archive format magic value. */
91#define RTZIPTAR_USTAR_MAGIC "ustar"
92/** The ustar version string.
93 * @remarks The terminator character is not part of the field. */
94#define RTZIPTAR_USTAR_VERSION "00"
95
96
97/**
98 * The posix header (according to SuS).
99 */
100typedef struct RTZIPTARHDRPOSIX
101{
102 char name[100];
103 char mode[8];
104 char uid[8];
105 char gid[8];
106 char size[12];
107 char mtime[12];
108 char chksum[8];
109 char typeflag;
110 char linkname[100];
111 char magic[6];
112 char version[2];
113 char uname[32];
114 char gname[32];
115 char devmajor[8];
116 char devminor[8];
117 char prefix[155];
118 char unused[12];
119} RTZIPTARHDRPOSIX;
120AssertCompileSize(RTZIPTARHDRPOSIX, 512);
121AssertCompileMemberOffset(RTZIPTARHDRPOSIX, name, 0);
122AssertCompileMemberOffset(RTZIPTARHDRPOSIX, mode, 100);
123AssertCompileMemberOffset(RTZIPTARHDRPOSIX, uid, 108);
124AssertCompileMemberOffset(RTZIPTARHDRPOSIX, gid, 116);
125AssertCompileMemberOffset(RTZIPTARHDRPOSIX, size, 124);
126AssertCompileMemberOffset(RTZIPTARHDRPOSIX, mtime, 136);
127AssertCompileMemberOffset(RTZIPTARHDRPOSIX, chksum, 148);
128AssertCompileMemberOffset(RTZIPTARHDRPOSIX, typeflag, 156);
129AssertCompileMemberOffset(RTZIPTARHDRPOSIX, linkname, 157);
130AssertCompileMemberOffset(RTZIPTARHDRPOSIX, magic, 257);
131AssertCompileMemberOffset(RTZIPTARHDRPOSIX, version, 263);
132AssertCompileMemberOffset(RTZIPTARHDRPOSIX, uname, 265);
133AssertCompileMemberOffset(RTZIPTARHDRPOSIX, gname, 297);
134AssertCompileMemberOffset(RTZIPTARHDRPOSIX, devmajor, 329);
135AssertCompileMemberOffset(RTZIPTARHDRPOSIX, devminor, 337);
136AssertCompileMemberOffset(RTZIPTARHDRPOSIX, prefix, 345);
137
138
139/**
140 * The GNU header.
141 */
142typedef struct RTZIPTARHDRGNU
143{
144 char name[100];
145 char mode[8];
146 char uid[8];
147 char gid[8];
148 char size[12];
149 char mtime[12];
150 char chksum[8];
151 char typeflag;
152 char linkname[100];
153 char magic[8];
154 char uname[32];
155 char gname[32];
156 char devmajor[8];
157 char devminor[8];
158 char atime[12];
159 char ctime[12];
160 char offset[12];
161 char longnames[4];
162 char unused[1];
163 struct
164 {
165 char offset[12];
166 char numbytes[12];
167 } sparse[4];
168 char isextended;
169 char realsize[12];
170 char unused2[17];
171} RTZIPTARHDRGNU;
172AssertCompileSize(RTZIPTARHDRGNU, 512);
173AssertCompileMemberOffset(RTZIPTARHDRGNU, name, 0);
174AssertCompileMemberOffset(RTZIPTARHDRGNU, mode, 100);
175AssertCompileMemberOffset(RTZIPTARHDRGNU, uid, 108);
176AssertCompileMemberOffset(RTZIPTARHDRGNU, gid, 116);
177AssertCompileMemberOffset(RTZIPTARHDRGNU, size, 124);
178AssertCompileMemberOffset(RTZIPTARHDRGNU, mtime, 136);
179AssertCompileMemberOffset(RTZIPTARHDRGNU, chksum, 148);
180AssertCompileMemberOffset(RTZIPTARHDRGNU, typeflag, 156);
181AssertCompileMemberOffset(RTZIPTARHDRGNU, linkname, 157);
182AssertCompileMemberOffset(RTZIPTARHDRGNU, magic, 257);
183AssertCompileMemberOffset(RTZIPTARHDRGNU, uname, 265);
184AssertCompileMemberOffset(RTZIPTARHDRGNU, gname, 297);
185AssertCompileMemberOffset(RTZIPTARHDRGNU, devmajor, 329);
186AssertCompileMemberOffset(RTZIPTARHDRGNU, devminor, 337);
187AssertCompileMemberOffset(RTZIPTARHDRGNU, atime, 345);
188AssertCompileMemberOffset(RTZIPTARHDRGNU, ctime, 357);
189AssertCompileMemberOffset(RTZIPTARHDRGNU, offset, 369);
190AssertCompileMemberOffset(RTZIPTARHDRGNU, longnames, 381);
191AssertCompileMemberOffset(RTZIPTARHDRGNU, unused, 385);
192AssertCompileMemberOffset(RTZIPTARHDRGNU, sparse, 386);
193AssertCompileMemberOffset(RTZIPTARHDRGNU, isextended,482);
194AssertCompileMemberOffset(RTZIPTARHDRGNU, realsize, 483);
195AssertCompileMemberOffset(RTZIPTARHDRGNU, unused2, 495);
196
197
198/**
199 * The bits common to posix and GNU.
200 */
201typedef struct RTZIPTARHDRCOMMON
202{
203 char name[100];
204 char mode[8];
205 char uid[8];
206 char gid[8];
207 char size[12];
208 char mtime[12];
209 char chksum[8];
210 char typeflag;
211 char linkname[100];
212 char magic[6];
213 char version[2];
214 char uname[32];
215 char gname[32];
216 char devmajor[8];
217 char devminor[8];
218 char not_common[155+12];
219} RTZIPTARHDRCOMMON;
220
221
222/**
223 * Tar header union.
224 */
225typedef union RTZIPTARHDR
226{
227 /** Byte view. */
228 char ab[512];
229 /** The standard header. */
230 RTZIPTARHDRANCIENT Ancient;
231 /** The standard header. */
232 RTZIPTARHDRPOSIX Posix;
233 /** The GNU header. */
234 RTZIPTARHDRGNU Gnu;
235 /** The bits common to both GNU and the standard header. */
236 RTZIPTARHDRCOMMON Common;
237} RTZIPTARHDR;
238AssertCompileSize(RTZIPTARHDR, 512);
239/** Pointer to a tar file header. */
240typedef RTZIPTARHDR *PRTZIPTARHDR;
241/** Pointer to a const tar file header. */
242typedef RTZIPTARHDR const *PCRTZIPTARHDR;
243
244
245/**
246 * Tar header type.
247 */
248typedef enum RTZIPTARTYPE
249{
250 /** Invalid type value. */
251 RTZIPTARTYPE_INVALID = 0,
252 /** Posix header. */
253 RTZIPTARTYPE_POSIX,
254 /** The old GNU header, has layout conflicting with posix. */
255 RTZIPTARTYPE_GNU,
256 /** Ancient tar header which does not use anything beyond the magic. */
257 RTZIPTARTYPE_ANCIENT,
258 /** End of the valid type values (this is not valid). */
259 RTZIPTARTYPE_END,
260 /** The usual type blow up. */
261 RTZIPTARTYPE_32BIT_HACK = 0x7fffffff
262} RTZIPTARTYPE;
263typedef RTZIPTARTYPE *PRTZIPTARTYPE;
264
265
266#endif
267
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette