/* symlink */ int tar_extract_symlink(TAR *t, char *realname) { char *filename; if (!TH_ISSYM(t)) { errno = EINVAL; return -1; } filename = (realname ? realname : th_get_pathname(t)); if (mkdirhier(dirname(filename)) == -1) return -1; if (unlink(filename) == -1 && errno != ENOENT) return -1; #ifdef DEBUG printf(" ==> extracting: %s (symlink to %s)\n", filename, th_get_linkname(t)); #endif if (symlink(th_get_linkname(t), filename) == -1) { #ifdef DEBUG perror("symlink()"); #endif return -1; } return 0; }
/* hardlink */ int tar_extract_hardlink(TAR * t, char *realname, char *prefix) { char *filename; char *linktgt = NULL; char *lnp; libtar_hashptr_t hp; if (!TH_ISLNK(t)) { errno = EINVAL; return -1; } filename = (realname ? realname : th_get_pathname(t)); if (mkdirhier(dirname(filename)) == -1) return -1; libtar_hashptr_reset(&hp); if (libtar_hash_getkey(t->h, &hp, th_get_linkname(t), (libtar_matchfunc_t)libtar_str_match) != 0) { lnp = (char *)libtar_hashptr_data(&hp); linktgt = &lnp[strlen(lnp) + 1]; } 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 if (link(linktgt, filename) == -1) { #ifdef DEBUG perror("link()"); #endif printf("Failed restore of hardlink '%s' but returning as if nothing bad happened anyway\n", filename); return 0; // Used to be -1 } return 0; }
/* hardlink */ int tar_extract_hardlink(TAR * t, char *realname) { char *filename; char *linktgt = NULL; char *lnp; libtar_hashptr_t hp; if (!TH_ISLNK(t)) { errno = EINVAL; return -1; } filename = (realname ? realname : th_get_pathname(t)); if (mkdirhier(dirname(filename)) == -1) return -1; libtar_hashptr_reset(&hp); if (libtar_hash_getkey(t->h, &hp, th_get_linkname(t), (libtar_matchfunc_t)libtar_str_match) != 0) { lnp = (char *)libtar_hashptr_data(&hp); linktgt = &lnp[strlen(lnp) + 1]; } else linktgt = th_get_linkname(t); #ifdef DEBUG printf(" ==> extracting: %s (link to %s)\n", filename, linktgt); #endif if (link(linktgt, filename) == -1) { #ifdef DEBUG perror("link()"); #endif return -1; } return 0; }