o
    DXhh                    @   s  	 d Z dZdZddlmZ ddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZzddlZW n eyF   dZY nw zddlZW n eyX   dZY nw eefZzeef7 ZW n	 eym   Y nw g dZdZdZed	 Zd
ZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2e2Z3e!e"e#e$e'e(e)e%e&e*e+e,fZ4e!e"e)e,fZ5e*e+e,fZ6dZ7h dZ8e9e9e9e:e:e:d Z;ej<d!krd"Z=ne> Z=d#d$ Z?d%d& Z@d'd( ZAd)e3fd*d+ZBd,d- ZCdedfd.d/ZDd0d1 ZEG d2d3 d3eFZGG d4d5 d5eGZHG d6d7 d7eGZIG d8d9 d9eGZJG d:d; d;eGZKG d<d= d=eGZLG d>d? d?eLZMG d@dA dAeLZNG dBdC dCeLZOG dDdE dEeLZPG dFdG dGeLZQG dHdI dIZRG dJdK dKZSG dLdM dMeTZUG dNdO dOeTZVG dPdQ dQejWZXG dRdS dSeGZYG dTdU dUeYZZG dVdW dWeYZ[G dXdY dYeYZ\G dZd[ d[eYZ]G d\d] d]eYZ^G d^d_ d_eYZ_eYeeHfZ`dtdadbZadcdd Zbdedf Zcdgdh ZdebeceddiZeeT ZfegdjZhG dkdl dleTZiG dmdn dneTZjdodp ZkejjZdqdr Zlemdskrel  dS dS )uz0.9.0u"   Lars Gustäbel (lars@gustaebel.de)u4   Gustavo Niemeyer, Niels Gustäbel, Richard Townsend.    )openN)TarFileTarInfo
is_tarfileTarError	ReadErrorCompressionErrorStreamErrorExtractErrorHeaderErrorENCODINGUSTAR_FORMAT
GNU_FORMAT
PAX_FORMATDEFAULT_FORMATr       i      s   ustar   s   ustar 00d         0   1   2   3   4   5   6   7   L   K   S   x   g   X      )pathlinkpathsizemtimeuidgidunamegname>   r,   r+   r%   r&   )Zatimectimer(   r)   r*   r'   ntutf-8c                 C   s:   	 | d u r	t d| ||} | d | |t|  t  S )Nzmetadata cannot contain None)
ValueErrorencodelenNUL)slengthencodingerrors r8   1/opt/python-3.10.19/usr/lib/python3.10/tarfile.pystn   s
   r:   c                 C   s,   	 |  d}|dkr| d | } | ||S )Nr   )finddecode)r4   r6   r7   pr8   r8   r9   nts   s
   
r?   c                 C   s   	 | d dv r3d}t t| d D ]}|dK }|| |d  7 }q| d dkr1dt| d  |  }|S zt| dd} t|  p@d	d}W |S  tyP   td
w )Nr   )      r#      rA      asciistrict0invalid header)ranger2   r?   intstripr0   InvalidHeaderError)r4   nir8   r8   r9   nti   s    rN   rB   c                 C   s   	 | }t | } d|   krd|d  k r&n ntd|d | f dt }|S |tkrnd|d   |   kr=d|d  k rnn td	| dkrLtdg}ntdg}d| |  } t|d D ]}|d| d@  | dL } q]|S td	)
Nr   rB   r#   z%0*orD   rC   r@   rA   zoverflow in number field)rI   bytesr3   r   	bytearrayrH   insertr0   )rL   digitsformatZ
original_nr4   rM   r8   r8   r9   itn   s"   
 0

rT   c                 C   s2   	 dt td|  }dt td|  }||fS )NrC   Z
148B8x356BZ
148b8x356b)sumstructunpack_from)bufZunsigned_chksumZsigned_chksumr8   r8   r9   calc_chksums   s   rY   c           	      C   s   	 |pd}|dkrd S |d u rt | || d S t||\}}t|D ]}| |}t||k r4|d|| q#|dkrR| |}t||k rM|d|| d S )Ni @  r   unexpected end of data)shutilcopyfileobjdivmodrH   readr2   write)	srcdstr5   	exceptionbufsizeblocks	remainderbrX   r8   r8   r9   r\      s&   


r\   c                 C   s8   t tjdd }|d ur| |d|} t| dd d S )Nr6   backslashreplace )end)getattrsysstdoutr1   r=   print)r4   r6   r8   r8   r9   _safe_print  s   rn   c                   @      e Zd Z	 dS )r   N__name__
__module____qualname__r8   r8   r8   r9   r         r   c                   @   ro   )r
   Nrp   r8   r8   r8   r9   r
     rt   r
   c                   @   ro   )r   Nrp   r8   r8   r8   r9   r     rt   r   c                   @   ro   )r   Nrp   r8   r8   r8   r9   r     rt   r   c                   @   ro   )r	   Nrp   r8   r8   r8   r9   r	     rt   r	   c                   @   ro   )r   Nrp   r8   r8   r8   r9   r     rt   r   c                   @   ro   )EmptyHeaderErrorNrp   r8   r8   r8   r9   ru   !  rt   ru   c                   @   ro   )TruncatedHeaderErrorNrp   r8   r8   r8   r9   rv   $  rt   rv   c                   @   ro   )EOFHeaderErrorNrp   r8   r8   r8   r9   rw   '  rt   rw   c                   @   ro   )rK   Nrp   r8   r8   r8   r9   rK   *  rt   rK   c                   @   ro   )SubsequentHeaderErrorNrp   r8   r8   r8   r9   rx   -  rt   rx   c                   @   .   e Zd Z	 dd Zdd Zdd Zdd Zd	S )
_LowLevelFilec                 C   sF   t jt jt jB t jB d| }tt dr|t jO }t ||d| _d S )NrwO_BINARYi  )	osO_RDONLYO_WRONLYO_CREATO_TRUNChasattrr~   r   fd)selfnamemoder8   r8   r9   __init__:  s   

z_LowLevelFile.__init__c                 C   s   t | j d S N)r   closer   r   r8   r8   r9   r   C     z_LowLevelFile.closec                 C   s   t | j|S r   )r   r^   r   r   r'   r8   r8   r9   r^   F     z_LowLevelFile.readc                 C   s   t | j| d S r   )r   r_   r   r   r4   r8   r8   r9   r_   I  s   z_LowLevelFile.writeN)rq   rr   rs   r   r   r^   r_   r8   r8   r8   r9   rz   4  s    	rz   c                   @   sp   e Zd Z	 dd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dddZdd Zdd Zdd ZdS )_Streamc           	      C   s  	 d| _ |d u rt||}d| _ |dkrt|}| }|pd| _|| _|| _|| _|| _d| _	d| _
d| _z|dkrmzdd l}W n tyM   tdd w || _|d| _|d	krf|   |j| _W d S |   W d S |d
krzdd l}W n ty   tdd w |d	krd| _| | _t| _W d S | | _W d S |dkrzdd l}W n ty   tdd w |d	krd| _| | _|j| _W d S | | _W d S |dkrtd| W d S    | j s| j  d| _ )NTF*     r   gzzzlib module is not availabler|   bz2bz2 module is not availablexzlzma module is not availabletarunknown compression type %r) _extfileobjrz   _StreamProxygetcomptyper   r   comptypefileobjrc   rX   posclosedzlibImportErrorr   crc32crc_init_read_gzerrorrb   _init_write_gzr   dbufBZ2DecompressorcmpOSErrorBZ2CompressorlzmaLZMADecompressor	LZMAErrorLZMACompressorr   )	r   r   r   r   r   rc   r   r   r   r8   r8   r9   r   W  sv   







