summaryrefslogtreecommitdiffstats
path: root/gnu/usr.bin/tar/tar.h
blob: 2d1ca4bf2d023cddf2c8857c3df73f4b5ff887cd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
/* Declarations for tar archives.
   Copyright (C) 1988, 1992, 1993 Free Software Foundation

This file is part of GNU Tar.

GNU Tar is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Tar is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Tar; see the file COPYING.  If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */

/* major() and minor() macros (among other things) defined here for hpux */
#ifdef hpux
#include <sys/mknod.h>
#endif

/* 
 * We need to include <sys/types.h> for the u_quad_t definition
 */

#include <sys/types.h>

/*
 * Kludge for handling systems that can't cope with multiple
 * external definitions of a variable.  In ONE routine (tar.c),
 * we #define TAR_EXTERN to null; here, we set it to "extern" if
 * it is not already set.
 */
#ifndef TAR_EXTERN
#define TAR_EXTERN extern
#endif

/*
 * Header block on tape.
 *
 * I'm going to use traditional DP naming conventions here.
 * A "block" is a big chunk of stuff that we do I/O on.
 * A "record" is a piece of info that we care about.
 * Typically many "record"s fit into a "block".
 */
#define	RECORDSIZE	512
#define	NAMSIZ		100
#define	TUNMLEN		32
#define	TGNMLEN		32
#define SPARSE_EXT_HDR  21
#define SPARSE_IN_HDR	4

struct sparse
  {
    char offset[12];
    char numbytes[12];
  };

struct sp_array
  {
    int offset;
    int numbytes;
  };

union record
  {
    char charptr[RECORDSIZE];
    struct header
      {
	char arch_name[NAMSIZ];
	char mode[8];
	char uid[8];
	char gid[8];
	char size[12];
	char mtime[12];
	char chksum[8];
	char linkflag;
	char arch_linkname[NAMSIZ];
	char magic[8];
	char uname[TUNMLEN];
	char gname[TGNMLEN];
	char devmajor[8];
	char devminor[8];
	/* these following fields were added by JF for gnu */
	/* and are NOT standard */
	char atime[12];
	char ctime[12];
	char offset[12];
	char longnames[4];
#ifdef NEEDPAD
	char pad;
#endif
	struct sparse sp[SPARSE_IN_HDR];
	char isextended;
	char realsize[12];	/* true size of the sparse file */
	/* char	ending_blanks[12];*//* number of nulls at the
	   end of the file, if any */
      }
    header;
    struct extended_header
      {
	struct sparse sp[21];
	char isextended;
      }
    ext_hdr;
  };

/* The checksum field is filled with this while the checksum is computed. */
#define	CHKBLANKS	"        "	/* 8 blanks, no null */

/* The magic field is filled with this if uname and gname are valid. */
#define	TMAGIC		"ustar  "	/* 7 chars and a null */

/* The linkflag defines the type of file */
#define	LF_OLDNORMAL	'\0'	/* Normal disk file, Unix compat */
#define	LF_NORMAL	'0'	/* Normal disk file */
#define	LF_LINK		'1'	/* Link to previously dumped file */
#define	LF_SYMLINK	'2'	/* Symbolic link */
#define	LF_CHR		'3'	/* Character special file */
#define	LF_BLK		'4'	/* Block special file */
#define	LF_DIR		'5'	/* Directory */
#define	LF_FIFO		'6'	/* FIFO special file */
#define	LF_CONTIG	'7'	/* Contiguous file */
/* Further link types may be defined later. */

/* Note that the standards committee allows only capital A through
   capital Z for user-defined expansion.  This means that defining something
   as, say '8' is a *bad* idea. */
#define LF_DUMPDIR	'D'	/* This is a dir entry that contains
					   the names of files that were in
					   the dir at the time the dump
					   was made */
#define LF_LONGLINK	'K'	/* Identifies the NEXT file on the tape
					   as having a long linkname */
#define LF_LONGNAME	'L'	/* Identifies the NEXT file on the tape
					   as having a long name. */
#define LF_MULTIVOL	'M'	/* This is the continuation
					   of a file that began on another
					   volume */
#define LF_NAMES	'N'	/* For storing filenames that didn't
					   fit in 100 characters */
#define LF_SPARSE	'S'	/* This is for sparse files */
#define LF_VOLHDR	'V'	/* This file is a tape/volume header */
/* Ignore it on extraction */

/*
 * Exit codes from the "tar" program
 */
#define	EX_SUCCESS	0	/* success! */
#define	EX_ARGSBAD	1	/* invalid args */
#define	EX_BADFILE	2	/* invalid filename */
#define	EX_BADARCH	3	/* bad archive */
#define	EX_SYSTEM	4	/* system gave unexpected error */
#define EX_BADVOL	5	/* Special error code means
				   Tape volume doesn't match the one
				   specified on the command line */
#define EX_BADDIR       6	/* bad directory name */

/*
 * Global variables
 */
TAR_EXTERN union record *ar_block;	/* Start of block of archive */
TAR_EXTERN union record *ar_record;	/* Current record of archive */
TAR_EXTERN union record *ar_last;	/* Last+1 record of archive block */
TAR_EXTERN char ar_reading;	/* 0 writing, !0 reading archive */
TAR_EXTERN int blocking;	/* Size of each block, in records */
TAR_EXTERN int blocksize;	/* Size of each block, in bytes */
TAR_EXTERN char *info_script;	/* Script to run at end of each tape change */
TAR_EXTERN char *name_file;	/* File containing names to work on */
TAR_EXTERN char filename_terminator;	/* \n or \0. */
TAR_EXTERN char *tar;		/* Name of this program */
TAR_EXTERN struct sp_array *sparsearray;	/* Pointer to the start of the scratch space */
TAR_EXTERN int sp_array_size;	/* Initial size of the sparsearray */
TAR_EXTERN u_quad_t tot_written;	/* Total written to output */
TAR_EXTERN struct re_pattern_buffer
 *label_pattern;		/* compiled regex for extract label */
