2 ** Copyright 1998-2003 University of Illinois Board of Trustees
3 ** Copyright 1998-2003 Mark D. Roth
4 ** All rights reserved.
6 ** libtar.h - header file for libtar library
8 ** Mark D. Roth <roth@uiuc.edu>
9 ** Campus Information Technologies and Educational Services
10 ** University of Illinois at Urbana-Champaign
16 #include <sys/types.h>
20 #include <libtar_listhash.h>
28 /* useful constants */
29 #define T_BLOCKSIZE 512
31 #define T_PREFIXLEN 155
32 #define T_MAXPATHLEN (T_NAMELEN + T_PREFIXLEN)
34 /* GNU extensions for typeflag */
35 #define GNU_LONGNAME_TYPE 'L'
36 #define GNU_LONGLINK_TYPE 'K'
38 /* our version of the tar header structure */
63 /***** handle.c ************************************************************/
65 typedef int (*openfunc_t
)(const char *, int, ...);
66 typedef int (*closefunc_t
)(int);
67 typedef ssize_t (*readfunc_t
)(int, void *, size_t);
68 typedef ssize_t (*writefunc_t
)(int, const void *, size_t);
73 closefunc_t closefunc
;
75 writefunc_t writefunc
;
86 struct tar_header th_buf
;
91 /* constant values for the TAR options field */
92 #define TAR_GNU 1 /* use GNU extensions */
93 #define TAR_VERBOSE 2 /* output file info to stdout */
94 #define TAR_NOOVERWRITE 4 /* don't overwrite existing files */
95 #define TAR_IGNORE_EOT 8 /* ignore double zero blocks as EOF */
96 #define TAR_CHECK_MAGIC 16 /* check magic in file header */
97 #define TAR_CHECK_VERSION 32 /* check version in file header */
98 #define TAR_IGNORE_CRC 64 /* ignore CRC in file header */
100 /* this is obsolete - it's here for backwards-compatibility only */
101 #define TAR_IGNORE_MAGIC 0
103 extern const char libtar_version
[];
106 /* open a new tarfile handle */
107 int tar_open(TAR
**t
, char *pathname
, tartype_t
*type
,
108 int oflags
, int mode
, int options
);
110 /* make a tarfile handle out of a previously-opened descriptor */
111 int tar_fdopen(TAR
**t
, int fd
, char *pathname
, tartype_t
*type
,
112 int oflags
, int mode
, int options
);
114 /* returns the descriptor associated with t */
117 /* close tarfile handle */
118 int tar_close(TAR
*t
);
121 /***** append.c ************************************************************/
123 /* forward declaration to appease the compiler */
126 /* cleanup function */
127 void tar_dev_free(struct tar_dev
*tdp
);
129 /* Appends a file to the tar archive.
131 * t = TAR handle to append to
132 * realname = path of file to append
133 * savename = name to save the file under in the archive
135 int tar_append_file(TAR
*t
, char *realname
, char *savename
);
137 /* write EOF indicator */
138 int tar_append_eof(TAR
*t
);
140 /* add file contents to a tarchive */
141 int tar_append_regfile(TAR
*t
, char *realname
);
144 /***** block.c *************************************************************/
146 /* macros for reading/writing tarchive blocks */
147 #define tar_block_read(t, buf) \
148 (*((t)->type->readfunc))((t)->fd, (char *)(buf), T_BLOCKSIZE)
149 #define tar_block_write(t, buf) \
150 (*((t)->type->writefunc))((t)->fd, (char *)(buf), T_BLOCKSIZE)
152 /* read/write a header block */
154 int th_write(TAR
*t
);
157 /***** decode.c ************************************************************/
159 /* determine file type */
160 #define TH_ISREG(t) ((t)->th_buf.typeflag == REGTYPE \
161 || (t)->th_buf.typeflag == AREGTYPE \
162 || (t)->th_buf.typeflag == CONTTYPE \
163 || (S_ISREG((mode_t)oct_to_int((t)->th_buf.mode)) \
164 && (t)->th_buf.typeflag != LNKTYPE))
165 #define TH_ISLNK(t) ((t)->th_buf.typeflag == LNKTYPE)
166 #define TH_ISSYM(t) ((t)->th_buf.typeflag == SYMTYPE \
167 || S_ISLNK((mode_t)oct_to_int((t)->th_buf.mode)))
168 #define TH_ISCHR(t) ((t)->th_buf.typeflag == CHRTYPE \
169 || S_ISCHR((mode_t)oct_to_int((t)->th_buf.mode)))
170 #define TH_ISBLK(t) ((t)->th_buf.typeflag == BLKTYPE \
171 || S_ISBLK((mode_t)oct_to_int((t)->th_buf.mode)))
172 #define TH_ISDIR(t) ((t)->th_buf.typeflag == DIRTYPE \
173 || S_ISDIR((mode_t)oct_to_int((t)->th_buf.mode)) \
174 || ((t)->th_buf.typeflag == AREGTYPE \
175 && ((t)->th_buf.name[strlen((t)->th_buf.name) - 1] == '/')))
176 #define TH_ISFIFO(t) ((t)->th_buf.typeflag == FIFOTYPE \
177 || S_ISFIFO((mode_t)oct_to_int((t)->th_buf.mode)))
178 #define TH_ISLONGNAME(t) ((t)->th_buf.typeflag == GNU_LONGNAME_TYPE)
179 #define TH_ISLONGLINK(t) ((t)->th_buf.typeflag == GNU_LONGLINK_TYPE)
181 /* decode tar header info */
182 #define th_get_crc(t) oct_to_int((t)->th_buf.chksum)
183 #define th_get_size(t) oct_to_int((t)->th_buf.size)
184 #define th_get_mtime(t) oct_to_int((t)->th_buf.mtime)
185 #define th_get_devmajor(t) oct_to_int((t)->th_buf.devmajor)
186 #define th_get_devminor(t) oct_to_int((t)->th_buf.devminor)
187 #define th_get_linkname(t) ((t)->th_buf.gnu_longlink \
188 ? (t)->th_buf.gnu_longlink \
189 : (t)->th_buf.linkname)
190 char *th_get_pathname(TAR
*t
);
191 mode_t
th_get_mode(TAR
*t
);
192 uid_t
th_get_uid(TAR
*t
);
193 gid_t
th_get_gid(TAR
*t
);
196 /***** encode.c ************************************************************/
198 /* encode file info in th_header */
199 void th_set_type(TAR
*t
, mode_t mode
);
200 void th_set_path(TAR
*t
, char *pathname
);
201 void th_set_link(TAR
*t
, char *linkname
);
202 void th_set_device(TAR
*t
, dev_t device
);
203 void th_set_user(TAR
*t
, uid_t uid
);
204 void th_set_group(TAR
*t
, gid_t gid
);
205 void th_set_mode(TAR
*t
, mode_t fmode
);
206 #define th_set_mtime(t, fmtime) \
207 int_to_oct_nonull((fmtime), (t)->th_buf.mtime, 12)
208 #define th_set_size(t, fsize) \
209 int_to_oct_nonull((fsize), (t)->th_buf.size, 12)
211 /* encode everything at once (except the pathname and linkname) */
212 void th_set_from_stat(TAR
*t
, struct stat
*s
);
214 /* encode magic, version, and crc - must be done after everything else is set */
215 void th_finish(TAR
*t
);
218 /***** extract.c ***********************************************************/
220 /* sequentially extract next file from t */
221 int tar_extract_file(TAR
*t
, char *realname
);
223 /* extract different file types */
224 int tar_extract_dir(TAR
*t
, char *realname
);
225 int tar_extract_hardlink(TAR
*t
, char *realname
);
226 int tar_extract_symlink(TAR
*t
, char *realname
);
227 int tar_extract_chardev(TAR
*t
, char *realname
);
228 int tar_extract_blockdev(TAR
*t
, char *realname
);
229 int tar_extract_fifo(TAR
*t
, char *realname
);
231 /* for regfiles, we need to extract the content blocks as well */
232 int tar_extract_regfile(TAR
*t
, char *realname
);
233 int tar_skip_regfile(TAR
*t
);
236 /***** output.c ************************************************************/
238 /* print the tar header */
239 void th_print(TAR
*t
);
241 /* print "ls -l"-like output for the file described by th */
242 void th_print_long_ls(TAR
*t
);
245 /***** util.c *************************************************************/
247 /* hashing function for pathnames */
248 int path_hashfunc(char *key
, int numbuckets
);
250 /* matching function for dev_t's */
251 int dev_match(dev_t
*dev1
, dev_t
*dev2
);
253 /* matching function for ino_t's */
254 int ino_match(ino_t
*ino1
, ino_t
*ino2
);
256 /* hashing function for dev_t's */
257 int dev_hash(dev_t
*dev
);
259 /* hashing function for ino_t's */
260 int ino_hash(ino_t
*inode
);
262 /* create any necessary dirs */
263 int mkdirhier(char *path
);
265 /* calculate header checksum */
266 int th_crc_calc(TAR
*t
);
267 #define th_crc_ok(t) (th_get_crc(t) == th_crc_calc(t))
269 /* string-octal to integer conversion */
270 int oct_to_int(char *oct
);
272 /* integer to NULL-terminated string-octal conversion */
273 #define int_to_oct(num, oct, octlen) \
274 snprintf((oct), (octlen), "%*lo ", (octlen) - 2, (unsigned long)(num))
276 /* integer to string-octal conversion, no NULL */
277 void int_to_oct_nonull(int num
, char *oct
, size_t octlen
);
280 /***** wrapper.c **********************************************************/
282 /* extract groups of files */
283 int tar_extract_glob(TAR
*t
, char *globname
, char *prefix
);
284 int tar_extract_all(TAR
*t
, char *prefix
);
286 /* add a whole tree of files */
287 int tar_append_tree(TAR
*t
, char *realdir
, char *savedir
);
294 #endif /* ! LIBTAR_H */