home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 6 File / 06-File.zip / FILE39.ZIP / tar.h < prev   
C/C++ Source or Header  |  1993-04-05  |  5KB  |  180 lines

  1. /*
  2.  * Header file for public domain tar (tape archive) program.
  3.  *
  4.  * @(#)tar.h 1.20 86/10/29    Public Domain.
  5.  *
  6.  * Created 25 August 1985 by John Gilmore, ihnp4!hoptoad!gnu.
  7.  *
  8.  * $Id: tar.h,v 1.3 92/09/08 15:32:41 ian Exp $ # checkin only
  9.  */
  10.  
  11. /*
  12.  * Kludge for handling systems that can't cope with multiple
  13.  * external definitions of a variable.  In ONE routine (tar.c),
  14.  * we #define TAR_EXTERN to null; here, we set it to "extern" if
  15.  * it is not already set.
  16.  */
  17. #ifndef TAR_EXTERN
  18. #define TAR_EXTERN extern
  19. #endif
  20.  
  21. /*
  22.  * Header block on tape.
  23.  *
  24.  * I'm going to use traditional DP naming conventions here.
  25.  * A "block" is a big chunk of stuff that we do I/O on.
  26.  * A "record" is a piece of info that we care about.
  27.  * Typically many "record"s fit into a "block".
  28.  */
  29. #define    RECORDSIZE    512
  30. #define    NAMSIZ    100
  31. #define    TUNMLEN    32
  32. #define    TGNMLEN    32
  33.  
  34. union record {
  35.     char        charptr[RECORDSIZE];
  36.     struct header {
  37.         char    name[NAMSIZ];
  38.         char    mode[8];
  39.         char    uid[8];
  40.         char    gid[8];
  41.         char    size[12];
  42.         char    mtime[12];
  43.         char    chksum[8];
  44.         char    linkflag;
  45.         char    linkname[NAMSIZ];
  46.         char    magic[8];
  47.         char    uname[TUNMLEN];
  48.         char    gname[TGNMLEN];
  49.         char    devmajor[8];
  50.         char    devminor[8];
  51.     } header;
  52. };
  53.  
  54. /* The checksum field is filled with this while the checksum is computed. */
  55. #define    CHKBLANKS    "        "    /* 8 blanks, no null */
  56.  
  57. /* The magic field is filled with this if uname and gname are valid. */
  58. #define    TMAGIC        "ustar  "    /* 7 chars and a null */
  59.  
  60. /* The linkflag defines the type of file */
  61. #define    LF_OLDNORMAL    '\0'        /* Normal disk file, Unix compat */
  62. #define    LF_NORMAL    '0'        /* Normal disk file */
  63. #define    LF_LINK        '1'        /* Link to previously dumped file */
  64. #define    LF_SYMLINK    '2'        /* Symbolic link */
  65. #define    LF_CHR        '3'        /* Character special file */
  66. #define    LF_BLK        '4'        /* Block special file */
  67. #define    LF_DIR        '5'        /* Directory */
  68. #define    LF_FIFO        '6'        /* FIFO special file */
  69. #define    LF_CONTIG    '7'        /* Contiguous file */
  70. /* Further link types may be defined later. */
  71.  
  72. /*
  73.  * Exit codes from the "tar" program
  74.  */
  75. #define    EX_SUCCESS    0        /* success! */
  76. #define    EX_ARGSBAD    1        /* invalid args */
  77. #define    EX_BADFILE    2        /* invalid filename */
  78. #define    EX_BADARCH    3        /* bad archive */
  79. #define    EX_SYSTEM    4        /* system gave unexpected error */
  80.  
  81.  
  82. /*
  83.  * Global variables
  84.  */
  85. TAR_EXTERN union record    *ar_block;    /* Start of block of archive */
  86. TAR_EXTERN union record    *ar_record;    /* Current record of archive */
  87. TAR_EXTERN union record    *ar_last;    /* Last+1 record of archive block */
  88. TAR_EXTERN char        ar_reading;    /* 0 writing, !0 reading archive */
  89. TAR_EXTERN int        blocking;    /* Size of each block, in records */
  90. TAR_EXTERN int        blocksize;    /* Size of each block, in bytes */
  91. TAR_EXTERN char        *ar_file;    /* File containing archive */
  92. TAR_EXTERN char        *name_file;    /* File containing names to work on */
  93. TAR_EXTERN char        *tar;        /* Name of this program */
  94.  
  95. /*
  96.  * Flags from the command line
  97.  */
  98. TAR_EXTERN char    f_reblock;        /* -B */
  99. TAR_EXTERN char    f_create;        /* -c */
  100. TAR_EXTERN char    f_debug;        /* -d */
  101. TAR_EXTERN char    f_sayblock;        /* -D */
  102. TAR_EXTERN char    f_follow_links;        /* -h */
  103. TAR_EXTERN char    f_ignorez;        /* -i */
  104. TAR_EXTERN char    f_keep;            /* -k */
  105. TAR_EXTERN char    f_modified;        /* -m */
  106. TAR_EXTERN char    f_oldarch;        /* -o */
  107. TAR_EXTERN char    f_use_protection;    /* -p */
  108. TAR_EXTERN char    f_sorted_names;        /* -s */
  109. TAR_EXTERN char    f_list;            /* -t */
  110. TAR_EXTERN char    f_namefile;        /* -T */
  111. TAR_EXTERN char    f_verbose;        /* -v */
  112. TAR_EXTERN char    f_extract;        /* -x */
  113. TAR_EXTERN char    f_compress;        /* -z */
  114.  
  115. /*
  116.  * We now default to Unix Standard format rather than 4.2BSD tar format.
  117.  * The code can actually produce all three:
  118.  *    f_standard    ANSI standard
  119.  *    f_oldarch    V7
  120.  *    neither        4.2BSD
  121.  * but we don't bother, since 4.2BSD can read ANSI standard format anyway.
  122.  * The only advantage to the "neither" option is that we can cmp(1) our
  123.  * output to the output of 4.2BSD tar, for debugging.
  124.  */
  125. #define        f_standard        (!f_oldarch)
  126.  
  127. /*
  128.  * Structure for keeping track of filenames and lists thereof.
  129.  */
  130. struct name {
  131.     struct name    *next;
  132.     short        length;
  133.     char        found;
  134.     char        name[NAMSIZ+1];
  135. };
  136.  
  137. TAR_EXTERN struct name    *namelist;    /* Points to first name in list */
  138. TAR_EXTERN struct name    *namelast;    /* Points to last name in list */
  139.  
  140. TAR_EXTERN int        archive;    /* File descriptor for archive file */
  141. TAR_EXTERN int        errors;        /* # of files in error */
  142.  
  143. /*
  144.  *
  145.  * Due to the next struct declaration, each routine that includes
  146.  * "tar.h" must also include <sys/types.h>.  I tried to make it automatic,
  147.  * but System V has no defines in <sys/types.h>, so there is no way of
  148.  * knowing when it has been included.  In addition, it cannot be included
  149.  * twice, but must be included exactly once.  Argghh!
  150.  *
  151.  * Thanks, typedef.  Thanks, USG.
  152.  */
  153. struct link {
  154.     struct link    *next;
  155.     dev_t        dev;
  156.     ino_t        ino;
  157.     short        linkcount;
  158.     char        name[NAMSIZ+1];
  159. };
  160.  
  161. TAR_EXTERN struct link    *linklist;    /* Points to first link in list */
  162.  
  163.  
  164. /*
  165.  * Error recovery stuff
  166.  */
  167. TAR_EXTERN char        read_error_flag;
  168.  
  169.  
  170. /*
  171.  * Declarations of functions available to the world.
  172.  */
  173. /*LINTLIBRARY*/
  174. union record *findrec();
  175. void userec();
  176. union record *endofrecs();
  177. void anno();
  178. #define     annorec(stream, msg)    anno(stream, msg, 0)    /* Cur rec */
  179. #define    annofile(stream, msg)    anno(stream, msg, 1)    /* Saved rec */
  180.