z_Stream.__init__c                 C   s$   t | dr| js|   d S d S d S )Nr   )r   r   r   r   r8   r8   r9   __del__  s   z_Stream.__del__c                 C   s   	 | j d| j j| j j | j jd| _tdtt		 }| 
d| d  | jdr4| jd d | _tj| j| _| 
| jdd	t  d S )
N	   r   <Ls   s   .gzz
iso-8859-1replace)r   compressobjDEFLATED	MAX_WBITSDEF_MEM_LEVELr   rV   packrI   time_Stream__writer   endswithr   r%   basenamer1   r3   )r   Z	timestampr8   r8   r9   r     s   z_Stream._init_write_gzc                 C   sT   	 | j dkr| j|| j| _|  jt|7  _| j dkr#| j|}| | d S )Nr   r   )	r   r   r   r   r   r2   r   compressr   r   r8   r8   r9   r_     s   

z_Stream.writec                 C   sb   	 |  j |7  _ t| j | jkr/| j| j d | j  | j | jd  | _ t| j | jksd S d S r   )rX   r2   rc   r   r_   r   r8   r8   r9   Z__write  s   z_Stream.__writec                 C   s   	 | j rd S d| _ zP| jdkr| jdkr|  j| j 7  _| jdkrM| jrM| j| j d| _| jdkrM| jt	d| j
 | jt	d| jd@  W | jsX| j  d S d S | jsc| j  w w )NTr}   r   r   r   r   l    )r   r   r   rX   r   flushr   r_   rV   r   r   r   r   r   r   r8   r8   r9   r     s&   

z_Stream.closec                 C   s   	 | j | j j | _d| _| ddkrtd| ddkr$tdt| d}| d |d	@ rIt| dd
t| d  }| 	| |d@ r[	 | d}|rY|t
krZnqN|d@ rm	 | d}|rk|t
krlnq`|d@ rx| d d S d S )Nr   r$   s   not a gzip filer#      zunsupported compression method      rC   rB   T   )r   decompressobjr   r   r   _Stream__readr   r   ordr^   r3   )r   flagZxlenr4   r8   r8   r9   r     s6   
 


z_Stream._init_read_gzc                 C      	 | j S r   )r   r   r8   r8   r9   tell     z_Stream.tellr   c                 C   sX   	 || j  dkr(t|| j  | j\}}t|D ]}| | j q| | | j S td)Nr   z seeking backwards is not allowed)r   r]   rc   rH   r^   r	   )r   r   rd   re   rM   r8   r8   r9   seek  s   
z_Stream.seekc                 C   s"   	 |  |}|  jt|7  _|S r   )_readr   r2   )r   r'   rX   r8   r8   r9   r^     s   
z_Stream.readc              
   C   s   	 | j dkr| |S t| j}| jg}||k rV| jr"| j}d| _n
| j| j}|s,n*z| j	|}W n | j
yF } ztd|d }~ww || |t|7 }||k sd|}||d  | _|d | S )Nr   r   zinvalid compressed data)r   r   r2   r   rX   r   r^   rc   r   
decompressrb   r   appendjoin)r   r'   ctrX   er8   r8   r9   r     s0   





z_Stream._readc                 C   sr   	 t | j}| jg}||k r'| j| j}|sn|| |t |7 }||k sd|}||d  | _|d | S )Nr   )r2   rX   r   r^   rc   r   r   )r   r'   r   r   rX   r8   r8   r9   Z__read-  s   


z_Stream.__readN)r   )rq   rr   rs   r   r   r   r_   r   r   r   r   r   r^   r   r   r8   r8   r8   r9   r   L  s    
F
	
r   c                   @   ry   )
r   c                 C   s   || _ | j t| _d S r   )r   r^   	BLOCKSIZErX   )r   r   r8   r8   r9   r   C  s   z_StreamProxy.__init__c                 C   s   | j j| _| jS r   )r   r^   rX   r   r8   r8   r9   r^   G  s   
z_StreamProxy.readc                 C   sL   | j drdS | j dd dkr| j dd dkrd	S | j d
r$dS dS )Ns   r   r      s   BZhr   
   s   1AY&SYr   )s   ]  s   7zXZr   r   )rX   
startswithr   r8   r8   r9   r   K  s   $z_StreamProxy.getcomptypec                 C   s   | j   d S r   )r   r   r   r8   r8   r9   r   U  r   z_StreamProxy.closeN)rq   rr   rs   r   r^   r   r   r8   r8   r8   r9   r   >  s    
r   c                   @   sh   e Zd Z	 dddZdd Zdd Zdd	 Zd
d Zdd Ze	j
fddZdddZdd Zdd ZdS )_FileInFileNc                 C   s   || _ || _|| _d| _t|dd | _d| _|d u rd|fg}d| _g | _d}| j}|D ]&\}}||kr>| j	d||d f | j	d||| |f ||7 }|| }q,|| jk re| j	d|| jd f d S d S )Nr   r   FT)
r   offsetr'   positionrj   r   r   	map_indexmapr   )r   r   r   r'   Z	blockinfoZlastposZrealposr8   r8   r9   r   b  s*   


z_FileInFile.__init__c                 C   s   d S r   r8   r   r8   r8   r9   r   {     z_FileInFile.flushc                 C      dS NTr8   r   r8   r8   r9   readable~  r   z_FileInFile.readablec                 C   r   NFr8   r   r8   r8   r9   writable  r   z_FileInFile.writablec                 C   s
   | j  S r   )r   seekabler   r8   r8   r9   r        
z_FileInFile.seekablec                 C   r   r   )r   r   r8   r8   r9   r     r   z_FileInFile.tellc                 C   s   	 |t jkrtt|d| j| _| jS |t jkr5|dk r(t| j| d| _| jS t| j| | j| _| jS |t jkrJtt| j| | jd| _| jS td)Nr   zInvalid argument)	ioSEEK_SETminmaxr'   r   SEEK_CURSEEK_ENDr0   )r   r   whencer8   r8   r9   r     s   



z_FileInFile.seekc           	      C   s  	 |d u r| j | j }n	t|| j | j }d}|dkr	 | j| j \}}}}|| j  kr1|k r4n nn|  jd7  _| jt| jkrFd| _qt||| j }|rq| j|| j|   | j|}t||krlt	d||7 }n|t
| 7 }||8 }|  j|7  _|dks|S )Nr   r   Tr#   rZ   )r'   r   r   r   r   r2   r   r   r^   r   r3   )	r   r'   rX   datastartstopr   r5   rf   r8   r8   r9   r^     s4   
z_FileInFile.readc                 C   s&   |  t|}||d t|< t|S r   )r^   r2   )r   rf   rX   r8   r8   r9   readinto  s   z_FileInFile.readintoc                 C   s
   d| _ d S r   )r   r   r8   r8   r9   r     r   z_FileInFile.closer   )rq   rr   rs   r   r   r   r   r   r   r   r   r   r^   r   r   r8   r8   r8   r9   r   \  s    

r   c                          e Zd Z fddZ  ZS )ExFileObjectc                    s&   t |j|j|j|j}t | d S r   )r   r   offset_datar'   sparsesuperr   )r   tarfiletarinfor   	__class__r8   r9   r     s   
zExFileObject.__init__rq   rr   rs   r   __classcell__r8   r8   r   r9   r     s    r   c                   @   s   e Zd ZdS )FilterErrorNrp   r8   r8   r8   r9   r     s    r   c                       r   )AbsolutePathErrorc                    s    || _ t d|jd d S )Nzmember z has an absolute pathr   r   r   r   r   r   r   r8   r9   r     s   zAbsolutePathError.__init__r   r8   r8   r   r9   r         r   c                       r   )OutsideDestinationErrorc                    .   || _ || _t |jd|dd  d S )Nz would be extracted to ,  which is outside the destinationr   _pathr   r   r   r   r   r%   r   r8   r9   r     
   
z OutsideDestinationError.__init__r   r8   r8   r   r9   r    r  r  c                       r   )SpecialFileErrorc                       || _ t |jd d S )Nz is a special filer  r  r   r8   r9   r        zSpecialFileError.__init__r   r8   r8   r   r9   r    r  r  c                       r   )AbsoluteLinkErrorc                    r  )Nz is a link to an absolute pathr  r  r   r8   r9   r     r  zAbsoluteLinkError.__init__r   r8   r8   r   r9   r    r  r  c                       r   )LinkOutsideDestinationErrorc                    r  )Nz would link to r  r  r  r
  r   r8   r9   r     r  z$LinkOutsideDestinationError.__init__r   r8   r8   r   r9   r    r  r  c                       r   )LinkFallbackErrorc                    s2   || _ || _t d|jdd|d  d S )Nzlink z would be extracted as a zcopy of z, which was rejectedr  r
  r   r8   r9   r     s
   

zLinkFallbackError.__init__r   r8   r8   r   r9   r    r  r  Tc                 C   s  i }| j }tjj|tjjd}|dtjfr$| jdtj  }|d< tj|r.t	| tjjtj
||tjjd}tj||g|krLt| || j}|d ur|d@ }|r}|  sa|  rn|d@ si|dM }|dO }n|  sv|  ryd }nt| || jkr||d< |r| jd urd |d	< | jd urd |d
< | jd urd |d< | jd urd |d< |  s|  rtj| jrt| tj| j}|| jkr||d< |  rtj
|tj|| j}ntj
|| j}tjj|tjjd}tj||g|krt| ||S )N)rE   /r   i  @   i  r   r)   r*   r+   r,   linkname)r   r   r%   realpathALLOW_MISSINGr   seplstripisabsr   r   
commonpathr  r   isregislnkisdirissymr  r)   r*   r+   r,   r  r  normpathdirnamer  )member	dest_pathZfor_data	new_attrsr   Ztarget_pathr   Z
normalizedr8   r8   r9   _get_filtered_attrs  sl   









r%  c                 C   s   | S r   r8   )r"  r#  r8   r8   r9   fully_trusted_filterA  r   r&  c                 C   s,   t | |d}|r| jdi |ddiS | S )NFdeepr8   r%  r   r"  r#  r$  r8   r8   r9   
tar_filterD     r*  c                 C   s,   t | |d}|r| jdi |ddiS | S )NTr'  Fr8   r(  r)  r8   r8   r9   data_filterJ  r+  r,  )Zfully_trustedr   r   s   ([0-9]{1,20}) c                   @   s*  e Zd Z	 ed{i ddddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d$d&d$Zd|d(d)Zed*d+ Zejd,d+ Zed-d. Z	e	jd/d. Z	d0d1 Z
eeeeeeeed2ed3
d4d5Zd6d7 Zeed8fd9d:Zd;d< Zd=d> Zd?d@ ZedAdB ZdCdD ZedEdF ZedGdH ZedIdJ ZedKdL ZedMdN ZedOdP ZdQdR ZdSdT ZdUdV Z dWdX Z!dYdZ Z"d[d\ Z#d]d^ Z$d_d` Z%dadb Z&dcdd Z'dedf Z(dgdh Z)didj Z*dkdl Z+dmdn Z,dodp Z-dqdr Z.dsdt Z/dudv Z0dwdx Z1dydz Z2d$S )}r   r   zName of the archive member.r   zPermission bits.r)   z6User ID of the user who originally stored this member.r*   z7Group ID of the user who originally stored this member.r'   zSize in bytes.r(   zTime of last modification.chksumzHeader checksum.typezFile type. type is usually one of these constants: REGTYPE, AREGTYPE, LNKTYPE, SYMTYPE, DIRTYPE, FIFOTYPE, CONTTYPE, CHRTYPE, BLKTYPE, GNUTYPE_SPARSE.r  zcName of the target file name, which is only present in TarInfo objects of type LNKTYPE and SYMTYPE.r+   z
User name.r,   zGroup name.devmajorzDevice major number.devminorzDevice minor number.r   zThe tar header starts here.r   zThe file's data starts here.pax_headerszMA dictionary containing key-value pairs of an associated pax extended header.r   zSparse member information.r   N_sparse_structs_link_targetr   c                 C   sl   	 || _ d| _d| _d| _d| _d| _d| _t| _d| _	d| _
d| _d| _d| _d| _d| _d | _i | _d S )Ni  r   r   )r   r   r)   r*   r'   r(   r-  REGTYPEr.  r  r+   r,   r/  r0  r   r   r   r1  r   r   r8   r8   r9   r     s$   
zTarInfo.__init__c                 C   r   r   r   r   r8   r8   r9   r%        zTarInfo.pathc                 C   
   || _ d S r   r6  r5  r8   r8   r9   r%        
