
    9c                        d dl Z d dlZd dlZd dlZd dlZ	 d dlZ G d de	      Z
 G d de
      Z G d de
      Z G d d	e	      Z G d
 de	      Zedk(  r#d dlZ	 ej"                  d   Zej"                  d   Z G d dej.                  j0                  j2                        Zy# e$ r
ZY dZ[dZ[ww xY w# e$ r4Z edej"                  d    z          ej,                  d       Y dZ[pdZ[ww xY w)    Nc                   $    e Zd Zd Zd Zd Zd Zy)RomFSCommonc                     t        j                  d| j                  z  | j                  | j                  | j                  dz          d   }| xj                  dz  c_        |S )Nz%sL   r   )structunpack
endiannessdataindex)selfvalues     @/usr/lib/python3/dist-packages/binwalk/plugins/dlromfsextract.py_read_next_wordzRomFSCommon._read_next_word   sK    edoo5tyyDJJYZN7[\]^_

a
    c                     t        | j                  | j                  | j                  dz          }| xj                  dz  c_        |S )Nr   intr
   r   )r   uids     r   _read_next_uidzRomFSCommon._read_next_uid   s5    $))DJJtzzA~67

a

r   c                     t        |      }| j                  | j                  | j                  |z    }| xj                  |z  c_        |S Nr   )r   sizer
   s      r   _read_next_blockzRomFSCommon._read_next_block   s;    4yyyDJJ$56

d
r   c                     d}	 | j                   | j                     }	 t        |      }|dk(  r	 |S ||z  }| xj                  dz  c_        H# t        $ r
}Y d }~1d }~ww xY w)N     )r
   r   chr	TypeError)r   r
   bytees       r   _read_next_stringzRomFSCommon._read_next_string   so    99TZZ(D4y v~  

a
   s   A 	AAN)__name__
__module____qualname__r   r   r   r"    r   r   r   r      s    

r   r   c                        e Zd ZdZdZdZddZy)
RomFSEntryr      i  [ c                 ~   || _         || _        d| _        | j                         | _        | j                         | _        | j                         | _        | j                         | _        | j                         | _        | j                         | _	        | j                         | _
        | j                         | _        y )Nr   )r
   r	   r   r   typeunknown2unknown3r   unknown4offsetunknown5r   r   )r   r
   r	   s      r   __init__zRomFSEntry.__init__5   s    	$
((*	,,.,,.((*	,,.**,,,.&&(r   N<)r#   r$   r%   DIR_STRUCT_MASK	DATA_MASKCOMPRESSED_MASKr1   r&   r   r   r(   r(   /   s     OI O)r   r(   c                       e Zd ZdZddZd Zy)RomFSDirStruct    c                     d| _         || _        || _        d| _        d | _        g | _        | j                         D ]A  \  }}| j                  || _        |dv rd| _        %| j
                  j                  ||f       C y )Nr   F)...T)r   r
   r	   	directoryr   lsnextappend)r   r
   r	   r   entrys        r   r1   zRomFSDirStruct.__init__H   s|    
	$ IIK 	)LS%xx#!%GGNNC<(	)r   c              #     K   | j                   t        | j                        k  r| j                         }| j                         }| j	                         }t        dt        |      z         }t        || j                  z        }|dk(  r| j                  |z
  }n(| j                  t        ||| j                  z  z
        z
  }|dkD  r| j                  |      }||f | j                   t        | j                        k  ry y w)Nr)   r   )r   lenr
   r   r"   r   SIZEr   )r   r   	dont_carerA   
total_sizecountmod	remainders           r   r?   zRomFSDirStruct.nextZ   s     jj3tyy>)&&(C,,.I**,EUSZ/0J
TYY./Ezii*,ii#jEDII4E&F"GGQw 11#6	, jj3tyy>)s   C=D DNr2   )r#   r$   r%   rD   r1   r?   r&   r   r   r8   r8   D   s    D)$r   r8   c                       e Zd Zd Zy)FileContainerc                      y r   r&   r   s    r   r1   zFileContainer.__init__o   s    r   N)r#   r$   r%   r1   r&   r   r   rK   rK   m   s    r   rK   c                   .    e Zd ZdZdZddZd Zd Zd Zy)RomFSr9   c                 z    || _         t        |d      j                         | _        | j	                         | _        y )Nrb)r	   openreadr
   _process_all_entriesentries)r   fnamer	   s      r   r1   zRomFS.__init__x   s0    $%**,	002r   c                 z   | j                   |   j                  }|| j                   |   j                  z   }| j                  || }	 t	        j
                  |      }|S # t        $ r}|d }~wt        $ rF}	 t        j
                  |      }n$# t        $ r}|d }~wt        $ r
}Y d }~nd }~ww xY wY d }~|S d }~ww xY wr   )	rU   r/   r   r
   lzma
