X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fcreate.c;h=384e7a34e2594856aff3d3430cc33cc93bde53e1;hb=a46f0b8341353855df8076f1d603ef6cdd92bee8;hp=ed9f172719e2ef86cf744befb2475ed3e15597f0;hpb=1f568c6aa2335c95bd99413912dfa4a0689c6ca9;p=chaz%2Ftar diff --git a/src/create.c b/src/create.c index ed9f172..384e7a3 100644 --- a/src/create.c +++ b/src/create.c @@ -91,8 +91,6 @@ extern struct name *gnu_list_name; extern void print_header(); union record *start_header(); -void add_mangle(); -void add_symlink_mangle(); void blank_name_list(); int check_exclude(); PTR ck_malloc(); @@ -115,7 +113,6 @@ void to_oct(); void dump_file(); void write_dir_file(); void write_eot(); -void write_mangled(); int zero_record(); /* This code moved from tar.h since create.c is the only file that cares @@ -182,7 +179,6 @@ create_archive() while (p = name_next(1)); } - write_mangled(); write_eot(); close_archive(); if(f_gnudump) @@ -239,7 +235,7 @@ badfile: } restore_times[0] = hstat.st_atime; - restore_times[1] = hstat.st_utime; + restore_times[1] = hstat.st_mtime; #ifdef S_ISHIDDEN if (S_ISHIDDEN (hstat.st_mode)) { @@ -303,13 +299,6 @@ badfile: char *link_name = lp->name; /* We found a link. */ - hstat.st_size = 0; - header = start_header(p, &hstat); - if (header == NULL) - { - critical_error = 1; - goto badfile; - } while(!f_absolute_paths && *link_name == '/') { static int link_warn = 0; @@ -319,16 +308,22 @@ badfile: } link_name++; } + if (link_name - lp->name >= NAMSIZ) + write_long (link_name, LF_LONGLINK); + + hstat.st_size = 0; + header = start_header(p, &hstat); + if (header == NULL) + { + critical_error = 1; + goto badfile; + } strncpy(header->header.linkname, link_name,NAMSIZ); - if(header->header.linkname[NAMSIZ-1]) { - char *mangled; - extern char *find_mangled(); - mangled=find_mangled(link_name); - msg("%s: link name too long: mangled to %s",link_name,mangled); - strncpy(header->header.linkname,mangled,NAMSIZ); - } + /* Force null truncated */ + header->header.linkname [NAMSIZ-1] = 0; + header->header.linkflag = LF_LINK; finish_header(header); /* FIXME: Maybe remove from list after all links found? */ @@ -607,7 +602,18 @@ badfile: else if(S_ISLNK(hstat.st_mode)) { int size; - + char *buf = alloca (PATH_MAX + 1); + + size = readlink (p, buf, PATH_MAX + 1); + if (size < 0) + goto badperror; + buf[size] = '\0'; + if (size >= NAMSIZ) + write_long (buf, LF_LONGLINK); + + buf[NAMSIZ - 1] = '\0'; + if (size >= NAMSIZ) + size = NAMSIZ - 1; hstat.st_size = 0; /* Force 0 size on symlink */ header = start_header(p, &hstat); if (header == NULL) @@ -615,19 +621,7 @@ badfile: critical_error = 1; goto badfile; } - size = readlink(p, header->header.linkname, NAMSIZ); - if (size < 0) goto badperror; - if (size == NAMSIZ) { - char *buf = ck_malloc(PATH_MAX); - - readlink(p,buf,PATH_MAX); - /* next_mangle(header->header.linkname); */ - add_symlink_mangle(buf,p,header->header.linkname); - msg("symbolic link %s too long: mangling to %s",p, header->header.linkname); - /* size=strlen(header->header.linkname); */ - free(buf); - } else - header->header.linkname[size] = '\0'; + strcpy (header->header.linkname, buf); header->header.linkflag = LF_SYMLINK; finish_header(header); /* Nothing more to do to it */ if (f_remove_files) @@ -1181,6 +1175,9 @@ start_header(name, st) { register union record *header; + if (strlen (name) >= NAMSIZ) + write_long (name, LF_LONGNAME); + header = (union record *) findrec(); bzero(header->charptr, sizeof(*header)); /* XXX speed up */ @@ -1203,13 +1200,7 @@ start_header(name, st) } } strncpy(header->header.name, name, NAMSIZ); - if (header->header.name[NAMSIZ-1]) { -/* char *mangled;*/ - - /* next_mangle(header->header.name); */ - add_mangle(name,header->header.name); - msg("%s: is too long: mangling to %s", name, header->header.name); - } + header->header.name[NAMSIZ-1] = '\0'; to_oct((long) (st->st_mode & 07777), 8, header->header.mode); @@ -1344,3 +1335,37 @@ write_eot() userec(p); } } + +/* Write a LF_LONGLINK or LF_LONGNAME record. */ +write_long (p, type) + char *p; + char type; +{ + int size = strlen (p) + 1; + int bufsize; + union record *header; + + /* Link name won't fit, so we write + an LF_LONGLINK record. */ + hstat.st_size = size; + header = start_header ("././@LongLink", &hstat); + header->header.linkflag = type; + finish_header (header); + + header = findrec (); + + bufsize = endofrecs ()->charptr - header->charptr; + + while (bufsize < size) + { + bcopy (p, header->charptr, bufsize); + p += bufsize; + size -= bufsize; + userec (header + (bufsize - 1)/RECORDSIZE); + header = findrec (); + bufsize = endofrecs ()->charptr - header->charptr; + } + bcopy (p, header->charptr, size); + bzero (header->charptr + size, bufsize - size); + userec (header + (size - 1)/RECORDSIZE); +}