Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
d96d1015
Commit
d96d1015
authored
Jul 20, 2004
by
Neal Norwitz
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
SF #918101, allow files >= 8 GB using GNU extension
parent
a4f651a2
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
38 additions
and
11 deletions
+38
-11
Doc/lib/libtarfile.tex
Doc/lib/libtarfile.tex
+6
-5
Lib/tarfile.py
Lib/tarfile.py
+32
-6
No files found.
Doc/lib/libtarfile.tex
View file @
d96d1015
...
@@ -256,11 +256,12 @@ tar archive several times. Each archive member is represented by a
...
@@ -256,11 +256,12 @@ tar archive several times. Each archive member is represented by a
\begin{memberdesc}
{
posix
}
\begin{memberdesc}
{
posix
}
If true, create a
\POSIX
{}
1003.1-1990 compliant archive. GNU
If true, create a
\POSIX
{}
1003.1-1990 compliant archive. GNU
extensions are not used, because they are not part of the
\POSIX
{}
extensions are not used, because they are not part of the
\POSIX
{}
standard. This limits the length of filenames to at most 256 and
standard. This limits the length of filenames to at most 256,
link names to 100 characters. A
\exception
{
ValueError
}
is raised
link names to 100 characters and the maximum file size to 8
if a pathname exceeds this limit. If false, create a GNU tar
gigabytes. A
\exception
{
ValueError
}
is raised if a file exceeds
compatible archive. It will not be
\POSIX
{}
compliant, but can
this limit. If false, create a GNU tar compatible archive. It
store pathnames of unlimited length.
will not be
\POSIX
{}
compliant, but can store files without any
of the above restrictions.
\end{memberdesc}
\end{memberdesc}
\begin{memberdesc}
{
dereference
}
\begin{memberdesc}
{
dereference
}
...
...
Lib/tarfile.py
View file @
d96d1015
...
@@ -655,11 +655,21 @@ class TarInfo(object):
...
@@ -655,11 +655,21 @@ class TarInfo(object):
"""Construct a TarInfo object from a 512 byte string buffer.
"""Construct a TarInfo object from a 512 byte string buffer.
"""
"""
tarinfo
=
cls
()
tarinfo
=
cls
()
tarinfo
.
name
=
nts
(
buf
[
0
:
100
])
tarinfo
.
name
=
nts
(
buf
[
0
:
100
])
tarinfo
.
mode
=
int
(
buf
[
100
:
108
],
8
)
tarinfo
.
mode
=
int
(
buf
[
100
:
108
],
8
)
tarinfo
.
uid
=
int
(
buf
[
108
:
116
],
8
)
tarinfo
.
uid
=
int
(
buf
[
108
:
116
],
8
)
tarinfo
.
gid
=
int
(
buf
[
116
:
124
],
8
)
tarinfo
.
gid
=
int
(
buf
[
116
:
124
],
8
)
tarinfo
.
size
=
long
(
buf
[
124
:
136
],
8
)
# There are two possible codings for the size field we
# have to discriminate, see comment in tobuf() below.
if
buf
[
124
]
!=
chr
(
0200
):
tarinfo
.
size
=
long
(
buf
[
124
:
136
],
8
)
else
:
tarinfo
.
size
=
0L
for
i
in
range
(
11
):
tarinfo
.
size
<<=
8
tarinfo
.
size
+=
ord
(
buf
[
125
+
i
])
tarinfo
.
mtime
=
long
(
buf
[
136
:
148
],
8
)
tarinfo
.
mtime
=
long
(
buf
[
136
:
148
],
8
)
tarinfo
.
chksum
=
int
(
buf
[
148
:
156
],
8
)
tarinfo
.
chksum
=
int
(
buf
[
148
:
156
],
8
)
tarinfo
.
type
=
buf
[
156
:
157
]
tarinfo
.
type
=
buf
[
156
:
157
]
...
@@ -689,16 +699,28 @@ class TarInfo(object):
...
@@ -689,16 +699,28 @@ class TarInfo(object):
def
tobuf
(
self
):
def
tobuf
(
self
):
"""Return a tar header block as a 512 byte string.
"""Return a tar header block as a 512 byte string.
"""
"""
name
=
self
.
name
# Prefer the size to be encoded as 11 octal ascii digits
# which is the most portable. If the size exceeds this
# limit (>= 8 GB), encode it as an 88-bit value which is
# a GNU tar feature.
if
self
.
size
<=
MAXSIZE_MEMBER
:
size
=
"%011o"
%
self
.
size
else
:
s
=
self
.
size
size
=
""
for
i
in
range
(
11
):
size
=
chr
(
s
&
0377
)
+
size
s
>>=
8
size
=
chr
(
0200
)
+
size
# The following code was contributed by Detlef Lannert.
# The following code was contributed by Detlef Lannert.
parts
=
[]
parts
=
[]
for
value
,
fieldsize
in
(
for
value
,
fieldsize
in
(
(
name
,
100
),
(
self
.
name
,
100
),
(
"%07o"
%
(
self
.
mode
&
07777
),
8
),
(
"%07o"
%
(
self
.
mode
&
07777
),
8
),
(
"%07o"
%
self
.
uid
,
8
),
(
"%07o"
%
self
.
uid
,
8
),
(
"%07o"
%
self
.
gid
,
8
),
(
"%07o"
%
self
.
gid
,
8
),
(
"%011o"
%
self
.
size
,
12
),
(
size
,
12
),
(
"%011o"
%
self
.
mtime
,
12
),
(
"%011o"
%
self
.
mtime
,
12
),
(
" "
,
8
),
(
" "
,
8
),
(
self
.
type
,
1
),
(
self
.
type
,
1
),
...
@@ -1236,7 +1258,11 @@ class TarFile(object):
...
@@ -1236,7 +1258,11 @@ class TarFile(object):
tarinfo
.
linkname
=
normpath
(
tarinfo
.
linkname
)
tarinfo
.
linkname
=
normpath
(
tarinfo
.
linkname
)
if
tarinfo
.
size
>
MAXSIZE_MEMBER
:
if
tarinfo
.
size
>
MAXSIZE_MEMBER
:
raise
ValueError
,
"file is too large (>8GB)"
if
self
.
posix
:
raise
ValueError
,
"file is too large (>= 8 GB)"
else
:
self
.
_dbg
(
2
,
"tarfile: Created GNU tar largefile header"
)
if
len
(
tarinfo
.
linkname
)
>
LENGTH_LINK
:
if
len
(
tarinfo
.
linkname
)
>
LENGTH_LINK
:
if
self
.
posix
:
if
self
.
posix
:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment