
    9c                     v    d dl Z d dlZd dlZd dlZ G d dej
                  j                  j                        Zy)    Nc                   N    e Zd ZdZdZdZdgZd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zy)
CPIOPluginz
    Ensures that ASCII CPIO archive entries only get extracted once.
    Also provides an internal CPIO extraction wrapper around the Unix
    cpio utility since no output directory can be provided to it directly.
    z	cpio-rootn   	Signaturec                     d| _         | j                  j                  j                  r4| j                  j                  j	                  dd| j                  d       y y )Nr   z^ascii cpio archivecpioF)regex	extensioncmdrecurse)consecutive_hitsmodule	extractorenabledadd_ruleselfs    6/usr/lib/python3/dist-packages/binwalk/plugins/cpio.pyinitzCPIOPlugin.init   sO     !;;  ((KK!!**1F5;/3~~38 + : )    c                    d }t         j                  j                  |      }t         j                  j                  t         j                  j	                  |      | j
                        }t        j                  j                  j                  |      }	 t        |d      }t        t         j                  d      }t        j                  |       	 t        j                         }t        j                  |       	 t!        j"                  g d|||      }t        j                  |       |j%                          |j%                          |dv ryy# t        $ r Y yw xY w# t        $ r Y yw xY w# t        $ r d}Y fw xY w)NrbF)r   z-dz-iz--no-absolute-filenames)stdinstderrstdout)r      T)ospathabspathjoindirnameCPIO_OUT_DIRbinwalkcorecommonunique_file_nameopendevnullmkdirOSErrorgetcwdchdir
subprocesscallclose)r   fnameresultout_dir_base_nameout_dirfpinfperrcurdirs           r   r   zCPIOPlugin.extractor   s.   &GGLL)?ARARS,,%%667HI	t$DT*EHHW	YY[FHHW	__%T+/,1,13F 	

V1  		  		  	F	s6   ;E )E 9E- 	EE	E*)E*-E;:E;c                 .    d| _         d | _        d| _        y )NFr   )found_archivefound_archive_in_filer   r   s    r   pre_scanzCPIOPlugin.pre_scan?   s    "%)" !r   c                 $    | j                          y )N)r;   )r   fs     r   new_filezCPIOPlugin.new_fileE   s    r   c                 ^    d}d|v r&|j                  d      d   j                  d      d   }|S )N zfile name: "   "r   )split)r   descriptionnames      r   _get_file_namezCPIOPlugin._get_file_nameI   s9    [($$^4Q7==cB1EDr   c                     d }d|v r5|j                  d      d   j                  d      d   }	 t        |d      }|S |S # t        $ r Y |S w xY w)Nzfile name length: "rA   rB   r   rC   int
ValueError)r   rD   lengthlength_strings       r   _get_file_name_lengthz CPIOPlugin._get_file_name_lengthO   sk     K/'--.CDQGMMcRSTUM]A. v     > 	A
Ac                     d }d|v r5|j                  d      d   j                  d      d   }	 t        |d      }|S |S # t        $ r Y |S w xY w)Nzfile size: "rA   rB   r   rH   )r   rD   sizesize_strings       r   _get_file_sizezCPIOPlugin._get_file_sizeY   si    [(%++N;A>DDSI!LK;* t  rN   c                    |j                   rz|j                  j                  d      r!| j                  |j                        }| j	                  |j                        }| j                  |j                        }d ||fv s|t        |      dz   k7  rd|_         y | j                  |z   |z   |_        | xj                  dz  c_	        | j                  r#| j                  |j                  j                  k7  r*|j                  j                  | _        d| _
        d|_        y d|j                  v rd| _
        d|_        d| _	        y d|_        y | j                  dk  rd| _
        d | _        d| _	        y | j                  dk\  rd|_         y y y )NzASCII cpio archiverA   FTz
TRAILER!!!r      )validrD   
startswithrR   rF   rM   lenCPIO_HEADER_SIZEjumpr   r9   r:   filer   extract)r   r2   	file_size	file_namefile_name_lengths        r   scanzCPIOPlugin.scanc   s|   <<
 !!,,-AB !//0B0BC	 //0B0BC	#'#=#=f>P>P#Q  I'788<LPST]P^_`P`<` $)FL #33i?BRR%%*%))T-G-G6;;K[K[-[ 281A1AD.)-D&%)FN!V%7%77).D&%*FN,-D) &+FN&&* &+"-1*()%&&!+  %	 ,] r   N)__name__
__module____qualname____doc__r#   rX   MODULESr   r   r;   r>   rF   rM   rR   r_    r   r   r   r      sD    
 LmG:"H"3%r   r   )	r   r.   binwalk.core.commonr$   binwalk.core.pluginr%   pluginPluginr   re   r   r   <module>rj      s/    	   P%$$++ P%r   