decompressKeyboardInterrupt	Exceptionzlib)r   r   startendr
   r!   s         r   get_datazRomFS.get_data}   s    S!((dll3',,,yys#
	??4(D  ! 	G 	t,$   	sN   A 	B:&A((B:5B
B5	B,BB,"B5'B,,B55B:c                    | j                   |   j                  }|dk7  rV| j                   |   j                  }t        j                  j                  | j                   |   j                  |      }|dk7  rV|j                  dd      S )Nr   r<   r   )rU   nameparentospathjoinreplace)r   r   rd   s      r   
build_pathzRomFS.build_path   sp    ||C %%Qh,,s#**C77<<S 1 6 6=D Qh ||D"%%r   c                    i }| j                   }	 	 t        | j                  ||| j                  z    | j                        }|j                  |vrt               ||j                  <   |j                  ||j                     _        |j                  ||j                     _	        |j                  ||j                     _
        |j                  dk(  r,t        j                  j                  ||j                     _        |j                  |j                  z  rd||j                     _
        t!        | j                  |j                  |j                  |j                  z    | j                        }|j"                  D ]4  \  }}||vrt               ||<   |j                  ||   _        |||   _        6 nd||j                     _
        || j                  z  }# t
        $ r}Y d }~|S d }~ww xY w)N)r	   r   r=   r
   )SUPERBLOCK_SIZEr(   r
   FILE_ENTRY_SIZEr	   
ValueErrorr   rK   r/   r   r+   rc   rd   sepra   r4   r8   r>   rb   )r   rU   r/   rA   r!   dsr   ra   s           r   rT   zRomFS._process_all_entries   s   %%"499VFT=Q=Q4Q#R_c_n_no 99'%2_		"(-GEII%&+jjGEII#&+jjGEII#yyA~*,''++		"'zzE111*5		"'#DIIell5<<%**;T$Ubfbqbqr#%55 -KS$'>'4*,&&GCL'(,GCL%	- +1		"'d***F5   0 3s   1G 	G+&G+Nr2   )	r#   r$   r%   ri   rj   r1   r_   rg   rT   r&   r   r   rO   rO   s   s     OO3
(& r   rO   __main__r      z)Usage: %s <input file> <output directory>c                   &    e Zd ZdZdgZdZd Zd Zy)DlinkROMFSExtractPluginz 
    Gzip extractor plugin.
    	Signaturei (  c                     | j                   j                  j                  r5| j                   j                  j                  d ddd| j                         y y )Nz^d-link romfs filesystemromfsF)txtruleregex	extensionrecursecmd)module	extractorenabledadd_rulerM   s    r   initzDlinkROMFSExtractPlugin.init   sK     ;;  ((KK!!**41K5<38/3~~	 + ? )r   c                    t         j                  j                  |      }t         j                  j                  t         j                  j	                  |      d      }t
        j                  j                  j                  |      }t        |      }t        j                  |       |j                  j                         D ]  \  }}t        |d      st        |d      s |j                  |      j                  t         j                  j                         }t         j                  j                  ||      }|j"                  dk(  r5t         j                  j%                  |      st        j&                  |       |j)                  |      }t+        |d      5 }	|	j-                  |       d d d         y# 1 sw Y   xY w)Nz
romfs-rootra   rb   r=   wbT)rc   rd   abspathre   dirnamebinwalkcorecommonunique_file_namerO   mkdirrU   itemshasattrrg   striprl   r+   existsmakedirsr_   rR   write)
r   rV   infileoutdirfsr   inford   fdatafps
             r   r{   z!DlinkROMFSExtractPlugin.extractor   s9   'bggoof5|D$$55f= 6]
::++- 
	(KS$tV$x)@}}S)//<VT299+BGGNN54IKK&KK,EeT* (b( (
	( ( (s   F66F?	N)r#   r$   r%   __doc__MODULES
BLOCK_SIZEr~   r{   r&   r   r   rq   rq      s     mGJ	?r   rq   )rc   r\   r   binwalk.core.pluginr   binwalk.core.commonrX   ImportErrorr!   objectr   r(   r8   rK   rO   r#   sysargvr   r   
IndexErrorprintexitr   pluginPluginrq   r&   r   r   <module>r      s    	    	
 &  F) )*&[ &RF GF GT z!!(gll1188 (A  		v  :SXXa[HIs)   B# B5 #B2-B25C.:*C))C.