]> Dogcows Code - chaz/tar/blobdiff - src/create.c
*** empty log message ***
[chaz/tar] / src / create.c
index ed9f172719e2ef86cf744befb2475ed3e15597f0..384e7a34e2594856aff3d3430cc33cc93bde53e1 100644 (file)
@@ -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);
+}
This page took 0.023853 seconds and 4 git commands to generate.