    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}