c                 C   r   r   r  r   r8   r8   r9   r&     r7  zTarInfo.linkpathc                 C   r8  r   r:  )r   r  r8   r8   r9   r&     r9  c                 C   s   d| j j| jt| f S )Nz<%s %r at %#x>)r   rq   r   idr   r8   r8   r9   __repr__  s   zTarInfo.__repr__T)
r   r(   r   r  r)   r*   r+   r,   r'  _KEEPc       
         C   s   	 |	r	t | }nt  | }||
ur||_||
ur||_||
ur#||_||
ur*||_||
ur1||_||
ur8||_||
ur?||_||
urF||_	|S r   )
copydeepcopyr   r(   r   r  r)   r*   r+   r,   )r   r   r(   r   r  r)   r*   r+   r,   r'  r=  resultr8   r8   r9   r     s*   
zTarInfo.replacec                 C   s   	 | j d u r	d }n| j d@ }| j|| j| j| j| j| j| j| j| j	| j
| j| jd}|d tkr?|d ds?|d  d7  < |S )N  )r   r   r)   r*   r'   r(   r-  r.  r  r+   r,   r/  r0  r.  r   r  )r   r   r)   r*   r'   r(   r-  r.  r  r+   r,   r/  r0  DIRTYPEr   )r   r   infor8   r8   r9   get_info  s*   

zTarInfo.get_infosurrogateescapec                 C   sx   	 |   }| D ]\}}|d u rtd| q	|tkr#| |||S |tkr.| |||S |tkr8| ||S td)Nz%s may not be Nonezinvalid format)	rD  itemsr0   r   create_ustar_headerr   create_gnu_headerr   create_pax_header)r   rS   r6   r7   rC  r   valuer8   r8   r9   tobuf  s   zTarInfo.tobufc                 C   sp   	 t |d< t|d ||tkrtdt|d ||tkr0| |d ||\|d< |d< | |t||S )Nmagicr  zlinkname is too longr   prefix)	POSIX_MAGICr2   r1   LENGTH_LINKr0   LENGTH_NAME_posix_split_name_create_headerr   )r   rC  r6   r7   r8   r8   r9   rG    s   zTarInfo.create_ustar_headerc                 C   s   	 t |d< d}t|d ||tkr|| |d t||7 }t|d ||tkr7|| |d t||7 }|| |t	|| S )NrL  r   r  r   )
	GNU_MAGICr2   r1   rO  _create_gnu_long_headerGNUTYPE_LONGLINKrP  GNUTYPE_LONGNAMErR  r   )r   rC  r6   r7   rX   r8   r8   r9   rH    s   zTarInfo.create_gnu_headerc              	   C   sF  	 t |d< | j }ddtfddtfddfD ]2\}}}||v r qz