TAR_EXTERN char **ar_files;	/* list of tape drive names */
TAR_EXTERN int n_ar_files;	/* number of tape drive names */
TAR_EXTERN int cur_ar_file;	/* tape drive currently being used */
TAR_EXTERN int ar_files_len;	/* malloced size of ar_files */
TAR_EXTERN char *current_file_name, *current_link_name;

/*
 * Flags from the command line
 */
TAR_EXTERN int cmd_mode;
#define CMD_NONE	0
#define CMD_CAT		1	/* -A */
#define CMD_CREATE	2	/* -c */
#define CMD_DIFF	3	/* -d */
#define CMD_APPEND	4	/* -r */
#define CMD_LIST	5	/* -t */
#define CMD_UPDATE	6	/* -u */
#define CMD_EXTRACT	7	/* -x */
#define CMD_DELETE	8	/* -D */
#define CMD_VERSION	9	/* --version */


TAR_EXTERN int f_reblock;	/* -B */
TAR_EXTERN int f_dironly;	/* -n */
TAR_EXTERN int f_run_script_at_end;	/* -F */
TAR_EXTERN int f_gnudump;	/* -G */
TAR_EXTERN int f_follow_links;	/* -h */
TAR_EXTERN int f_ignorez;	/* -i */
TAR_EXTERN int f_keep;		/* -k */
TAR_EXTERN int f_startfile;	/* -K */
TAR_EXTERN int f_local_filesys;	/* -l */
TAR_EXTERN int tape_length;	/* -L */
TAR_EXTERN int f_modified;	/* -m */
TAR_EXTERN int f_multivol;	/* -M */
TAR_EXTERN int f_new_files;	/* -N */
TAR_EXTERN int f_oldarch;	/* -o */
TAR_EXTERN int f_exstdout;	/* -O */
TAR_EXTERN int f_use_protection;/* -p */
TAR_EXTERN int f_absolute_paths;/* -P */
TAR_EXTERN int f_sayblock;	/* -R */
TAR_EXTERN int f_sorted_names;	/* -s */
TAR_EXTERN int f_sparse_files;	/* -S  ... JK */
TAR_EXTERN int f_namefile;	/* -T */
TAR_EXTERN int f_verbose;	/* -v */
TAR_EXTERN char *f_volhdr;	/* -V */
TAR_EXTERN int f_confirm;	/* -w */
TAR_EXTERN int f_verify;	/* -W */
TAR_EXTERN int f_exclude;	/* -X */
TAR_EXTERN char *f_compressprog;	/* -z and -Z */
TAR_EXTERN int f_do_chown;	/* --do-chown */
TAR_EXTERN int f_totals;	/* --totals */
TAR_EXTERN int f_remove_files;	/* --remove-files */
TAR_EXTERN int f_ignore_failed_read;	/* --ignore-failed-read */
TAR_EXTERN int f_checkpoint;	/* --checkpoint */
TAR_EXTERN int f_show_omitted_dirs;	/* --show-omitted-dirs */
TAR_EXTERN char *f_volno_file;	/* --volno-file */
TAR_EXTERN int f_force_local;	/* --force-local */
TAR_EXTERN int f_atime_preserve;/* --atime-preserve */
TAR_EXTERN int f_compress_block; /* --compress-block */
TAR_EXTERN int f_unlink;	/* --unlink */
TAR_EXTERN int f_fast_read;	/* --fast-read */

/*
 * We default to Unix Standard format rather than 4.2BSD tar format.
 * The code can actually produce all three:
 *	f_standard	ANSI standard
 *	f_oldarch	V7
 *	neither		4.2BSD
 * but we don't bother, since 4.2BSD can read ANSI standard format anyway.
 * The only advantage to the "neither" option is that we can cmp our
 * output to the output of 4.2BSD tar, for debugging.
 */
#define		f_standard		(!f_oldarch)

/*
 * Structure for keeping track of filenames and lists thereof.
 */
struct name
  {
    struct name *next;
    short length;		/* cached strlen(name) */
    char found;			/* A matching file has been found */
    char firstch;		/* First char is literally matched */
    char regexp;		/* This name is a regexp, not literal */
    char *change_dir;		/* JF set with the -C option */
    char *dir_contents;		/* JF for f_gnudump */
    char fake;			/* dummy entry */
    char name[1];
  };

TAR_EXTERN struct name *namelist;	/* Points to first name in list */
TAR_EXTERN struct name *namelast;	/* Points to last name in list */

TAR_EXTERN int archive;		/* File descriptor for archive file */
TAR_EXTERN int errors;		/* # of files in error */

TAR_EXTERN char *gnu_dumpfile;

/*
 * Error recovery stuff
 */
TAR_EXTERN char read_error_flag;

/*
 * global boolean, see name_match in tar.c
 */
extern int	nlpsfreed;

/*
 * Declarations of functions available to the world.
 */
union record *findrec ();
void userec ();
union record *endofrecs ();
void anno ();

#if defined (HAVE_VPRINTF) && __STDC__
void msg (char *,...);
void msg_perror (char *,...);
#else
void msg ();
void msg_perror ();
#endif
OpenPOWER on IntegriCloud