Process a GNU sparse header plus extra headers.
(self, tarfile)
| 1422 | return next |
| 1423 | |
| 1424 | def _proc_sparse(self, tarfile): |
| 1425 | """Process a GNU sparse header plus extra headers. |
| 1426 | """ |
| 1427 | # We already collected some sparse structures in frombuf(). |
| 1428 | structs, isextended, origsize = self._sparse_structs |
| 1429 | del self._sparse_structs |
| 1430 | |
| 1431 | # Collect sparse structures from extended header blocks. |
| 1432 | while isextended: |
| 1433 | buf = tarfile.fileobj.read(BLOCKSIZE) |
| 1434 | pos = 0 |
| 1435 | for i in range(21): |
| 1436 | try: |
| 1437 | offset = nti(buf[pos:pos + 12]) |
| 1438 | numbytes = nti(buf[pos + 12:pos + 24]) |
| 1439 | except ValueError: |
| 1440 | break |
| 1441 | if offset and numbytes: |
| 1442 | structs.append((offset, numbytes)) |
| 1443 | pos += 24 |
| 1444 | isextended = bool(buf[504]) |
| 1445 | self.sparse = structs |
| 1446 | |
| 1447 | self.offset_data = tarfile.fileobj.tell() |
| 1448 | tarfile.offset = self.offset_data + self._block(self.size) |
| 1449 | self.size = origsize |
| 1450 | return self |
| 1451 | |
| 1452 | def _proc_pax(self, tarfile): |
| 1453 | """Process an extended or global header as described in |