|| dd	 W n ty9   || ||< Y qw t|| |krH|| ||< qd
D ]A\}}d}|| }	t|	t	}
|
r`t
|	n|	}d|  krpd|d  k sxn d||< d}n|
r|||< d}|r||vrt|	||< qK|r| |t|}nd}|| |tdd S )NrL  r   r%   r  r&   )r+   r+       )r,   r,   rW  rD   rE   ))r)   rB   )r*   rB   )r'      )r(   rX  Fr   rB   r#   Tr   r   )rN  r1  r>  rP  rO  r1   UnicodeEncodeErrorr2   
isinstancefloatroundstr_create_pax_generic_headerXHDTYPErR  r   )r   rC  r6   r1  r   Zhnamer5   rR   Z	needs_paxvalZval_is_floatZval_intrX   r8   r8   r9   rI    sF   

zTarInfo.create_pax_headerc                 C   s   	 |  |tdS )Nr/   )r^  XGLTYPE)clsr1  r8   r8   r9   create_pax_global_headerN  s   z TarInfo.create_pax_global_headerc                 C   s~   	 | d}tdt|D ]-}d|d | }d||d  }t|||tkr:t|||tkr: ||fS qtd)Nr  r#   zname is too long)splitrH   r2   r   r1   LENGTH_PREFIXrP  r0   )r   r   r6   r7   
componentsrM   rM  r8   r8   r9   rQ  T  s   
zTarInfo._posix_split_namec                 C   s  	 |  dttfv }|r!t|  ddd|}t|  ddd|}ntdd||}tdd||}|  dt}|d u r=tdt|  ddd	||t|  d
dd@ d|t|  ddd|t|  ddd|t|  ddd|t|  ddd|d|t|  ddd	|||  dtt|  ddd||t|  ddd||||t|  ddd||g}t	dt
 d|}	t|	t
 d  d }
|	d d td|
 d |	dd   }	|	S )Nr.  r/  r   rB   r0  r   zTarInfo.type must not be Noner   r   r   rA  r)   r*   r'   rX  r(   s           r  rL  r+   rW  r,   rM  r   z%dsr   iz%06o rD   i)getCHRTYPEBLKTYPErT   r:   r4  r0   rN  rV   r   r   r   rY   rO   )rC  rS   r6   r7   Zhas_device_fieldsr/  r0  ZfiletypepartsrX   r-  r8   r8   r9   rR  d  s<   
&zTarInfo._create_headerc                 C   s0   	 t t| t\}}|dkr| t| t 7 } | S )Nr   )r]   r2   r   r3   )payloadrd   re   r8   r8   r9   _create_payload  s
   zTarInfo._create_payloadc                 C   sT   	 | ||t }i }d|d< ||d< t||d< t|d< | |t||| | S )Nz././@LongLinkr   r.  r'   rL  )r1   r3   r2   rS  rR  r   rl  )rb  r   r.  r6   r7   rC  r8   r8   r9   rT    s   zTarInfo._create_gnu_long_headerc              	   C   s.  	 d}|  D ]\}}z|dd W q ty   d}Y  nw d}|r(|d7 }|  D ]I\}}|d}|r>||d}n|d}t|t| d }d	 }	}
	 |tt|
 }	|	|
kr_n|	}
qR|tt|
d
d | d | d 7 }q,i }d|d< ||d< t||d< t|d< | |td
d| 	| S )NFr/   rE   Tr   s   21 hdrcharset=BINARY
rE  r   r   rD          =   
z././@PaxHeaderr   r.  r'   rL  r   )
rF  r1   rY  r2   r]  rO   rN  rR  r   rl  )rb  r1  r.  r6   binarykeywordrJ  recordslrL   r>   rC  r8   r8   r9   r^    sD   

(z"TarInfo._create_pax_generic_headerc              	   C   sh  	 t |dkrtdt |tkrtd|ttkr tdt|dd }|t|vr2t	d|  }t
|dd |||_t|dd	 |_t|d	d
 |_t|d
d |_t|dd |_t|dd |_||_|dd |_t
|dd |||_t
|dd |||_t
|dd |||_t|dd |_t|dd |_t
|dd ||}|jtkr|jdrt|_|jtkrd}g }tdD ]0}	zt|||d  }
t||d |d  }W n
 ty   Y  nw ||
|f |d7 }qt|d }t|dd }|||f|_ |! r!|j"d|_|r2|jt#vr2|d |j |_|S )Nr   zempty headerztruncated headerzend of file header      zbad checksumr   l   t   |         i  i	  i)  iI  iQ  iY  i  r  i  r   rX     i  i  i  )$r2   ru   r   rv   countr3   rw   rN   rY   rK   r?   r   r   r)   r*   r'   r(   r-  r.  r  r+   r,   r/  r0  AREGTYPEr   rB  GNUTYPE_SPARSErH   r0   r   boolr2  r  rstrip	GNU_TYPES)rb  rX   r6   r7   r-  objrM  r   structsrM   r   numbytes
isextendedorigsizer8   r8   r9   frombuf  s^   

zTarInfo.frombufc                 C   s:   	 |j t}| ||j|j}|j  t |_||S r   )	r   r^   r   r  r6   r7   r   r   _proc_member)rb  r   rX   r  r8   r8   r9   fromtarfile  s
   
zTarInfo.fromtarfilec                 C   sR   	 | j ttfv r| |S | j tkr| |S | j tttfv r$| 	|S | 
|S r   )r.  rV  rU  _proc_gnulongr~  _proc_sparser_  ra  SOLARIS_XHDTYPE	_proc_pax_proc_builtin)r   r   r8   r8   r9   r  0  s   




zTarInfo._proc_memberc                 C   sj   	 |j  | _| j}|  s| jtvr|| | j7 }||_| 	|j
|j|j |  r3| jd| _| S Nr  )r   r   r   r  r.  SUPPORTED_TYPES_blockr'   r   _apply_pax_infor1  r6   r7   r  r   r  )r   r   r   r8   r8   r9   r  =  s   zTarInfo._proc_builtinc              
   C   s   	 |j | | j}z| |}W n ty% } ztt|d d }~ww | j|_| j	t
kr9t||j|j|_n| j	tkrGt||j|j|_| rR|jd|_|S r  )r   r^   r  r'   r  r   rx   r]  r   r.  rV  r?   r6   r7   r   rU  r  r  removesuffix)r   r   rX   nextr   r8   r8   r9   r  S  s    

zTarInfo._proc_gnulongc           
   	   C   s   	 | j \}}}| ` |rT|jt}d}tdD ]4}zt|||d  }t||d |d  }	W n
 ty;   Y  nw |rG|	rG|||	f |d7 }qt|d }|s|| _	|j
 | _| j| | j |_|| _| S )Nr      rX  r{  i  )r2  r   r^   r   rH   rN   r0   r   r  r   r   r   r  r'   r   )
r   r   r  r  r  rX   r   rM   r   r  r8   r8   r9   r  n  s.   
zTarInfo._proc_sparsec              
   C   s  	 |j | | j}| jtkr|j}n|j }d}d }g }t||kr|| dkrt	
|| }s7tdz	t|d}W n tyK   tdw |dk rTtd|| t|kr`td|d| d }	||dd |	 }
|
d\}}}|r|dks||	 dkrtd||||f |dkr|d u r|dkr|j}nd	}||7 }t||kr|| dks+|d u rd	}|D ]*\}}}| |d	d	|j}|tv r| |||j|j}n	| |d	d	|j}|||< qz| |}W n ty } ztt|d d }~ww d
|v r| || n#d|v r| || n|ddkr4|ddkr4| ||| | jtt fv rg|!||j|j | j"|_"d|v rg|j#}|$ s\|jt%vrd|||j7 }||_"|S )Nr   rG   r#      rn  r   s
   hdrcharsets   BINARYr/   GNU.sparse.mapGNU.sparse.sizezGNU.sparse.major1zGNU.sparse.minorrF   r'   )&r   r^   r  r'   r.  ra  r1  r>  r2   _header_length_prefix_rematchrK   rI   groupr0   r   ri   	partitionr   r6   _decode_pax_fieldr7   PAX_NAME_FIELDSr  r   rx   r]  _proc_gnusparse_01_proc_gnusparse_00rg  _proc_gnusparse_10r_  r  r  r   r   r  r  )r   r   rX   r1  r   r6   raw_headersr  r5   Zheader_value_end_offsetZkeyword_and_valueZraw_keywordZequalsZ	raw_valuerq  rJ  r  r   r   r8   r8   r9   r    s   

)




 
zTarInfo._proc_paxc              	   C   s   	 g }g }|D ];\}}}|dkr'z| t|  W q ty&   tdw |dkrBz| t|  W q tyA   tdw qtt|||_d S )Ns   GNU.sparse.offsetrG   s   GNU.sparse.numbytes)r   rI   r=   r0   rK   listzipr   )r   r  r  Zoffsetsr  _rq  rJ  r8   r8   r9   r    s$   zTarInfo._proc_gnusparse_00c                 C   sB   	 dd |d  dD }tt|d d d |dd d |_d S )Nc                 S   s   g | ]}t |qS r8   )rI   ).0xr8   r8   r9   
<listcomp>  s    z.TarInfo._proc_gnusparse_01.<locals>.<listcomp>r  ,r$   r#   )rd  r  r  r   )r   r  r1  r   r8   r8   r9   r    s   (zTarInfo._proc_gnusparse_01c                 C   s   	 d }g }|j t}|dd\}}t|}t||d k rBd|vr+||j t7 }|dd\}}|t| t||d k s|j  |_t	t
|d d d |dd d |_d S )Nro  r#   r$   )r   r^   r   rd  rI   r2   r   r   r   r  r  r   )r   r  r1  r   fieldsr   rX   numberr8   r8   r9   r    s   (zTarInfo._proc_gnusparse_10c              	   C   s   	 |  D ]T\}}|dkrt| d| q|dkr!t| dt| q|dkr.t| dt| q|tv rY|tv rJzt| |}W n tyI   d}Y nw |dkrS|d}t| || q| | _d S )NzGNU.sparse.namer%   r  r'   zGNU.sparse.realsizer   r  )	rF  setattrrI   
PAX_FIELDSPAX_NUMBER_FIELDSr0   r  r>  r1  )r   r1  r6   r7   rq  rJ  r8   r8   r9   r  -  s(   
zTarInfo._apply_pax_infoc                 C   s0   	 z| |dW S  ty   | || Y S w )NrE   )r=   UnicodeDecodeError)r   rJ  r6   Zfallback_encodingZfallback_errorsr8   r8   r9   r  D  s   zTarInfo._decode_pax_fieldc                 C   s4   	 |dk r	t dt|t\}}|r|d7 }|t S )Nr   zinvalid offsetr#   )rK   r]   r   )r   r|  rd   re   r8   r8   r9   r  L  s   zTarInfo._blockc                 C   s   	 | j tv S r   )r.  REGULAR_TYPESr   r8   r8   r9   r  X     
zTarInfo.isregc                 C   s
   	 |   S r   )r  r   r8   r8   r9   isfile\  s   zTarInfo.isfilec                 C      	 | j tkS r   )r.  rB  r   r8   r8   r9   r  `  r  zTarInfo.isdirc                 C   r  r   )r.  SYMTYPEr   r8   r8   r9   r  d  r  zTarInfo.issymc                 C   r  r   )r.  LNKTYPEr   r8   r8   r9   r  h  r  zTarInfo.islnkc                 C   r  r   )r.  rh  r   r8   r8   r9   ischrl  r  zTarInfo.ischrc                 C   r  r   )r.  ri  r   r8   r8   r9   isblkp  r  zTarInfo.isblkc                 C   r  r   )r.  FIFOTYPEr   r8   r8   r9   isfifot  r  zTarInfo.isfifoc                 C   s
   | j d uS r   )r   r   r8   r8   r9   issparsex  r   zTarInfo.issparsec                 C   s   	 | j tttfv S r   )r.  rh  ri  r  r   r8   r8   r9   isdev{  s   zTarInfo.isdevr8   )r   )3rq   rr   rs   dict	__slots__r   propertyr%   setterr&   r<  r=  r   rD  r   r   rK  rG  rH  rI  classmethodrc  rQ  staticmethodrR  rl  rT  r^  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r8   r8   r8   r9   r   `  s    




:

)
	

2
>
yr   c                   @   s
  e Zd Z	 dZdZdZdZeZe	Z
dZeZeZdZ				djddZedddefd	d
ZedkddZedlddZedlddZedmddZdddddZdd Zdd Zdd Zdd  Zdnd!d"Zdodd$d%d&Zdpdd'd(d)Z dqd*d+Z!d,d- Z"drddd/d0d1Z#d2d3 Z$dsddd/d5d6Z%d7d8 Z&	dqd9d:Z'd;d< Z(d=d> Z)d?d@ Z*	#	dtdddAdBdCZ+dDdE Z,dFdG Z-dHdI Z.dJdK Z/dLdM Z0dNdO Z1dPdQ Z2dRdS Z3dTdU Z4dVdW Z5dXdY Z6dudZd[Z7d\d] Z8dqd^d_Z9d`da Z:dbdc Z;ddde Z<dfdg Z=dhdi Z>dS )vr   r   Fr#   Nr|   rE  c              
   C   s  	 ddddd}||vrt d|| _|| | _|s5| jdkr+tj|s+d| _d| _t|| j}d	| _n |d u rIt|d
rIt	|j
ttfrI|j
}t|drR|j| _d| _|r]tj|nd | _
|| _|d urj|| _|d urq|| _|d urx|| _|d ur|| _|d ur|| _|	| _|
d ur| jtkr|
| _ni | _|d ur|| _|d ur|| _|| _d	| _g | _d	| _| j | _i | _z|| jdkrd | _ | ! | _ | jdkr	 | j"| j z| j#| }| j$| W n# t%y   | j"| j Y n t&y	 } zt't|d d }~ww q| jdv r3d| _| jr6| j(| j) }| j*| |  jt+|7  _W d S W d S W d S    | jsE| j,  d| _ )Nrbzr+bwbxbr|   ar}   r  !mode must be 'r', 'a', 'w' or 'x'r  r}   Fr   r   Tr|   r  r}   r  )-r0   r   _moder   r%   exists	bltn_openr   r   rZ  r   r]  rO   abspathr   rS   r   dereferenceignore_zerosr6   r7   r   r1  debug
errorlevelcopybufsizer   members_loadedr   r   inodesfirstmemberr  r   r  r   rw   r   r   rc  r>  r_   r2   r   )r   r   r   r   rS   r   r  r  r6   r7   r1  r  r  r  Zmodesr   rX   r8   r8   r9   r     s   




