001/*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *   https://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied.  See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019package org.apache.commons.compress.archivers.tar;
020
021/**
022 * This interface contains all the definitions used in the package.
023 * <p>
024 * For tar formats (FORMAT_OLDGNU, FORMAT_POSIX, etc.) see GNU tar <a href="https://git.savannah.gnu.org/cgit/tar.git/tree/src/tar.h?h=v1.35">tar.h</a> and type
025 * {@code enum archive_format}.
026 * </p>
027 * <p>
028 * TODO Next major version: Update to a class.
029 * </p>
030 */
031// CheckStyle:InterfaceIsTypeCheck OFF (bc)
032public interface TarConstants {
033
034    /**
035     * Default record size.
036     */
037    int DEFAULT_RCDSIZE = 512;
038
039    /**
040     * Default block size.
041     */
042    int DEFAULT_BLKSIZE = DEFAULT_RCDSIZE * 20;
043
044    /**
045     * GNU format as per before tar 1.12.
046     */
047    int FORMAT_OLDGNU = 2;
048
049    /**
050     * Pure POSIX format.
051     */
052    int FORMAT_POSIX = 3;
053
054    /**
055     * xstar format used by Jörg Schilling's star.
056     */
057    int FORMAT_XSTAR = 4;
058
059    /**
060     * The length of the name field in a header buffer.
061     */
062    int NAMELEN = 100;
063
064    /**
065     * The length of the mode field in a header buffer.
066     */
067    int MODELEN = 8;
068
069    /**
070     * The length of the user id field in a header buffer.
071     */
072    int UIDLEN = 8;
073
074    /**
075     * The length of the group id field in a header buffer.
076     */
077    int GIDLEN = 8;
078
079    /**
080     * The maximum value of gid/uid in a tar archive which can be expressed in octal char notation (that's 7 sevens, octal).
081     */
082    long MAXID = 07777777L;
083
084    /**
085     * The length of the checksum field in a header buffer.
086     */
087    int CHKSUMLEN = 8;
088
089    /**
090     * Offset of the checksum field within header record.
091     *
092     * @since 1.5
093     */
094    int CHKSUM_OFFSET = 148;
095
096    /**
097     * The length of the size field in a header buffer. Includes the trailing space or NUL.
098     */
099    int SIZELEN = 12;
100
101    /**
102     * The maximum size of a file in a tar archive which can be expressed in octal char notation (that's 11 sevens, octal).
103     */
104    long MAXSIZE = 077777777777L;
105
106    /** Offset of start of magic field within header record */
107    int MAGIC_OFFSET = 257;
108
109    /**
110     * The length of the magic field in a header buffer.
111     */
112    int MAGICLEN = 6;
113
114    /**
115     * Offset of start of magic field within header record.
116     */
117    int VERSION_OFFSET = 263;
118
119    /**
120     * Previously this was regarded as part of "magic" field, but it is separate.
121     */
122    int VERSIONLEN = 2;
123
124    /**
125     * The length of the modification time field in a header buffer.
126     */
127    int MODTIMELEN = 12;
128
129    /**
130     * The length of the user name field in a header buffer.
131     */
132    int UNAMELEN = 32;
133
134    /**
135     * The length of the group name field in a header buffer.
136     */
137    int GNAMELEN = 32;
138
139    /**
140     * The length of each of the device fields (major and minor) in a header buffer.
141     */
142    int DEVLEN = 8;
143
144    /**
145     * Length of the prefix field.
146     */
147    int PREFIXLEN = 155;
148
149    /**
150     * The length of the access time field in an old GNU header buffer.
151     */
152    int ATIMELEN_GNU = 12;
153
154    /**
155     * The length of the created time field in an old GNU header buffer.
156     */
157    int CTIMELEN_GNU = 12;
158
159    /**
160     * The length of the multivolume start offset field in an old GNU header buffer.
161     */
162    int OFFSETLEN_GNU = 12;
163
164    /**
165     * The length of the long names field in an old GNU header buffer.
166     */
167    int LONGNAMESLEN_GNU = 4;
168
169    /**
170     * The length of the padding field in an old GNU header buffer.
171     */
172    int PAD2LEN_GNU = 1;
173
174    /**
175     * The sum of the length of all sparse headers in an old GNU header buffer.
176     */
177    int SPARSELEN_GNU = 96;
178
179    /**
180     * The length of the is extension field in an old GNU header buffer.
181     */
182    int ISEXTENDEDLEN_GNU = 1;
183
184    /**
185     * The length of the real size field in an old GNU header buffer.
186     */
187    int REALSIZELEN_GNU = 12;
188
189    /**
190     * The length of offset in struct sparse
191     *
192     * @since 1.20
193     */
194    int SPARSE_OFFSET_LEN = 12;
195
196    /**
197     * The length of numbytes in struct sparse
198     *
199     * @since 1.20
200     */
201    int SPARSE_NUMBYTES_LEN = 12;
202
203    /**
204     * The number of sparse headers in an old GNU header
205     *
206     * @since 1.20
207     */
208    int SPARSE_HEADERS_IN_OLDGNU_HEADER = 4;
209
210    /**
211     * The number of sparse headers in an extension header
212     *
213     * @since 1.20
214     */
215    int SPARSE_HEADERS_IN_EXTENSION_HEADER = 21;
216
217    /**
218     * The sum of the length of all sparse headers in a sparse header buffer.
219     */
220    int SPARSELEN_GNU_SPARSE = 504;
221
222    /**
223     * The length of the is extension field in a sparse header buffer.
224     */
225    int ISEXTENDEDLEN_GNU_SPARSE = 1;
226
227    /**
228     * LF_ constants represent the "link flag" of an entry, or more commonly, the "entry type". This is the "old way" of indicating a normal file.
229     */
230    byte LF_OLDNORM = 0;
231
232    /**
233     * Offset inside the header for the "link flag" field.
234     *
235     * @since 1.22
236     * @see TarArchiveEntry
237     */
238    int LF_OFFSET = 156;
239
240    /**
241     * Normal file type.
242     */
243    byte LF_NORMAL = (byte) '0';
244
245    /**
246     * Link file type.
247     */
248    byte LF_LINK = (byte) '1';
249
250    /**
251     * Symbolic link file type.
252     */
253    byte LF_SYMLINK = (byte) '2';
254
255    /**
256     * Character device file type.
257     */
258    byte LF_CHR = (byte) '3';
259
260    /**
261     * Block device file type.
262     */
263    byte LF_BLK = (byte) '4';
264
265    /**
266     * Directory file type.
267     */
268    byte LF_DIR = (byte) '5';
269
270    /**
271     * FIFO (pipe) file type.
272     */
273    byte LF_FIFO = (byte) '6';
274
275    /**
276     * Contiguous file type.
277     */
278    byte LF_CONTIG = (byte) '7';
279
280    /**
281     * Identifies the *next* file on the tape as having a long link name.
282     */
283    byte LF_GNUTYPE_LONGLINK = (byte) 'K';
284
285    /**
286     * Identifies the *next* file on the tape as having a long name.
287     */
288    byte LF_GNUTYPE_LONGNAME = (byte) 'L';
289
290    /**
291     * Sparse file type.
292     *
293     * @since 1.1.1
294     */
295    byte LF_GNUTYPE_SPARSE = (byte) 'S';
296
297    // See "http://www.opengroup.org/onlinepubs/009695399/utilities/pax.html#tag_04_100_13_02"
298
299    /**
300     * Identifies the entry as a Pax extended header.
301     *
302     * @since 1.1
303     */
304    byte LF_PAX_EXTENDED_HEADER_LC = (byte) 'x';
305
306    /**
307     * Identifies the entry as a Pax extended header (SunOS tar -E).
308     *
309     * @since 1.1
310     */
311    byte LF_PAX_EXTENDED_HEADER_UC = (byte) 'X';
312
313    /**
314     * Identifies the entry as a Pax global extended header.
315     *
316     * @since 1.1
317     */
318    byte LF_PAX_GLOBAL_EXTENDED_HEADER = (byte) 'g';
319
320    /**
321     * Identifies the entry as a multi-volume past volume #0
322     *
323     * @since 1.22
324     */
325    byte LF_MULTIVOLUME = (byte) 'M';
326
327    /**
328     * The magic tag representing a POSIX tar archive.
329     * <p>
330     * "ustar" and a null.
331     * </p>
332     */
333    String MAGIC_POSIX = "ustar\0";
334
335    /**
336     * Default version.
337     */
338    String VERSION_POSIX = "00";
339
340    /**
341     * The magic tag representing a GNU tar archive.
342     */
343    String MAGIC_GNU = "ustar ";
344
345    /**
346     * One of two possible GNU versions
347     */
348    String VERSION_GNU_SPACE = " \0";
349
350    /**
351     * One of two possible GNU versions
352     */
353    String VERSION_GNU_ZERO = "0\0";
354
355    /**
356     * The magic tag representing an Ant tar archive.
357     *
358     * @since 1.1
359     */
360    String MAGIC_ANT = "ustar\0";
361
362    /**
363     * The "version" representing an Ant tar archive.
364     *
365     * @since 1.1
366     */
367    // Does not appear to have a version, however Ant does write 8 bytes,
368    // so assume the version is 2 nulls
369    String VERSION_ANT = "\0\0";
370
371    /**
372     * The name of the GNU tar entry which contains a long name.
373     */
374    String GNU_LONGLINK = "././@LongLink"; // TODO rename as LONGLINK_GNU ?
375
376    /**
377     * The magix string used in the last four bytes of the header to identify the xstar format.
378     *
379     * @since 1.11
380     */
381    String MAGIC_XSTAR = "tar\0";
382
383    /**
384     * Offset inside the header for the xtar multivolume data
385     *
386     * @since 1.22
387     * @see TarArchiveEntry
388     */
389    int XSTAR_MULTIVOLUME_OFFSET = 464;
390
391    /**
392     * Offset inside the header for the xstar magic bytes.
393     *
394     * @since 1.11
395     */
396    int XSTAR_MAGIC_OFFSET = 508;
397
398    /**
399     * Length of the XSTAR magic.
400     *
401     * @since 1.11
402     */
403    int XSTAR_MAGIC_LEN = 4;
404
405    /**
406     * Length of the prefix field in xstar archives.
407     *
408     * @since 1.11
409     */
410    int PREFIXLEN_XSTAR = 131;
411
412    /**
413     * Offset inside the header for the prefix field in xstar archives.
414     *
415     * @since 1.22
416     * @see TarArchiveEntry
417     */
418    int XSTAR_PREFIX_OFFSET = 345;
419
420    /**
421     * Offset inside the header for the atime field in xstar archives.
422     *
423     * @since 1.22
424     * @see TarArchiveEntry
425     */
426    int XSTAR_ATIME_OFFSET = 476;
427
428    /**
429     * The length of the access time field in a xstar header buffer.
430     *
431     * @since 1.11
432     */
433    int ATIMELEN_XSTAR = 12;
434
435    /**
436     * Offset inside the header for the ctime field in xstar archives.
437     *
438     * @since 1.22
439     * @see TarArchiveEntry
440     */
441    int XSTAR_CTIME_OFFSET = 488;
442
443    /**
444     * The length of the created time field in a xstar header buffer.
445     *
446     * @since 1.11
447     */
448    int CTIMELEN_XSTAR = 12;
449}