/* mangle.c -- encode long filenames
Copyright (C) 1988, 1992 Free Software Foundation
This file is part of GNU Tar.
GNU Tar is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
GNU Tar is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Tar; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
extern PTR
init_buffer ();
extern char *quote_copy_string ();
extern char *get_buffer ();
char *un_quote_string ();
extern union record
*start_header ();
extern struct stat hstat
; /* Stat struct corresponding */
/* Should use a hash table, etc. . */
struct mangled
*first_mangle
;
#if 0 /* Deleted because there is now a better way to do all this */
for (munge
= first_mangle
; munge
; munge
= munge
->next
)
if (!strcmp (name
, munge
->normal
))
add_symlink_mangle (symlink
, linkto
, buffer
)
struct mangled
*munge
, *kludge
;
munge
= (struct mangled
*) ck_malloc (sizeof (struct mangled
) + strlen (symlink
) + strlen (linkto
) + 2);
for (kludge
= first_mangle
; kludge
->next
; kludge
= kludge
->next
)
strcpy (munge
->normal
, symlink
);
munge
->linked_to
= munge
->normal
+ strlen (symlink
) + 1;
strcpy (munge
->linked_to
, linkto
);
sprintf (munge
->mangled
, "@@MaNgLeD.%d", mangled_num
++);
strncpy (buffer
, munge
->mangled
, NAMSIZ
);
add_mangle (name
, buffer
)
struct mangled
*munge
, *kludge
;
munge
= (struct mangled
*) ck_malloc (sizeof (struct mangled
) + strlen (name
));
for (kludge
= first_mangle
; kludge
->next
; kludge
= kludge
->next
)
strcpy (munge
->normal
, name
);
sprintf (munge
->mangled
, "@@MaNgLeD.%d", mangled_num
++);
strncpy (buffer
, munge
->mangled
, NAMSIZ
);
the_buffer
= init_buffer ();
for (munge
= first_mangle
, size
= 0; munge
; munge
= munge
->next
)
ptr1
= quote_copy_string (munge
->normal
);
add_buffer (the_buffer
, "Symlink ", 8);
add_buffer (the_buffer
, ptr1
, strlen (ptr1
));
add_buffer (the_buffer
, " to ", 4);
if (ptr2
= quote_copy_string (munge
->linked_to
))
add_buffer (the_buffer
, ptr2
, strlen (ptr2
));
add_buffer (the_buffer
, munge
->linked_to
, strlen (munge
->linked_to
));
add_buffer (the_buffer
, "Rename ", 7);
add_buffer (the_buffer
, munge
->mangled
, strlen (munge
->mangled
));
add_buffer (the_buffer
, " to ", 4);
add_buffer (the_buffer
, ptr1
, strlen (ptr1
));
add_buffer (the_buffer
, "\n", 1);
if (ptr1
!= munge
->normal
)
bzero (&hstat
, sizeof (struct stat
));
hstat
.st_atime
= hstat
.st_mtime
= hstat
.st_ctime
= time (0);
ptr1
= get_buffer (the_buffer
);
hstat
.st_size
= strlen (ptr1
);
header
= start_header ("././@MaNgLeD_NaMeS", &hstat
);
header
->header
.linkflag
= LF_NAMES
;
bufsize
= endofrecs ()->charptr
- header
->charptr
;
bcopy (ptr1
, header
->charptr
, bufsize
);
userec (header
+ (bufsize
- 1) / RECORDSIZE
);
bufsize
= endofrecs ()->charptr
- header
->charptr
;
bcopy (ptr1
, header
->charptr
, size
);
bzero (header
->charptr
+ size
, bufsize
- size
);
userec (header
+ (size
- 1) / RECORDSIZE
);
buf
= to
= ck_malloc (size
+ 1);
fromtape
= findrec ()->charptr
;
msg ("Unexpected EOF in mangled names!");
copied
= endofrecs ()->charptr
- fromtape
;
bcopy (fromtape
, to
, copied
);
userec ((union record
*) (fromtape
+ copied
- 1));
for (ptr
= buf
; *ptr
; ptr
= ptrend
)
ptrend
= index (ptr
, '\n');
if (!strncmp (ptr
, "Rename ", 7))
nam1end
= index (nam1
, ' ');
while (strncmp (nam1end
, " to ", 4))
nam1end
= index (nam1end
, ' ');
un_quote_string (nam1end
+ 4);
if (rename (nam1
, nam1end
+ 4))
msg_perror ("Can't rename %s to %s", nam1
, nam1end
+ 4);
msg ("Renamed %s to %s", nam1
, nam1end
+ 4);
else if (!strncmp (ptr
, "Symlink ", 8))
nam1end
= index (nam1
, ' ');
while (strncmp (nam1end
, " to ", 4))
nam1end
= index (nam1end
, ' ');
un_quote_string (nam1end
+ 4);
if (symlink (nam1
, nam1end
+ 4) && (unlink (nam1end
+ 4) || symlink (nam1
, nam1end
+ 4)))
msg_perror ("Can't symlink %s to %s", nam1
, nam1end
+ 4);
msg ("Symlinkd %s to %s", nam1
, nam1end
+ 4);
msg ("Unknown demangling command %s", ptr
);