zTarFile.__init__c                    s  	 |s	|s	t d|dv rp fdd}g }t j|dD ]G}t  j| }	|d ur.| }
z|	|d|fi |W   S  ttfyc } z|d| d| |d urY||
 W Y d }~qd }~ww d		|}td
| d|v r|
dd\}}|pd}|pd}| jv rt  j| }	ntd| |	|||fi |S d|v r|
dd\}}|pd}|pd}|dvrt dt|||||}z |||fi |}W n   |   d|_|S |dv r j|||fi |S t d)Nznothing to open)r|   r:*c                    s    j |  dkS )Ntaropen)	OPEN_METH)r   rb  r8   r9   not_compressed5  r   z$TarFile.open.<locals>.not_compressed)keyr|   z	- method z: 
z'file could not be opened successfully:
:r#   r   r   |r{   zmode must be 'r' or 'w'Fr  zundiscernible mode)r0   sortedr  rj   r   r   r   r   r   r   rd  r   r   r   r  )rb  r   r   r   rc   kwargsr  Z
error_msgsr   funcZ	saved_posr   Zerror_msgs_summaryfilemodestreamr   r8   r  r9   r     s\   #


zTarFile.openc                 K   s&   	 |dvr	t d| |||fi |S )Nr  r  )r0   )rb  r   r   r   r  r8   r8   r9   r  i  s   zTarFile.taropenr   c           	   
   K   s   	 |dvr	t dzddlm} W n ty   tdd w z|||d ||}W n tyC } z|d ur>|dkr>td| d }~ww z| j|||fi |}W n! tyk } z|  |dkrftd| d }~w   |   d	|_	|S )
Nr|   r}   r  mode must be 'r', 'w' or 'x'r   )GzipFilezgzip module is not availablerf   r|   r   F)
r0   gzipr  r   r   r   r   r  r   r   )	rb  r   r   r   compresslevelr  r  r   r   r8   r8   r9   gzopenq  s:   


zTarFile.gzopenc           	   
   K   s   	 |dvr	t dzddlm} W n ty   tdd w ||p"|||d}z| j|||fi |}W n# ttfyP } z|  |dkrKt	d| d }~w   |   d	|_
|S )
Nr  r  r   )BZ2Filer   )r  r|   znot a bzip2 fileF)r0   r   r  r   r   r  r   EOFErrorr   r   r   )	rb  r   r   r   r  r  r  r   r   r8   r8   r9   bz2open  s,   

zTarFile.bz2openc           
   
   K   s   	 |dvr	t dz
ddlm}m} W n ty   tdd w ||p$|||d}z| j|||fi |}W n# |tfyR }	 z|  |dkrMt	d|	 d }	~	w   |   d	|_
|S )
Nr  r  r   )LZMAFiler   r   )presetr|   znot an lzma fileF)r0   r   r  r   r   r   r  r  r   r   r   )
rb  r   r   r   r  r  r  r   r   r   r8   r8   r9   xzopen  s,   

zTarFile.xzopenr  r  r  r  )r   r   r   r   c                 C   s   	 | j rd S d| _ z;| jdv r8| jttd   |  jtd 7  _t| jt\}}|dkr8| jtt|   W | j	sC| j
  d S d S | j	sN| j
  w w )NTr  r$   r   )r   r   r   r_   r3   r   r   r]   
RECORDSIZEr   r   )r   rd   re   r8   r8   r9   r     s"   

zTarFile.closec                 C   s*   	 |  |d}|d u rtd| |S )Nr  zfilename %r not found)
_getmemberr  KeyError)r   r   r   r8   r8   r9   	getmember  s
   zTarFile.getmemberc                 C   s   	 |    | js|   | jS r   )_checkr  _loadr  r   r8   r8   r9   
getmembers  s
   zTarFile.getmembersc                 C   s   	 dd |   D S )Nc                 S   s   g | ]}|j qS r8   r6  )r  r   r8   r8   r9   r    s    z$TarFile.getnames.<locals>.<listcomp>)r  r   r8   r8   r9   getnames  s   zTarFile.getnamesc                 C   sL  	 |  d |d ur|j}|d u r|}tj|\}}|tjd}|d}|  }| |_	|d u rA| j
s;t|}nt|}nt| }d}|j}t|r|j|jf}	| j
st|jdkrt|	| jv rt|| j|	 krtt}
| j|	 }n;t}
|	d r|| j|	< n/t|rt}
n't|rt}
nt|rt}
t|}nt|rt}
n
t |rt!}
nd S ||_||_"|j#|_$|j%|_&|
tkr|j'|_(nd|_(|j)|_*|
|_+||_,t-rzt-.|j$d |_/W n	 t0y   Y nw t1rzt12|j&d |_3W n
 t0y   Y nw |
tt!fv r$t4tdr$t4tdr$t5|j6|_7t8|j6|_9|S )Nawxr  r   r#   r   majorminor):r  r   r   r%   
splitdriver   r  r  r   r   r  lstatstatfstatfilenost_modeS_ISREGst_inost_devst_nlinkr  r  r4  S_ISDIRrB  S_ISFIFOr  S_ISLNKr  readlinkS_ISCHRrh  S_ISBLKri  r   st_uidr)   st_gidr*   st_sizer'   st_mtimer(   r.  r  pwdgetpwuidr+   r  grpgetgrgidr,   r   r  st_rdevr/  r  r0  )r   r   arcnamer   drvr   Zstatresr  Zstmdinoder.  r8   r8   r9   
gettarinfo  s   









zTarFile.gettarinfoT)r  c                C   s$  	 |    |d u r| }|D ]}|rg|jd u rtd ntt|j td|jp*|j|jp/|jf  |	 s;|
 rHtdd|j|jf   ntd|j  |jd u rYtd ntdt|jd d   t|j| rpd	nd
  |r| rtd|j  | rtd|j  t  qd S )Nz
??????????z%s/%sz%10sz%d,%dz%10dz????-??-?? ??:??:??z%d-%02d-%02d %02d:%02d:%02dr   r  r   z-> zlink to )r  r   rn   r  r  r+   r)   r,   r*   r  r  r/  r0  r'   r(   r   	localtimer   r  r  r  r  rm   )r   verboser  r   r8   r8   r9   r  h  s<   




zTarFile.listfilterc                C   sR  	 |  d |d u r|}| jd ur$tj|| jkr$| dd|  d S | d| | ||}|d u r>| dd|  d S |d urT||}|d u rT| dd|  d S | rvt|d}| 	|| W d    d S 1 sow   Y  d S |
 r| 	| |rtt|D ]}| jtj||tj||||d qd S d S | 	| d S )	Nr  r$   ztarfile: Skipped %rr#   ztarfile: Unsupported type %rtarfile: Excluded %rr  r  )r  r   r   r%   r  _dbgr  r  r  addfiler  r  listdiraddr   )r   r   r  	recursiver  r   fr8   r8   r9   r!    s>   
	"
zTarFile.addc                 C   s   	 |  d t|}|| j| j| j}| j| |  jt	|7  _| j
}|d urXt|| j|j|d t|jt\}}|dkrO| jtt|   |d7 }|  j|t 7  _| j| d S )Nr  )rc   r   r#   )r  r>  rK  rS   r6   r7   r   r_   r   r2   r  r\   r'   r]   r   r3   r  r   )r   r   r   rX   rc   rd   re   r8   r8   r9   r    s   

