/* Create a tar archive.
Copyright (C) 1985, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001,
- 2003 Free Software Foundation, Inc.
+ 2003, 2004 Free Software Foundation, Inc.
Written by John Gilmore, on 1985-08-25.
xheader_store ("path", st, NULL);
break;
- case V7_FORMAT:
+ case V7_FORMAT:
+ if (strlen (st->file_name) > NAME_FIELD_SIZE-1)
+ {
+ WARN ((0, 0, _("%s: file name is too long (max %d); not dumped"),
+ quotearg_colon (st->file_name),
+ NAME_FIELD_SIZE - 1));
+ return NULL;
+ }
+ break;
+
case USTAR_FORMAT:
case STAR_FORMAT:
return write_ustar_long_name (st->file_name);
write_extended (struct tar_stat_info *st, union block *old_header)
{
union block *header, hp;
- size_t size;
char *p;
if (extended_header.buffer || extended_header.stk == NULL)
static union block *
write_header_name (struct tar_stat_info *st)
{
- if (NAME_FIELD_SIZE < strlen (st->file_name))
+ if (archive_format == POSIX_FORMAT && !string_ascii_p (st->file_name))
+ {
+ xheader_store ("path", st, NULL);
+ return write_short_name (st);
+ }
+ else if (NAME_FIELD_SIZE < strlen (st->file_name))
return write_long_name (st);
else
return write_short_name (st);
xheader_store ("ctime", st, NULL);
}
else if (incremental_option)
- if (archive_format == OLDGNU_FORMAT)
+ if (archive_format == OLDGNU_FORMAT || archive_format == GNU_FORMAT)
{
TIME_TO_CHARS (st->stat.st_atime, header->oldgnu_header.atime);
TIME_TO_CHARS (st->stat.st_ctime, header->oldgnu_header.ctime);
gid_to_gname (st->stat.st_gid, &st->gname);
if (archive_format == POSIX_FORMAT
- && strlen (st->uname) > UNAME_FIELD_SIZE)
+ && (strlen (st->uname) > UNAME_FIELD_SIZE
+ || !string_ascii_p (st->uname)))
xheader_store ("uname", st, NULL);
else
UNAME_TO_CHARS (st->uname, header->header.uname);
if (archive_format == POSIX_FORMAT
- && strlen (st->gname) > GNAME_FIELD_SIZE)
+ && (strlen (st->gname) > GNAME_FIELD_SIZE
+ || !string_ascii_p (st->gname)))
xheader_store ("gname", st, NULL);
else
GNAME_TO_CHARS (st->gname, header->header.gname);
finish_header (struct tar_stat_info *st,
union block *header, off_t block_ordinal)
{
- size_t i;
- int sum;
- char *p;
-
/* Note: It is important to do this before the call to write_extended(),
so that the actual ustar header is printed */
if (verbose_option