X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fcreate.c;h=cea58c1f7b32ddd7c1004451687d89b6f4b2555d;hb=083205ad13a86ee50983f1faf3fbefd3efe99453;hp=d3c54db5ad3f086ddfc483218dc6b63208cae049;hpb=96e5cf3bbe8c4cc56904034b3d95b9d2e1ce3850;p=chaz%2Ftar diff --git a/src/create.c b/src/create.c index d3c54db..cea58c1 100644 --- a/src/create.c +++ b/src/create.c @@ -49,6 +49,16 @@ extern int errno; #include #endif +#if defined (_POSIX_VERSION) +#include +#else +struct utimbuf +{ + long actime; + long modtime; +}; +#endif + #if defined(_POSIX_VERSION) || defined(DIRENT) #include #ifdef direct @@ -206,7 +216,7 @@ dump_file (p, curdev, toplevel) char save_linkflag; extern time_t new_time; int critical_error = 0; - time_t restore_times[2]; + struct utimbuf restore_times; /* int sparse_ind = 0;*/ @@ -234,8 +244,8 @@ badfile: return; } - restore_times[0] = hstat.st_atime; - restore_times[1] = hstat.st_mtime; + restore_times.actime = hstat.st_atime; + restore_times.modtime = hstat.st_mtime; #ifdef S_ISHIDDEN if (S_ISHIDDEN (hstat.st_mode)) { @@ -310,6 +320,7 @@ badfile: } if (link_name - lp->name >= NAMSIZ) write_long (link_name, LF_LONGLINK); + current_link_name = link_name; hstat.st_size = 0; header = start_header(p, &hstat); @@ -574,7 +585,7 @@ badfile: msg_perror ("cannot remove %s", p); } if (f_atime_preserve) - utime (p, restore_times); + utime (p, &restore_times); return; /* @@ -594,7 +605,7 @@ badfile: if(f>=0) (void)close(f); if (f_atime_preserve) - utime (p, restore_times); + utime (p, &restore_times); return; } @@ -610,10 +621,8 @@ badfile: buf[size] = '\0'; if (size >= NAMSIZ) write_long (buf, LF_LONGLINK); + current_link_name = buf; - 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) @@ -621,7 +630,8 @@ badfile: critical_error = 1; goto badfile; } - strcpy (header->header.arch_linkname, buf); + strncpy (header->header.arch_linkname, buf, NAMSIZ); + header->header.arch_linkname[NAMSIZ - 1] = '\0'; header->header.linkflag = LF_SYMLINK; finish_header(header); /* Nothing more to do to it */ if (f_remove_files) @@ -727,7 +737,7 @@ badfile: if(f_multivol) save_name = 0; if (f_atime_preserve) - utime (p, restore_times); + utime (p, &restore_times); return; } @@ -786,7 +796,7 @@ badfile: closedir(dirp); free(namebuf); if (f_atime_preserve) - utime (p, restore_times); + utime (p, &restore_times); return; } @@ -1199,6 +1209,7 @@ start_header(name, st) msg("Removing leading / from absolute path names in the archive."); } } + current_file_name = name; strncpy(header->header.arch_name, name, NAMSIZ); header->header.arch_name[NAMSIZ-1] = '\0'; @@ -1344,11 +1355,13 @@ write_long (p, type) int size = strlen (p) + 1; int bufsize; union record *header; + struct stat foo; - /* Link name won't fit, so we write - an LF_LONGLINK record. */ - hstat.st_size = size; - header = start_header ("././@LongLink", &hstat); + + bzero (&foo, sizeof foo); + foo.st_size = size; + + header = start_header ("././@LongLink", &foo); header->header.linkflag = type; finish_header (header);