zTarFile.addfilec                 C   sh   |d u r| j }|d u rtS t|trtd|S t|r|S zt| W S  ty3   td|dd w )NzrString names are not supported for TarFile.extraction_filter. Use a function such as tarfile.data_filter directly.zfilter z
 not found)	extraction_filterr&  rZ  r]  	TypeErrorcallable_NAMED_FILTERSr  r0   )r   r  r8   r8   r9   _get_filter_function  s    

zTarFile._get_filter_function.)numeric_ownerr  c                C   s  	 g }|  |}|d u r| }|D ]&}| |||\}}	|d u r q| r)||	 | j|||  ||d q|jdd dd |D ]}	zsz||	|}W n tyg }
 z| |	t|
 W Y d }
~
W qBd }
~
ww |d u rt| |	d W qBt	j
||j}zt	|}W n ty   | |d Y W qBw t|js| |d W qB| j|||d	 | || | || W qB ty } z| | W Y d }~qBd }~ww d S )
N)	set_attrsr*  filter_functionc                 S   s   | j S r   r6  )r  r8   r8   r9   <lambda>	  s    z$TarFile.extractall.<locals>.<lambda>T)r  reversezexcluded by filtermissingznot a directory)r*  )r(  _get_extract_tarinfor  r   _extract_onesort_FILTER_ERRORS_log_no_directory_fixupreprr   r%   r   r   r  FileNotFoundErrorr  r  r  chownutimechmodr
   _handle_nonfatal_error)r   r%   r  r*  r  Zdirectoriesr,  r"  r   
unfilteredexcdirpathr  r   r8   r8   r9   
extractall  sd   

zTarFile.extractallc                 C   s   |  dd|j|f  d S )Nr$   z(tarfile: Not fixing up directory %r (%s))r  r   )r   r"  reasonr8   r8   r9   r4  1	  s   
zTarFile._log_no_directory_fixupr   c          	      C   s>   	 |  |}| |||\}}|d ur| |||| d S d S r   )r(  r0  r1  )	r   r"  r%   r+  r*  r  r,  r   r;  r8   r8   r9   extract5	  s   
zTarFile.extractc              
   C   s   	 t |tr| |}n|}d }z|||}W n/ ttfy0 } z| | W Y d }~nd }~w tyF } z| | W Y d }~nd }~ww |d u rV| dd|j	  dS |
 rht|}tj||j|_||fS )Nr$   r  )NN)rZ  r]  r  r   r   _handle_fatal_errorr
   r:  r  r   r  r>  r   r%   r   r  r3  )r   r"  r,  r%   r;  filteredr   r8   r8   r9   r0  I	  s*   

zTarFile._get_extract_tarinfoc              
   C   s   	 |  d z| j|tj||j||||d W d S  ty2 } z| | W Y d }~d S d }~w tyI } z| 	| W Y d }~d S d }~ww )Nr|   )r+  r*  r,  extraction_root)
r  _extract_memberr   r%   r   r   r   rA  r
   r:  )r   r   r%   r+  r*  r,  r   r8   r8   r9   r1  g	  s    
zTarFile._extract_onec                 C   s"   	 | j dkr | dd|  d S )Nr#   tarfile: %s)r  r  r   r   r8   r8   r9   r:  {	  s   
zTarFile._handle_nonfatal_errorc                 C   sr   	 | j dkr t|tr*|jd u r| dd|j  d S | dd|j|jf  d S | ddt|j|f  d S )Nr   r#   rE  ztarfile: %s %rztarfile: %s %s)r  rZ  r   filenamer  strerrorr.  rq   rF  r8   r8   r9   rA  	  s   


zTarFile._handle_fatal_errorc                 C   s|   	 |  d t|tr| |}n|}| s|jtvr"| | |S | s*|	 r<t| j
tr4td| | |S d S )Nr|   z'cannot extract (sym)link as file object)r  rZ  r]  r  r  r.  r  
fileobjectr  r  r   r   r	   extractfile_find_link_target)r   r"  r   r8   r8   r9   rJ  	  s   

zTarFile.extractfiler,  rC  c                C   s^  	 | d}|dtj}tj|}|r tj|s t| | s(|	 r5| 
dd|j|jf  n| 
d|j | rG| || nI| rR| || n>| r]| || n3| se| rl| || n$| st|	 r~| j||||d n|jtvr| || n| || |r| ||| |	 s| || | || d S d S d S )Nr  r#   z%s -> %srL  )r  r   r   r  r%   r!  r  makedirsr  r  r  r   r  r  makefiler  makedirr  makefifor  r  makedevmakelink_with_filterr.  r  makeunknownr7  r9  r8  )r   r   
targetpathr+  r*  r,  rC  Z	upperdirsr8   r8   r9   rD  	  sB   
	

zTarFile._extract_memberc                 C   sD   	 z|j d u rt| W d S t|d W d S  ty!   Y d S w )Ni  )r   r   mkdirFileExistsErrorr   r   rT  r8   r8   r9   rO  	  s   
zTarFile.makedirc                 C   s   	 | j }||j | j}t|d?}|jd ur8|jD ]\}}|| t|||t| q||j |	  nt|||jt| W d    d S W d    d S 1 sTw   Y  d S )Nr  )
r   r   r   r  r  r   r\   r   r'   truncate)r   r   rT  sourcerc   targetr   r'   r8   r8   r9   rN  	  s   


"zTarFile.makefilec                 C   s$   	 |  || | dd|j  d S )Nr#   z9tarfile: Unknown file type %r, extracted as regular file.)rN  r  r.  rW  r8   r8   r9   rS  
  s
   
zTarFile.makeunknownc                 C   s"   	 t tdrt| d S td)Nmkfifozfifo not supported by system)r   r   r[  r
   rW  r8   r8   r9   rP  
  s   
zTarFile.makefifoc                 C   sl   	 t tdrt tdstd|j}|d u rd}| r"|tjO }n|tjO }t||t	|j
|j d S )NmknodrQ  z'special devices not supported by systemr  )r   r   r
   r   r  r  S_IFBLKS_IFCHRr\  rQ  r/  r0  )r   r   rT  r   r8   r8   r9   rQ  
  s   
zTarFile.makedevc                 C   s   |  ||d d S r   )rR  rW  r8   r8   r9   makelink&
  r   zTarFile.makelinkc           	   
   C   s  	 d}z,|  rtj|rt| t|j| W d S tj|jr.t	|j| W d S W n t
y:   d}Y nw z| |}W n tyQ   |rPtdd  w |d u rY|}n#|d u ratdz|||}W n ty{ } zt||j|d }~ww |d ur| j||||d d S d S )NFTz%unable to resolve link inside archivez[makelink_with_filter: if filter_function is not None, extraction_root must also not be NonerL  )r  r   r%   lexistsunlinksymlinkr  r  r3  linksymlink_exceptionrK  r  r
   r3  r  r   rD  )	r   r   rT  r,  rC  Zkeyerror_to_extracterrorr;  rB  causer8   r8   r9   rR  )
  sX   

zTarFile.makelink_with_filterc              
   C   s
  	 t tdrt dkr|j}|j}|sFztr"|jr"t|jd }W n	 ty,   Y nw zt	r;|j
r;t	|j
d }W n	 tyE   Y nw |d u rLd}|d u rRd}z| rft tdrft||| W d S t||| W d S  ty } ztd|d }~ww d S d S )Ngeteuidr   r$   r;   lchownzcould not change owner)r   r   rf  r*   r)   r  r,   getgrnamr  r  r+   getpwnamr  rg  r7  r   r
   )r   r   rT  r*  gur   r8   r8   r9   r7  [
  s@   


zTarFile.chownc              
   C   sH   	 |j d u rd S z
t||j  W d S  ty# } ztd|d }~ww )Nzcould not change mode)r   r   r9  r   r
   )r   r   rT  r   r8   r8   r9   r9  |
  s   

