summaryrefslogtreecommitdiffstats
path: root/Utilities/cmtar/append.c
diff options
context:
space:
mode:
Diffstat (limited to 'Utilities/cmtar/append.c')
-rw-r--r--Utilities/cmtar/append.c297
1 files changed, 0 insertions, 297 deletions
diff --git a/Utilities/cmtar/append.c b/Utilities/cmtar/append.c
deleted file mode 100644
index 14c7362..0000000
--- a/Utilities/cmtar/append.c
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
-** Copyright 1998-2003 University of Illinois Board of Trustees
-** Copyright 1998-2003 Mark D. Roth
-** All rights reserved.
-**
-** append.c - libtar code to append files to a tar archive
-**
-** Mark D. Roth <roth@uiuc.edu>
-** Campus Information Technologies and Educational Services
-** University of Illinois at Urbana-Champaign
-*/
-
-#include <libtarint/internal.h>
-
-#include <stdio.h>
-#include <errno.h>
-#include <fcntl.h>
-#if defined(_WIN32) && !defined(__CYGWIN__)
-# include <libtar/compat.h>
-#else
-# ifdef HAVE_SYS_PARAM_H
-# include <sys/param.h>
-# endif
-#endif
-#include <libtar/compat.h>
-#include <sys/types.h>
-
-#ifdef STDC_HEADERS
-# include <stdlib.h>
-# include <string.h>
-#endif
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#ifdef HAVE_IO_H
-# include <io.h>
-#endif
-
-struct tar_dev
-{
- dev_t td_dev;
- libtar_hash_t *td_h;
-};
-typedef struct tar_dev tar_dev_t;
-
-struct tar_ino
-{
- ino_t ti_ino;
- char ti_name[TAR_MAXPATHLEN];
-};
-typedef struct tar_ino tar_ino_t;
-
-
-/* free memory associated with a tar_dev_t */
-void
-tar_dev_free(tar_dev_t *tdp)
-{
- libtar_hash_free(tdp->td_h, free);
- free(tdp);
-}
-
-
-/* appends a file to the tar archive */
-int
-tar_append_file(TAR *t, char *realname, char *savename)
-{
- struct stat s;
- libtar_hashptr_t hp;
- tar_dev_t *td;
- tar_ino_t *ti;
-#if !defined(_WIN32) || defined(__CYGWIN__)
- int i;
-#else
- size_t plen;
-#endif
- char path[TAR_MAXPATHLEN];
-
-#ifdef DEBUG
- printf("==> tar_append_file(TAR=0x%lx (\"%s\"), realname=\"%s\", "
- "savename=\"%s\")\n", t, t->pathname, realname,
- (savename ? savename : "[NULL]"));
-#endif
-
-#if defined(_WIN32) && !defined(__CYGWIN__)
- strncpy(path, realname, sizeof(path)-1);
- path[sizeof(path)-1] = 0;
- plen = strlen(path);
- if (path[plen-1] == '/' )
- {
- path[plen-1] = 0;
- }
- if (stat(path, &s) != 0)
-#else
- if (lstat(realname, &s) != 0)
-#endif
- {
-#ifdef DEBUG
- perror("lstat()");
-#endif
- return -1;
- }
-
- /* set header block */
-#ifdef DEBUG
- puts(" tar_append_file(): setting header block...");
-#endif
- memset(&(t->th_buf), 0, sizeof(struct tar_header));
- th_set_from_stat(t, &s);
-
- /* set the header path */
-#ifdef DEBUG
- puts(" tar_append_file(): setting header path...");
-#endif
- th_set_path(t, (savename ? savename : realname));
-
- /* check if it's a hardlink */
-#ifdef DEBUG
- puts(" tar_append_file(): checking inode cache for hardlink...");
-#endif
- libtar_hashptr_reset(&hp);
- if (libtar_hash_getkey(t->h, &hp, &(s.st_dev),
- (libtar_matchfunc_t)dev_match) != 0)
- td = (tar_dev_t *)libtar_hashptr_data(&hp);
- else
- {
-#ifdef DEBUG
- printf("+++ adding hash for device (0x%lx, 0x%lx)...\n",
- major(s.st_dev), minor(s.st_dev));
-#endif
- td = (tar_dev_t *)calloc(1, sizeof(tar_dev_t));
- td->td_dev = s.st_dev;
- td->td_h = libtar_hash_new(256, (libtar_hashfunc_t)ino_hash);
- if (td->td_h == NULL)
- return -1;
- if (libtar_hash_add(t->h, td) == -1)
- return -1;
- }
- libtar_hashptr_reset(&hp);
-#if !defined(_WIN32) || defined(__CYGWIN__)
- if (libtar_hash_getkey(td->td_h, &hp, &(s.st_ino),
- (libtar_matchfunc_t)ino_match) != 0)
- {
- ti = (tar_ino_t *)libtar_hashptr_data(&hp);
-#ifdef DEBUG
- printf(" tar_append_file(): encoding hard link \"%s\" "
- "to \"%s\"...\n", realname, ti->ti_name);
-#endif
- t->th_buf.typeflag = LNKTYPE;
- th_set_link(t, ti->ti_name);
- }
- else
-#endif
- {
-#ifdef DEBUG
- printf("+++ adding entry: device (0x%lx,0x%lx), inode %ld "
- "(\"%s\")...\n", major(s.st_dev), minor(s.st_dev),
- s.st_ino, realname);
-#endif
- ti = (tar_ino_t *)calloc(1, sizeof(tar_ino_t));
- if (ti == NULL)
- return -1;
- ti->ti_ino = s.st_ino;
- snprintf(ti->ti_name, sizeof(ti->ti_name), "%s",
- savename ? savename : realname);
- libtar_hash_add(td->td_h, ti);
- }
-
-#if !defined(_WIN32) || defined(__CYGWIN__)
- /* check if it's a symlink */
- if (TH_ISSYM(t))
- {
-#if defined(_WIN32) && !defined(__CYGWIN__)
- i = -1;
-#else
- i = readlink(realname, path, sizeof(path));
-#endif
- if (i == -1)
- return -1;
- if (i >= TAR_MAXPATHLEN)
- i = TAR_MAXPATHLEN - 1;
- path[i] = '\0';
-#ifdef DEBUG
- printf(" tar_append_file(): encoding symlink \"%s\" -> "
- "\"%s\"...\n", realname, path);
-#endif
- th_set_link(t, path);
- }
-#endif
-
- /* print file info */
- if (t->options & TAR_VERBOSE)
- th_print_long_ls(t);
-
-#ifdef DEBUG
- puts(" tar_append_file(): writing header");
-#endif
- /* write header */
- if (th_write(t) != 0)
- {
-#ifdef DEBUG
- printf("t->fd = %d\n", t->fd);
-#endif
- return -1;
- }
-#ifdef DEBUG
- puts(" tar_append_file(): back from th_write()");
-#endif
-
- /* if it's a regular file, write the contents as well */
- if (TH_ISREG(t) && tar_append_regfile(t, realname) != 0)
- return -1;
-
- return 0;
-}
-
-
-/* write EOF indicator */
-int
-tar_append_eof(TAR *t)
-{
- ssize_t i, j;
- char block[T_BLOCKSIZE];
-
- memset(&block, 0, T_BLOCKSIZE);
- for (j = 0; j < 2; j++)
- {
- i = tar_block_write(t, &block);
- if (i != T_BLOCKSIZE)
- {
- if (i != -1)
- errno = EINVAL;
- return -1;
- }
- }
-
- return 0;
-}
-
-
-/* add file contents to a tarchive */
-int
-tar_append_regfile(TAR *t, char *realname)
-{
- char block[T_BLOCKSIZE];
- int filefd;
- ssize_t i, j;
- size_t size;
-
-#if defined( _WIN32 ) || defined(__CYGWIN__)
- filefd = open(realname, O_RDONLY | O_BINARY);
-#else
- filefd = open(realname, O_RDONLY);
-#endif
- if (filefd == -1)
- {
-#ifdef DEBUG
- perror("open()");
-#endif
- return -1;
- }
-
- size = th_get_size(t);
- for (i = size; i > T_BLOCKSIZE; i -= T_BLOCKSIZE)
- {
- j = read(filefd, &block, T_BLOCKSIZE);
- if (j != T_BLOCKSIZE)
- {
- if (j != -1)
- {
- fprintf(stderr, "Unexpected size of read data: %d <> %d for file: %s\n",
- (int)j, T_BLOCKSIZE, realname);
- errno = EINVAL;
- }
- return -1;
- }
- if (tar_block_write(t, &block) == -1)
- return -1;
- }
-
- if (i > 0)
- {
- j = (size_t)read(filefd, &block, (unsigned int)i);
- if (j == -1)
- return -1;
- memset(&(block[i]), 0, T_BLOCKSIZE - i);
- if (tar_block_write(t, &block) == -1)
- return -1;
- }
-
- close(filefd);
-
- return 0;
-}
-
-