| # | 
| # The Python Imaging Library. | 
| # $Id$ | 
| # | 
| # read files from within a tar file | 
| # | 
| # History: | 
| # 95-06-18 fl   Created | 
| # 96-05-28 fl   Open files in binary mode | 
| # | 
| # Copyright (c) Secret Labs AB 1997. | 
| # Copyright (c) Fredrik Lundh 1995-96. | 
| # | 
| # See the README file for information on usage and redistribution. | 
| # | 
|   | 
| import ContainerIO | 
| import string | 
|   | 
| ## | 
| # A file object that provides read access to a given member of a TAR | 
| # file. | 
|   | 
| class TarIO(ContainerIO.ContainerIO): | 
|   | 
|     ## | 
|     # Create file object. | 
|     # | 
|     # @param tarfile Name of TAR file. | 
|     # @param file Name of member file. | 
|   | 
|     def __init__(self, tarfile, file): | 
|   | 
|         fh = open(tarfile, "rb") | 
|   | 
|         while 1: | 
|   | 
|             s = fh.read(512) | 
|             if len(s) != 512: | 
|                 raise IOError, "unexpected end of tar file" | 
|   | 
|             name = s[:100] | 
|             i = string.find(name, chr(0)) | 
|             if i == 0: | 
|                 raise IOError, "cannot find subfile" | 
|             if i > 0: | 
|                 name = name[:i] | 
|   | 
|             size = string.atoi(s[124:136], 8) | 
|   | 
|             if file == name: | 
|                 break | 
|   | 
|             fh.seek((size + 511) & (~511), 1) | 
|   | 
|         # Open region | 
|         ContainerIO.ContainerIO.__init__(self, fh, fh.tell(), size) |