home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume17 / pax / part03 / pax.h < prev    next >
C/C++ Source or Header  |  1989-02-02  |  9KB  |  355 lines

  1. /* $Source: /u/mark/src/pax/RCS/pax.h,v $
  2.  *
  3.  * $Revision: 1.1 $
  4.  *
  5.  * pax.h - defnitions for entire program
  6.  *
  7.  * DESCRIPTION
  8.  *
  9.  *    This file contains most all of the definitions required by the PAX
  10.  *    software.  This header is included in every source file.
  11.  *
  12.  * AUTHOR
  13.  *
  14.  *     Mark H. Colburn, NAPS International (mark@jhereg.mn.org)
  15.  *
  16.  * Sponsored by The USENIX Association for public distribution. 
  17.  *
  18.  * Copyright (c) 1989 Mark H. Colburn.
  19.  * All rights reserved.
  20.  *
  21.  * Redistribution and use in source and binary forms are permitted
  22.  * provided that the above copyright notice and this paragraph are
  23.  * duplicated in all such forms and that any documentation,
  24.  * advertising materials, and other materials related to such
  25.  * distribution and use acknowledge that the software was developed
  26.  * by Mark H. Colburn and sponsored by The USENIX Association. 
  27.  *
  28.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  29.  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  30.  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  31.  */
  32.  
  33. #ifndef _PAX_H
  34. #define _PAX_H
  35.  
  36. /* Headers */
  37.  
  38. #include "config.h"
  39. #include "limits.h"
  40. #include <stdio.h>
  41. #include <errno.h>
  42. #include <signal.h>
  43. #include <ctype.h>
  44. #include <sys/types.h>
  45. #include <sys/ioctl.h>
  46. #include <sys/stat.h>
  47. #include "regexp.h"
  48.  
  49. #if defined(DIRENT) || defined(_POSIX_SOURCE)
  50. # ifdef PAXDIR
  51. #  include "paxdir.h"
  52. # else
  53. #  include <dirent.h>
  54. # endif
  55. #else
  56. # include <sys/dir.h>
  57. # define dirent direct
  58. #endif
  59.  
  60. #ifndef    major
  61. #   include <sys/sysmacros.h>
  62. #endif                /* major */
  63.  
  64. #ifdef    SYSTIME
  65. #   include <sys/time.h>
  66. #else                /* SYSTIME */
  67. #   include <time.h>
  68. #endif                /* SYSTIME */
  69.  
  70. #ifndef V7
  71. #   include <fcntl.h>
  72. #endif
  73.  
  74. #ifdef XENIX
  75. #   include <sys/inode.h>
  76. #endif
  77.  
  78. #include <pwd.h>
  79. #include <grp.h>
  80. #include <sys/file.h>
  81.  
  82. /* Defines */
  83.  
  84. #define    STDIN    0        /* Standard input  file descriptor */
  85. #define    STDOUT    1        /* Standard output file descriptor */
  86.  
  87. /*
  88.  * Open modes; there is no <fcntl.h> with v7 UNIX and other versions of
  89.  * UNIX may not have all of these defined...
  90.  */
  91.  
  92. #ifndef O_RDONLY
  93. #   define    O_RDONLY    0
  94. #endif
  95.  
  96. #ifndef O_WRONLY
  97. #   define    O_WRONLY    1
  98. #endif
  99.  
  100. #ifndef O_RDWR
  101. #   define    O_WRONLY    2
  102. #endif
  103.  
  104. #ifndef    O_BINARY
  105. #   define    O_BINARY    0
  106. #endif
  107.  
  108. #ifndef NULL
  109. #   define     NULL         0
  110. #endif
  111.  
  112. #define TMAGIC        "ustar"        /* ustar and a null */
  113. #define TMAGLEN        6
  114. #define TVERSION    "00"        /* 00 and no null */
  115. #define TVERSLEN    2
  116.  
  117. /* Values used in typeflag field */
  118. #define REGTYPE        '0'        /* Regular File */
  119. #define AREGTYPE    '\0'        /* Regular File */
  120. #define LNKTYPE        '1'        /* Link */
  121. #define SYMTYPE        '2'        /* Reserved */
  122. #define CHRTYPE        '3'        /* Character Special File */
  123. #define BLKTYPE        '4'        /* Block Special File */
  124. #define DIRTYPE        '5'        /* Directory */
  125. #define FIFOTYPE    '6'        /* FIFO */
  126. #define CONTTYPE    '7'        /* Reserved */
  127.  
  128. #define BLOCKSIZE    512    /* all output is padded to 512 bytes */
  129. #define    uint    unsigned int    /* Not always in types.h */
  130. #define    ushort    unsigned short    /* Not always in types.h */
  131. #define    BLOCK    5120        /* Default archive block size */
  132. #define    H_COUNT    10        /* Number of items in ASCII header */
  133. #define    H_PRINT    "%06o%06o%06o%06o%06o%06o%06o%011lo%06o%011lo"
  134. #define    H_SCAN    "%6ho%6ho%6ho%6ho%6ho%6ho%6ho%11lo%6o%11lo"
  135. #define    H_STRLEN 70        /* ASCII header string length */
  136. #define    M_ASCII "070707"    /* ASCII magic number */
  137. #define    M_BINARY 070707        /* Binary magic number */
  138. #define    M_STRLEN 6        /* ASCII magic number length */
  139. #define    PATHELEM 256        /* Pathname element count limit */
  140. #define    S_IFSHF    12        /* File type shift (shb in stat.h) */
  141. #define    S_IPERM    07777        /* File permission bits (shb in stat.h) */
  142. #define    S_IPEXE    07000        /* Special execution bits (shb in stat.h) */
  143. #define    S_IPOPN    0777        /* Open access bits (shb in stat.h) */
  144.  
  145. /*
  146.  * Trailer pathnames. All must be of the same length. 
  147.  */
  148. #define    TRAILER    "TRAILER!!!"    /* Archive trailer (cpio compatible) */
  149. #define    TRAILZ    11        /* Trailer pathname length (including null) */
  150.  
  151. #include "port.h"
  152.  
  153.  
  154. #define    TAR        1
  155. #define    CPIO        2
  156. #define    PAX        3
  157.  
  158. #define AR_READ     0
  159. #define AR_WRITE     1
  160. #define AR_EXTRACT    2
  161. #define AR_APPEND     4
  162.  
  163. /*
  164.  * Header block on tape. 
  165.  */
  166. #define    NAMSIZ        100
  167. #define    PFIXSIZ        155
  168. #define    TUNMLEN        32
  169. #define    TGNMLEN        32
  170.  
  171. /* The checksum field is filled with this while the checksum is computed. */
  172. #define    CHKBLANKS    "        "    /* 8 blanks, no null */
  173.  
  174. /*
  175.  * Exit codes from the "tar" program 
  176.  */
  177. #define    EX_SUCCESS    0    /* success! */
  178. #define    EX_ARGSBAD    1    /* invalid args */
  179. #define    EX_BADFILE    2    /* invalid filename */
  180. #define    EX_BADARCH    3    /* bad archive */
  181. #define    EX_SYSTEM    4    /* system gave unexpected error */
  182.  
  183. #define    ROUNDUP(a,b)     (((a) % (b)) == 0 ? (a) : ((a) + ((b) - ((a) % (b)))))
  184.  
  185. /*
  186.  * Mininum value. 
  187.  */
  188. #define    MIN(a, b)    (((a) < (b)) ? (a) : (b))
  189.  
  190. /*
  191.  * Remove a file or directory. 
  192.  */
  193. #define    REMOVE(name, asb) \
  194.     (((asb)->sb_mode & S_IFMT) == S_IFDIR ? rmdir(name) : unlink(name))
  195.  
  196. /*
  197.  * Cast and reduce to unsigned short. 
  198.  */
  199. #define    USH(n)        (((ushort) (n)) & 0177777)
  200.  
  201.  
  202. /* Type Definitions */
  203.  
  204. /*
  205.  * Binary archive header (obsolete). 
  206.  */
  207. typedef struct {
  208.     short           b_dev;    /* Device code */
  209.     ushort          b_ino;    /* Inode number */
  210.     ushort          b_mode;    /* Type and permissions */
  211.     ushort          b_uid;    /* Owner */
  212.     ushort          b_gid;    /* Group */
  213.     short           b_nlink;    /* Number of links */
  214.     short           b_rdev;    /* Real device */
  215.     ushort          b_mtime[2];    /* Modification time (hi/lo) */
  216.     ushort          b_name;    /* Length of pathname (with null) */
  217.     ushort          b_size[2];    /* Length of data */
  218. } Binary;
  219.  
  220. /*
  221.  * File status with symbolic links. Kludged to hold symbolic link pathname
  222.  * within structure. 
  223.  */
  224. typedef struct {
  225.     struct stat     sb_stat;
  226.     char            sb_link[PATH_MAX + 1];
  227. } Stat;
  228.  
  229. #define    STAT(name, asb)        stat(name, &(asb)->sb_stat)
  230. #define    FSTAT(fd, asb)        fstat(fd, &(asb)->sb_stat)
  231.  
  232. #define    sb_dev        sb_stat.st_dev
  233. #define    sb_ino        sb_stat.st_ino
  234. #define    sb_mode        sb_stat.st_mode
  235. #define    sb_nlink    sb_stat.st_nlink
  236. #define    sb_uid        sb_stat.st_uid
  237. #define    sb_gid        sb_stat.st_gid
  238. #define    sb_rdev        sb_stat.st_rdev
  239. #define    sb_size        sb_stat.st_size
  240. #define    sb_atime    sb_stat.st_atime
  241. #define    sb_mtime    sb_stat.st_mtime
  242. #define    sb_ctime    sb_stat.st_ctime
  243.  
  244. #ifdef    S_IFLNK
  245. #    define    LSTAT(name, asb)    lstat(name, &(asb)->sb_stat)
  246. #    define    sb_blksize    sb_stat.st_blksize
  247. #    define    sb_blocks    sb_stat.st_blocks
  248. #else                /* S_IFLNK */
  249. /*
  250.  * File status without symbolic links. 
  251.  */
  252. #    define    LSTAT(name, asb)    stat(name, &(asb)->sb_stat)
  253. #endif                /* S_IFLNK */
  254.  
  255. /*
  256.  * Hard link sources. One or more are chained from each link structure. 
  257.  */
  258. typedef struct name {
  259.     struct name    *p_forw;    /* Forward chain (terminated) */
  260.     struct name    *p_back;    /* Backward chain (circular) */
  261.     char           *p_name;    /* Pathname to link from */
  262. } Path;
  263.  
  264. /*
  265.  * File linking information. One entry exists for each unique file with with
  266.  * outstanding hard links. 
  267.  */
  268. typedef struct link {
  269.     struct link    *l_forw;    /* Forward chain (terminated) */
  270.     struct link    *l_back;    /* Backward chain (terminated) */
  271.     dev_t           l_dev;    /* Device */
  272.     ino_t           l_ino;    /* Inode */
  273.     ushort          l_nlink;    /* Unresolved link count */
  274.     OFFSET          l_size;    /* Length */
  275.     char       *l_name;    /* pathname to link from */
  276.     Path           *l_path;    /* Pathname which link to l_name */
  277. } Link;
  278.  
  279. /*
  280.  * Structure for ed-style replacement strings (-s option).
  281. */
  282. typedef struct replstr {
  283.     regexp       *comp;    /* compiled regular expression */
  284.     char       *replace;    /* replacement string */
  285.     char        print;    /* >0 if we are to print replacement */
  286.     char        global;    /* >0 if we are to replace globally */
  287.     struct replstr *next;    /* pointer to next record */
  288. } Replstr;
  289.  
  290.  
  291. /*
  292.  * This has to be included here to insure that all of the type 
  293.  * delcarations are declared for the prototypes.
  294.  */
  295. #include "func.h"
  296.  
  297.  
  298. #ifndef NO_EXTERN
  299. /* Globally Available Identifiers */
  300.  
  301. extern char    *ar_file;
  302. extern char    *bufend;
  303. extern char    *bufstart;
  304. extern char    *bufidx;
  305. extern char    *myname;
  306. extern int      archivefd;
  307. extern int      blocking;
  308. extern uint     blocksize;
  309. extern int      gid;
  310. extern int      head_standard;
  311. extern int      ar_interface;
  312. extern int      ar_format;
  313. extern int      mask;
  314. extern int      ttyf;
  315. extern int      uid;
  316. extern OFFSET    total;
  317. extern short    areof;
  318. extern short    f_append;
  319. extern short    f_create;
  320. extern short    f_extract;
  321. extern short    f_follow_links;
  322. extern short    f_interactive;
  323. extern short    f_linksleft;
  324. extern short    f_list;
  325. extern short    f_modified;
  326. extern short    f_verbose;
  327. extern short    f_link;
  328. extern short    f_owner;
  329. extern short    f_access_time;
  330. extern short    f_pass;
  331. extern short    f_pass;
  332. extern short    f_disposition;
  333. extern short    f_reverse_match;
  334. extern short    f_modification_time;
  335. extern short    f_create_dirs;
  336. extern short    f_unconditional;
  337. extern short    f_newer;
  338. extern time_t   now;
  339. extern uint     arvolume;
  340. extern int    names_from_stdin;
  341. extern Replstr *rplhead;
  342. extern Replstr *rpltail;
  343. extern char   **n_argv;
  344. extern int      n_argc;
  345. extern FILE    *msgfile;
  346. #endif /* NO_EXTERN */
  347.  
  348. extern char    *optarg;
  349. extern int      optind;
  350. extern int      sys_nerr;
  351. extern char    *sys_errlist[];
  352. extern int      errno;
  353.  
  354. #endif /* _PAX_H */
  355.