zTarFile.chmodc              
   C   s\   	 |j }|d u r
d S ttdsd S zt|||f W d S  ty- } ztd|d }~ww )Nr8  z"could not change modification time)r(   r   r   r8  r   r
   )r   r   rT  r(   r   r8   r8   r9   r8  
  s   

zTarFile.utimec                 C   s<  	 |  d | jd ur| j}d | _|S | j| j kr.| j| jd  | jds.tdd }	 z| j	| }W n t
yf } z!| jr\| dd| j|f  |  jt7  _W Y d }~q0W Y d }~nd }~w ty } z-| jr| dd| j|f  |  jt7  _W Y d }~q0| jdkrtt|d W Y d }~nqd }~w ty   | jdkrtdd Y n[ ty } z| jdkrtt|d W Y d }~nBd }~w ty } ztt|d d }~w ty
 } zzdd l}t||jrtd	| d | ty   |w d }~ww 	 |d ur| j| |S d| _|S )
NZrar#   rZ   Tr$   z0x%X: %sr   z
empty filezzlib error: )r  r  r   r   r   r   r^   r   r   r  rw   r  r  r   rK   r]  ru   rv   rx   	Exceptionr   rZ  r   r   r  r   r  )r   mr   r   r   r8   r8   r9   r  
  sv   





	
zTarFile.nextc           	      C   s   	 |   }d}|d ur$z||}W n ty   d}Y nw |d | }|r,tj|}t|D ]"}|r=|j|jkr<d}q0|rGtj|j}n|j}||krR|  S q0|rYt|d S )NFT)	r  indexr0   r   r%   r   reversedr   r   )	r   r   r   	normalizer  Zskippingrn  r"  member_namer8   r8   r9   r  
  s4   zTarFile._getmemberc                 C   s"   	 	 |   }|d u rnqd| _d S r   )r  r  r  r8   r8   r9   r  
  s   
zTarFile._loadc                 C   s@   	 | j rtd| jj |d ur| j|vrtd| j d S d S )Nz%s is closedzbad operation for mode %r)r   r   r   rq   r   )r   r   r8   r8   r9   r    s   zTarFile._checkc                 C   sb   	 |  rdtd tj|j|jf}d }n|j}|}| j||dd}|d u r/t	d| |S )Nr  T)r   rp  zlinkname %r not found)
r  r   r  r   r%   r!  r   r  r  r  )r   r   r  limitr"  r8   r8   r9   rK    s    zTarFile._find_link_targetc                 c   s    	 | j r| jE d H  d S d}| jd ur|  }|d7 }|V  	 |t| jk r-| j| }n| j s<|  }|s;d| _ d S nd S |d7 }|V  q )Nr   r#   T)r  r  r  r  r2   )r   rn  r   r8   r8   r9   __iter__!  s.   
zTarFile.__iter__c                 C   s"   	 || j krt|tjd d S d S )Nfile)r  rm   rk   stderr)r   levelmsgr8   r8   r9   r  @  s   
zTarFile._dbgc                 C   s   |    | S r   )r  r   r8   r8   r9   	__enter__F  s   zTarFile.__enter__c                 C   s.   |d u r
|    d S | js| j   d| _d S r   )r   r   r   r   )r   r.  rJ  	tracebackr8   r8   r9   __exit__J  s
   

zTarFile.__exit__)Nr|   NNNNNNrE  NNNN)r|   N)r|   Nr   )r|   NN)NNNTr   r   )r)  N)r   T)TFr   )?rq   rr   rs   r  r  r  r  r   rS   r   r6   r7   r   r   r   rI  r$  r   r  r  r   r  r  r  r  r  r   r  r  r  r  r  r!  r  r(  r>  r4  r@  r0  r1  r:  rA  rJ  rD  rO  rN  rS  rP  rQ  r_  rR  r7  r9  r8  r  r  r  r  rK  rs  r  ry  r{  r8   r8   r8   r9   r     s    
o] 


c&
3E
 82!

?(

	r   c                 C   sD   	 zt | drt| d}nt| }|  W dS  ty!   Y dS w )Nr^   )r   TF)r   r   r   r   )r   r   r8   r8   r9   r   X  s   
r   c               	   C   sh  dd l } d}| j|d}|jdddddd	 |jd
dtdd |jdd}|jddddd |jdddddd |jdddddd |jdd dd!d | }|jr]|jd u r]|d"d# |j	d ur|j	}t
|rt|d$}|  t| tjd% W d    n1 sw   Y  |jrtd&| d S d S |d"d'| d S |jd ur|j}t
|rt|d(}|j|jd) W d    d S 1 sw   Y  d S |d"d'| d S |jd urRt|jd"kr|jd }tj}nt|jd*kr|j\}}n|d"|  t
|rGt|d(}|j||jd+ W d    n	1 s%w   Y  |jrE|d,kr9d-|}	nd.||}	t|	 d S d S |d"d'| d S |jd ur|jd}
tj|
\}}d/d/d0d0d1d1d1d1d2}||v r|d3||  nd4}|j}t|
|}|D ]}|| qW d    n	1 sw   Y  |jrtd5|
 d S d S d S )6Nr   z3A simple command-line interface for tarfile module.)descriptionz-vz	--verbose
store_trueFzVerbose output)actiondefaulthelpz--filterz<filtername>zFilter for extraction)metavarchoicesr  T)requiredz-lz--list	<tarfile>zShow listing of a tarfile)r  r  z-ez	--extract+)r  z<output_dir>zExtract tarfile into target dir)nargsr  r  z-cz--create)z<name>z<file>zCreate tarfile from sourcesz-tz--testzTest if a tarfile is validr#   z&--filter is only valid for extraction
r|   rt  z{!r} is a tar archive.z{!r} is not a tar archive.
r  )r  r$   )r%   r  r)  z{!r} file is extracted.z+{!r} file is extracted into {!r} directory.r   r   r   )r   z.tgzz.xzz.txzz.bz2z.tbzz.tbz2z.tb2zw:r}   z{!r} file created.)argparseArgumentParseradd_argumentr'  add_mutually_exclusive_group
parse_argsr  r@  exittestr   r   r  rm   rk   rv  r  rS   r  r   r2   r   curdirformat_helpr>  Zcreatepopr%   splitextr!  )r  r}  parserr  argsr`   r   Ztfr  rx  Ztar_namer  extZcompressionsZtar_modeZ	tar_files	file_namer8   r8   r9   maink  s   





"


r  __main__r|  )nversion
__author____credits__builtinsr   r  rk   r   r   r[   r  r   rV   r>  rewarningsr  r   r  AttributeErrorNotImplementedErrorrd  r   	NameError__all__r3   r   r  rS  rN  rP  rO  re  r4  r}  r  r  rh  ri  rB  r  ZCONTTYPErV  rU  r~  r_  ra  r  r   r   r   r   r  r  r  r  r  r[  rI   r  r   r   getfilesystemencodingr:   r?   rN   rT   rY   r\   rn   rl  r   r
   r   r   r	   r   ru   rv   rw   rK   rx   rz   r   objectr   r   BufferedReaderr   r   r   r  r  r  r  r  r3  r%  r&  r*  r,  r'  r=  compiler  r   r   r   r  rq   r8   r8   r8   r9   <module>   s(  	
 sh


D
      &         a
_
