root/usr/src/head/archives.h
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright (c) 1988,1997-1998,2001 by Sun Microsystems, Inc.
 * All rights reserved.
 */

/*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/*        All Rights Reserved   */


#ifndef _ARCHIVES_H
#define _ARCHIVES_H

#include <tar.h>

#ifdef  __cplusplus
extern "C" {
#endif

/* Magic numbers */

#define CMN_ASC 0x070701        /* Cpio Magic Number for ASCii header */
#define CMN_BIN 070707          /* Cpio Magic Number for Binary header */
#define CMN_BBS 0143561         /* Cpio Magic Number for Byte-Swap header */
#define CMN_CRC 0x070702        /* Cpio Magic Number for CRC header */
#define CMS_ASC "070701"        /* Cpio Magic String for ASCii header */
#define CMS_CHR "070707"        /* Cpio Magic String for CHR (-c) header */
#define CMS_CRC "070702"        /* Cpio Magic String for CRC header */
#define CMS_LEN 6               /* Cpio Magic String LENgth */

/* Various header and field lengths */

#define CHRSZ   76              /* -c hdr size minus filename field */
#define ASCSZ   110             /* ASC and CRC hdr size minus filename field */
#define TARSZ   512             /* TAR hdr size */

#define HNAMLEN 256     /* maximum filename length for binary and -c headers */
#define EXPNLEN 1024    /* maximum filename length for ASC and CRC headers */
#define HTIMLEN 2       /* length of modification time field */
#define HSIZLEN 2       /* length of file size field */

/* cpio binary header definition */

struct hdr_cpio {
        short   h_magic,                /* magic number field */
                h_dev;                  /* file system of file */
        ushort_t h_ino,                 /* inode of file */
                h_mode,                 /* modes of file */
                h_uid,                  /* uid of file */
                h_gid;                  /* gid of file */
        short   h_nlink,                /* number of links to file */
                h_rdev,                 /* maj/min numbers for special files */
                h_mtime[HTIMLEN],       /* modification time of file */
                h_namesize,             /* length of filename */
                h_filesize[HSIZLEN];    /* size of file */
        char    h_name[HNAMLEN];        /* filename */
};

/* cpio ODC header format */

struct c_hdr {
        char    c_magic[CMS_LEN],
                c_dev[6],
                c_ino[6],
                c_mode[6],
                c_uid[6],
                c_gid[6],
                c_nlink[6],
                c_rdev[6],
                c_mtime[11],
                c_namesz[6],
                c_filesz[11],
                c_name[HNAMLEN];
};

/* -c and CRC header format */

struct Exp_cpio_hdr {
        char    E_magic[CMS_LEN],
                E_ino[8],
                E_mode[8],
                E_uid[8],
                E_gid[8],
                E_nlink[8],
                E_mtime[8],
                E_filesize[8],
                E_maj[8],
                E_min[8],
                E_rmaj[8],
                E_rmin[8],
                E_namesize[8],
                E_chksum[8],
                E_name[EXPNLEN];
};

/* Tar header structure and format */

#define TBLOCK  512     /* length of tar header and data blocks */
#define TNAMLEN 100     /* maximum length for tar file names */
#define TMODLEN 8       /* length of mode field */
#define TUIDLEN 8       /* length of uid field */
#define TGIDLEN 8       /* length of gid field */
#define TSIZLEN 12      /* length of size field */
#define TTIMLEN 12      /* length of modification time field */
#define TCRCLEN 8       /* length of header checksum field */

/* tar header definition */

union tblock {
        char dummy[TBLOCK];
        struct tar_hdr {
                char    t_name[TNAMLEN],        /* name of file */
                        t_mode[TMODLEN],        /* mode of file */
                        t_uid[TUIDLEN],         /* uid of file */
                        t_gid[TGIDLEN],         /* gid of file */
                        t_size[TSIZLEN],        /* size of file in bytes */
                        t_mtime[TTIMLEN],       /* modification time of file */
                        t_cksum[TCRCLEN],       /* checksum of header */
                        t_typeflag,
                        t_linkname[TNAMLEN],    /* file this file linked with */
                        t_magic[TMAGLEN],
                        t_version[TVERSLEN],
                        t_uname[32],
                        t_gname[32],
                        t_devmajor[8],
                        t_devminor[8],
                        t_prefix[155];
        } tbuf;
};

/* volcopy tape label format and structure */

#define VMAGLEN 8
#define VVOLLEN 6
#define VFILLEN 464

struct volcopy_label {
        char    v_magic[VMAGLEN],
                v_volume[VVOLLEN],
                v_reels,
                v_reel;
        int     v_time,
                v_length,
                v_dens,
                v_reelblks,     /* u370 added field */
                v_blksize,      /* u370 added field */
                v_nblocks;      /* u370 added field */
        char    v_fill[VFILLEN];
        int     v_offset;       /* used with -e and -reel options */
        int     v_type;         /* does tape have nblocks field? */
};

/*
 * Define archive formats for extended attributes.
 *
 * Extended attributes are stored in two pieces.
 * 1. An attribute header which has information about
 *    what file the attribute is for and what the attribute
 *    is named.
 * 2. The attribute record itself.  Stored as a normal file type
 *    of entry.
 * Both the header and attribute record have special modes/typeflags
 * associated with them.
 *
 * The names of the header in the archive look like:
 * /dev/null/attr.hdr
 *
 * The name of the attribute looks like:
 * /dev/null/attr.
 *
 * This is done so that an archiver that doesn't understand these formats
 * can just dispose of the attribute records unless the user chooses to
 * rename them via cpio -r or pax -i
 *
 * The format is composed of a fixed size header followed
 * by a variable sized xattr_buf. If the attribute is a hard link
 * to another attribute, then another xattr_buf section is included
 * for the link.
 *
 * The xattr_buf is used to define the necessary "pathing" steps
 * to get to the extended attribute.  This is necessary to support
 * a fully recursive attribute model where an attribute may itself
 * have an attribute.
 *
 * The basic layout looks like this.
 *
 *     --------------------------------
 *     |                              |
 *     |         xattr_hdr            |
 *     |                              |
 *     --------------------------------
 *     --------------------------------
 *     |                              |
 *     |        xattr_buf             |
 *     |                              |
 *     --------------------------------
 *     --------------------------------
 *     |                              |
 *     |      (optional link info)    |
 *     |                              |
 *     --------------------------------
 *     --------------------------------
 *     |                              |
 *     |      attribute itself        |
 *     |      stored as normal tar    |
 *     |      or cpio data with       |
 *     |      special mode or         |
 *     |      typeflag                |
 *     |                              |
 *     --------------------------------
 *
 */
#define XATTR_ARCH_VERS "1.0"

/*
 * extended attribute fixed header
 *
 * h_version            format version.
 * h_size               size of header + variable sized data sections.
 * h_component_len      Length of entire pathing section.
 * h_link_component_len Length of link component section.  Again same definition
 *                      as h_component_len.
 */
struct xattr_hdr {
        char    h_version[7];
        char    h_size[10];
        char    h_component_len[10];       /* total length of path component */
        char    h_link_component_len[10];
};

/*
 * The name is encoded like this:
 * filepathNULattrpathNUL[attrpathNULL]...
 */
struct xattr_buf {
        char    h_namesz[7];   /* length of h_names */
        char    h_typeflag;    /* actual typeflag of file being archived */
        char    h_names[1];     /* filepathNULattrpathNUL... */
};

/*
 * Special values for tar archives
 */

/*
 * typeflag for tar archives.
 */

/*
 * Attribute hdr and attribute files have the following typeflag
 */
#define _XATTR_HDRTYPE          'E'

/*
 * For cpio archives the header and attribute have
 * _XATTR_CPIO_MODE ORED into the mode field in both
 * character and binary versions of the archive format
 */
#define _XATTR_CPIO_MODE        0xB000

#ifdef  __cplusplus
}
#endif

#endif  /* _ARCHIVES_H */