Support 21-bit minor numbers. Avoid wasting a byte in their octal

representation by generating the same format as tar-1.13 (use a single
space as the terminator for 7-digit octal numbers).  This is POSIX.1
conformant (2-byte terminators are just a bug or historical wart in
old versions of gnu tar).  All devices created by `MAKEDEV all' except
rsa0.ctl can now be handled by tar(1).
This commit is contained in:
bde 1999-08-11 08:03:39 +00:00
parent 19794c937f
commit e89dba8766

View File

@ -873,6 +873,8 @@ dump_file (p, curdev, toplevel)
#if defined(S_IFBLK) || defined(S_IFCHR)
if (type != LF_FIFO)
{
char minorbuf[8 + 1];
if (checked_to_oct ((long) major (hstat.st_rdev), 8,
header->header.devmajor))
{
@ -880,13 +882,24 @@ dump_file (p, curdev, toplevel)
critical_error = 1;
goto badfile;
}
if (checked_to_oct ((long) minor (hstat.st_rdev), 8,
header->header.devminor))
/*
* Try harder than usual to fit the minor number. to_oct() wastes
* one byte by adding 2 terminating bytes (a space and a NUL) where
* only 1 (either a space or a NUL) is required by POSIX.1. We
* will discard the NUL if that is necessary and sufficient for the
* minor number to fit. This is compatible with tar-1.13.
*/
if (checked_to_oct ((long) minor (hstat.st_rdev), 8 + 1, minorbuf))
{
msg ("%s: minor number too large; not dumped", p);
critical_error = 1;
goto badfile;
}
if (minorbuf[0] == ' ')
bcopy(minorbuf + 1, header->header.devminor, 8);
else
bcopy(minorbuf, header->header.devminor, 8);
}
#endif