]> Dogcows Code - chaz/tar/blobdiff - src/create.c
*** empty log message ***
[chaz/tar] / src / create.c
index 1b25750ca56b8908ac8d1b2aa878f1974a0a598f..cea58c1f7b32ddd7c1004451687d89b6f4b2555d 100644 (file)
@@ -49,6 +49,16 @@ extern int   errno;
 #include <grp.h>
 #endif
 
+#if defined (_POSIX_VERSION)
+#include <utime.h>
+#else
+struct utimbuf
+{
+  long actime;
+  long modtime;
+};
+#endif
+
 #if defined(_POSIX_VERSION) || defined(DIRENT)
 #include <dirent.h>
 #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_utime;
+       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);
@@ -318,11 +329,11 @@ badfile:
                                    critical_error = 1;
                                    goto badfile;
                                  }
-                               strncpy(header->header.linkname,
+                               strncpy(header->header.arch_linkname,
                                        link_name,NAMSIZ);
 
                                /* Force null truncated */
-                               header->header.linkname [NAMSIZ-1] = 0;
+                               header->header.arch_linkname [NAMSIZ-1] = 0;
 
                                header->header.linkflag = LF_LINK;
                                finish_header(header);
@@ -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.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,8 +1209,9 @@ start_header(name, st)
                                msg("Removing leading / from absolute path names in the archive.");
                }
        }
-       strncpy(header->header.name, name, NAMSIZ);
-       header->header.name[NAMSIZE-1] = '\0';
+       current_file_name = name;
+       strncpy(header->header.arch_name, name, NAMSIZ);
+       header->header.arch_name[NAMSIZ-1] = '\0';
 
        to_oct((long) (st->st_mode & 07777),
                                        8,  header->header.mode);
@@ -1337,7 +1348,6 @@ write_eot()
 }
 
 /* Write a LF_LONGLINK or LF_LONGNAME record. */
-void
 write_long (p, type)
      char *p;
      char type;
@@ -1345,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);
 
This page took 0.023237 seconds and 4 git commands to generate.