From ee6632c3e184eb9ee28c4acf2e3bb1ca37a10c16 Mon Sep 17 00:00:00 2001 From: Dees_Troy Date: Wed, 27 Feb 2013 18:07:32 +0000 Subject: libtar - Fix extraction of hardlinks to use the prefix Change-Id: I116982ceed722364406b99fb08bc6943afa0390a --- libtar/extract.c | 9 +++++---- libtar/libtar.h | 4 ++-- libtar/wrapper.c | 4 ++-- 3 files changed, 9 insertions(+), 8 deletions(-) (limited to 'libtar') diff --git a/libtar/extract.c b/libtar/extract.c index 8860e5047..620513c29 100644 --- a/libtar/extract.c +++ b/libtar/extract.c @@ -89,7 +89,7 @@ tar_set_file_perms(TAR *t, char *realname) /* switchboard */ int -tar_extract_file(TAR *t, char *realname) +tar_extract_file(TAR *t, char *realname, char *prefix) { int i; char *lnp; @@ -115,7 +115,7 @@ tar_extract_file(TAR *t, char *realname) } else if (TH_ISLNK(t)) { printf("link\n"); - i = tar_extract_hardlink(t, realname); + i = tar_extract_hardlink(t, realname, prefix); } else if (TH_ISSYM(t)) { printf("sym\n"); @@ -300,7 +300,7 @@ tar_skip_regfile(TAR *t) /* hardlink */ int -tar_extract_hardlink(TAR * t, char *realname) +tar_extract_hardlink(TAR * t, char *realname, char *prefix) { char *filename; char *linktgt = NULL; @@ -325,7 +325,8 @@ tar_extract_hardlink(TAR * t, char *realname) } else linktgt = th_get_linkname(t); - + char *newtgt = strdup(linktgt); + sprintf(linktgt, "%s/%s", prefix, newtgt); #ifdef DEBUG printf(" ==> extracting: %s (link to %s)\n", filename, linktgt); #endif diff --git a/libtar/libtar.h b/libtar/libtar.h index 7a8f332ee..f2f423b9b 100644 --- a/libtar/libtar.h +++ b/libtar/libtar.h @@ -218,11 +218,11 @@ void th_finish(TAR *t); /***** extract.c ***********************************************************/ /* sequentially extract next file from t */ -int tar_extract_file(TAR *t, char *realname); +int tar_extract_file(TAR *t, char *realname, char *prefix); /* extract different file types */ int tar_extract_dir(TAR *t, char *realname); -int tar_extract_hardlink(TAR *t, char *realname); +int tar_extract_hardlink(TAR *t, char *realname, char *prefix); int tar_extract_symlink(TAR *t, char *realname); int tar_extract_chardev(TAR *t, char *realname); int tar_extract_blockdev(TAR *t, char *realname); diff --git a/libtar/wrapper.c b/libtar/wrapper.c index 7cd8ed12c..4d8216241 100644 --- a/libtar/wrapper.c +++ b/libtar/wrapper.c @@ -44,7 +44,7 @@ tar_extract_glob(TAR *t, char *globname, char *prefix) snprintf(buf, sizeof(buf), "%s/%s", prefix, filename); else strlcpy(buf, filename, sizeof(buf)); - if (tar_extract_file(t, filename) != 0) + if (tar_extract_file(t, filename, prefix) != 0) return -1; } @@ -86,7 +86,7 @@ tar_extract_all(TAR *t, char *prefix) continue; } */ - if (tar_extract_file(t, buf) != 0) + if (tar_extract_file(t, buf, prefix) != 0) return -1; } return (i == 1 ? 0 : -1); -- cgit v1.2.3