mirror of
https://git.savannah.gnu.org/git/tar.git
synced 2026-04-20 16:40:39 +00:00
numeric-owner: print big UID/GID correctly
* src/list.c (simple_print_header): Do not parse ustar header for UID/GID again (tar_stat_info has already been correctly filled with respect to possible uid/gid extended headers). * tests/numeric.at: New testcase for --numeric-owner option. * tests/Makefile.am: Add new testcase. * tests/testsuite.at: Likewise.
This commit is contained in:
committed by
Sergey Poznyakoff
parent
b684326e69
commit
68e9ab4966
28
src/list.c
28
src/list.c
@@ -1,6 +1,6 @@
|
||||
/* List a tar archive, with support routines for reading a tar archive.
|
||||
|
||||
Copyright 1988, 1992-1994, 1996-2001, 2003-2007, 2010, 2012-2014 Free
|
||||
Copyright 1988, 1992-1994, 1996-2001, 2003-2007, 2010, 2012-2015 Free
|
||||
Software Foundation, Inc.
|
||||
|
||||
This file is part of GNU tar.
|
||||
@@ -1219,18 +1219,7 @@ simple_print_header (struct tar_stat_info *st, union block *blk,
|
||||
&& !numeric_owner_option)
|
||||
user = st->uname;
|
||||
else
|
||||
{
|
||||
/* Try parsing it as an unsigned integer first, and as a
|
||||
uid_t if that fails. This method can list positive user
|
||||
ids that are too large to fit in a uid_t. */
|
||||
uintmax_t u = from_header (blk->header.uid,
|
||||
sizeof blk->header.uid, 0,
|
||||
0, UINTMAX_MAX,
|
||||
false, false);
|
||||
user = (u != -1
|
||||
? STRINGIFY_BIGINT (u, uform)
|
||||
: imaxtostr (UID_FROM_HEADER (blk->header.uid), uform));
|
||||
}
|
||||
user = STRINGIFY_BIGINT (st->stat.st_uid, uform);
|
||||
|
||||
if (st->gname
|
||||
&& st->gname[0]
|
||||
@@ -1238,18 +1227,7 @@ simple_print_header (struct tar_stat_info *st, union block *blk,
|
||||
&& !numeric_owner_option)
|
||||
group = st->gname;
|
||||
else
|
||||
{
|
||||
/* Try parsing it as an unsigned integer first, and as a
|
||||
gid_t if that fails. This method can list positive group
|
||||
ids that are too large to fit in a gid_t. */
|
||||
uintmax_t g = from_header (blk->header.gid,
|
||||
sizeof blk->header.gid, 0,
|
||||
0, UINTMAX_MAX,
|
||||
false, false);
|
||||
group = (g != -1
|
||||
? STRINGIFY_BIGINT (g, gform)
|
||||
: imaxtostr (GID_FROM_HEADER (blk->header.gid), gform));
|
||||
}
|
||||
group = STRINGIFY_BIGINT (st->stat.st_gid, gform);
|
||||
|
||||
/* Format the file size or major/minor device numbers. */
|
||||
|
||||
|
||||
@@ -151,6 +151,7 @@ TESTSUITE_AT = \
|
||||
multiv06.at\
|
||||
multiv07.at\
|
||||
multiv08.at\
|
||||
numeric.at\
|
||||
old.at\
|
||||
onetop01.at\
|
||||
onetop02.at\
|
||||
|
||||
74
tests/numeric.at
Normal file
74
tests/numeric.at
Normal file
@@ -0,0 +1,74 @@
|
||||
# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
||||
# Test suite for GNU tar.
|
||||
# Copyright 2015 Free Software Foundation, Inc.
|
||||
#
|
||||
# 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 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
AT_SETUP([--numeric-owner basic tests])
|
||||
AT_KEYWORDS([options numeric numeric-owner])
|
||||
|
||||
m4_pushdef([TESTOP],[
|
||||
decho $1
|
||||
tar $1 -vvf a dir --numeric-owner |dnl
|
||||
awk -vowner=$MYUID/$MYGID '@S|@2==owner {print "OK"; next} {print}'
|
||||
tar $1 -vvf a dir |dnl
|
||||
awk -vowner=$MYUSR/$MYGRP '@S|@2==owner {print "OK"; next} {print}'
|
||||
])
|
||||
|
||||
AT_TAR_CHECK([
|
||||
mkdir dir
|
||||
genfile --file dir/file
|
||||
|
||||
MYUID=$(id -u) || AT_SKIP_TEST
|
||||
MYGID=$(id -g) || AT_SKIP_TEST
|
||||
MYUSR=$(id -un) || AT_SKIP_TEST
|
||||
MYGRP=$(id -gn) || AT_SKIP_TEST
|
||||
|
||||
TESTOP([--create])
|
||||
TESTOP([--list])
|
||||
TESTOP([--diff])
|
||||
TESTOP([--extract])
|
||||
],
|
||||
[0],
|
||||
[--create
|
||||
OK
|
||||
OK
|
||||
OK
|
||||
OK
|
||||
--list
|
||||
OK
|
||||
OK
|
||||
OK
|
||||
OK
|
||||
--diff
|
||||
OK
|
||||
OK
|
||||
OK
|
||||
OK
|
||||
--extract
|
||||
OK
|
||||
OK
|
||||
OK
|
||||
OK
|
||||
],
|
||||
[--create
|
||||
--list
|
||||
--diff
|
||||
--extract
|
||||
],[],[],[posix,gnu,ustar,oldgnu])
|
||||
|
||||
AT_CLEANUP
|
||||
|
||||
m4_popdef([TESTOP])
|
||||
|
||||
@@ -230,6 +230,7 @@ m4_include([recurse.at])
|
||||
m4_include([recurs02.at])
|
||||
m4_include([shortrec.at])
|
||||
m4_include([iotty.at])
|
||||
m4_include([numeric.at])
|
||||
|
||||
AT_BANNER([The --same-order option])
|
||||
m4_include([same-order01.at])
|
||||
@@ -456,3 +457,4 @@ m4_include([star/ustar-big-2g.at])
|
||||
m4_include([star/ustar-big-8g.at])
|
||||
|
||||
m4_include([star/pax-big-10g.at])
|
||||
|
||||
|
||||
Reference in New Issue
Block a user