/* List a tar archive, with support routines for reading a tar archive.
- Copyright (C) 1988, 92, 93, 94, 96, 97 Free Software Foundation, Inc.
+ Copyright 1988,92,93,94,96,97,98,1999 Free Software Foundation, Inc.
Written by John Gilmore, on 1985-08-26.
This program is free software; you can redistribute it and/or modify it
}
else
{
- assign_string (¤t_file_name,
- (next_long_name ? next_long_name
- : current_header->header.name));
+ char *name = next_long_name;
+ struct posix_header *h = ¤t_header->header;
+ char namebuf[sizeof h->prefix + 1 + sizeof h->name + 1];
+
+ if (! name)
+ {
+ /* Accept file names as specified by POSIX.1-1996
+ section 10.1.1. */
+ char *np = namebuf;
+ if (h->prefix[0])
+ {
+ memcpy (np, h->prefix, sizeof h->prefix);
+ np[sizeof h->prefix] = '\0';
+ np += strlen (np);
+ *np++ = '/';
+ }
+ memcpy (np, h->name, sizeof h->name);
+ np[sizeof h->name] = '\0';
+ name = namebuf;
+ }
+
+ assign_string (¤t_file_name, name);
assign_string (¤t_link_name,
(next_long_link ? next_long_link
: current_header->header.linkname));
gid_t
gid_from_oct (const char *p, size_t s)
{
- return from_oct (p, s, "gid_t", GID_MAX);
+ return from_oct (p, s, "gid_t", (uintmax_t) GID_MAX);
}
major_t
major_from_oct (const char *p, size_t s)
{
- return from_oct (p, s, "major_t", MAJOR_MAX);
+ return from_oct (p, s, "major_t", (uintmax_t) MAJOR_MAX);
}
minor_t
minor_from_oct (const char *p, size_t s)
{
- return from_oct (p, s, "minor_t", MINOR_MAX);
+ return from_oct (p, s, "minor_t", (uintmax_t) MINOR_MAX);
}
mode_t
mode_from_oct (const char *p, size_t s)
{
- return from_oct (p, s, "mode_t", MODE_MAX);
+ return from_oct (p, s, "mode_t", (uintmax_t) MODE_MAX);
}
off_t
off_from_oct (const char *p, size_t s)
{
- return from_oct (p, s, "off_t", OFF_MAX);
+ return from_oct (p, s, "off_t", (uintmax_t) OFF_MAX);
}
size_t
size_from_oct (const char *p, size_t s)
{
- return from_oct (p, s, "size_t", SIZE_MAX);
+ return from_oct (p, s, "size_t", (uintmax_t) SIZE_MAX);
}
time_t
time_from_oct (const char *p, size_t s)
{
- return from_oct (p, s, "time_t", TIME_MAX);
+ return from_oct (p, s, "time_t", (uintmax_t) TIME_MAX);
}
uid_t
uid_from_oct (const char *p, size_t s)
{
- return from_oct (p, s, "uid_t", UID_MAX);
+ return from_oct (p, s, "uid_t", (uintmax_t) UID_MAX);
}
uintmax_t
uintmax_from_oct (const char *p, size_t s)