
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
Kl„fÂx  ã            I   @   sÖ  d dl Z d dlZd dlZd dlZddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	 �dZ
dddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdOdNdPdQœ4ZdRZdSZdTZdUZdVZdWZdXZdYZdZZd[Zd\Zd]Zd^Zd_Zd`ZdaZdbZdcZddZdedf„ Zdgdh„ Z didj„ Z!dkdl„ Z"dmdn„ Z#dodp„ Z$dqdr„ Z%dsdt„ Z&dudv„ Z'da(da)dwa*da+dxa,�d	dydz„Z-d{d|„ Z.d}d~„ Z/dd€„ Z0d�d‚„ Z1dƒd„„ Z2d…d†„ Z3d‡dˆ„ Z4d‰dŠ„ Z5d‹dŒ„ Z6d�dŽ„ Z7d�d�„ Z8d‘d’„ Z9d“d”„ Z:d•d–„ Z;d—d˜„ Z<d™dš„ Z=d›dœ„ Z>d�dž„ Z?dŸd „ Z@d¡d¢„ ZAd£d¤„ ZBd¥d¦„ ZCd§d¨„ ZDd©dª„ ZEd«d¬„ ZFd­d®„ ZGd¯d°„ ZHd±d²„ ZId³d´„ ZJdµd¶„ ZKd·d¸„ ZLd¹dº„ ZMd»d¼„ ZNd½d¾„ ZOd¿dÀ„ ZPdÁdÂ„ ZQdÃdÄ„ ZRdÅdÆ„ ZSdÇdÈ„ ZTdÉdÊ„ ZUdËdÌ„ ZVdÍdÎ„ ZWdÏdÐ„ ZXdÑdÒ„ ZYdÓdÔ„ ZZdÕdÖ„ Z[d×dØ„ Z\dÙdÚ„ Z]dÛdÜ„ Z^dÝdÞ„ Z_dßdà„ Z`dádâ„ Zadãdä„ Zbdådæ„ Zcdçdè„ Zddédê„ Zedëdì„ Zfdídî„ Zgdïdð„ Zhdñdò„ Zidódô„ Zjdõdö„ Zkd÷dø„ Zldùdú„ Zmdûdü„ Zndýdþ„ Zodapdaqdÿ�d „ Zr�d
�d�d„Zs�d�d„ Zt�d�d�d„ZudS (  é    Né   )Úaccess)Údefaults)Úlex)Ú	refpolicy)ÚyaccÚTICKÚSQUOTEÚOBRACEÚCBRACEÚSEMIÚCOLONÚOPARENÚCPARENÚCOMMAÚMINUSÚTILDEÚASTERISKÚAMPÚBARÚEXPLÚEQUALÚFILENAMEÚ
IDENTIFIERÚNUMBERÚPATHÚ	IPV6_ADDRÚMODULEÚPOLICY_MODULEÚREQUIREÚSIDÚGENFSCONÚFS_USE_XATTRÚFS_USE_TRANSÚFS_USE_TASKÚPORTCONÚNODECONÚNETIFCONÚPIRQCONÚIOMEMCONÚ	IOPORTCONÚPCIDEVICECONÚDEVICETREECONÚCLASSÚTYPEATTRIBUTEÚROLEATTRIBUTEÚTYPEÚ	ATTRIBUTEÚATTRIBUTE_ROLEÚALIASÚ	TYPEALIASÚBOOLÚTRUEÚFALSEÚIFÚELSEÚROLEÚTYPESÚALLOWÚ	DONTAUDITÚ
AUDITALLOWÚ
NEVERALLOWÚ
PERMISSIVEÚ
TYPEBOUNDSÚTYPE_TRANSITIONÚTYPE_CHANGEÚTYPE_MEMBERÚRANGE_TRANSITIONÚROLE_TRANSITIONÚ
OPT_POLICYÚ	INTERFACEÚTUNABLE_POLICYÚGEN_REQÚTEMPLATEÚGEN_CONTEXTÚIFELSEÚIFDEFÚIFNDEFÚDEFINE)4ÚmoduleZpolicy_moduleZrequireZsidZgenfsconÚfs_use_xattrÚfs_use_transÚfs_use_taskZportconZnodeconZnetifconZpirqconZiomemconZ	ioportconZpcideviceconZdevicetreeconÚclassZtypeattributeZroleattributeÚtypeZ	attributeZattribute_roleÚaliasZ	typealiasÚboolÚtrueZfalseÚifÚelseÚroleÚtypesZallowÚ	dontauditÚ
auditallowÚ
neverallowZ
permissiveZ
typeboundsZtype_transitionÚtype_changeÚtype_memberZrange_transitionZrole_transitionZoptional_policyÚ	interfaceZtunable_policyZgen_requireÚtemplateZgen_contextZifelseZifndefÚifdefZdefinez\`z\'z\{z\}z\;+z\:z\(z\)z\,z\-z\~z\*z\&z\|z\!z\=z[0-9\.]+z/[a-zA-Z0-9)_\.\*/\$]*z 	c             C   s   | S )z2[a-fA-F0-9]{0,4}:[a-fA-F0-9]{0,4}:([a-fA-F0-9]|:)*© )Útrf   rf   ú/usr/lib/python3.6/refparser.pyÚt_IPV6_ADDRè   s    ri   c             C   s   | j  jd7  _dS )zdnl.*\nr   N)ÚlexerÚlineno)rg   rf   rf   rh   Út_m4commentî   s    rl   c             C   s   | j dƒ dS )zdefine.*refpolicywarn\(.*\nr   N)Úskip)rg   rf   rf   rh   Út_refpolicywarn1ó   s    rn   c             C   s   | j  jd7  _dS )zrefpolicywarn\(.*\nr   N)rj   rk   )rg   rf   rf   rh   Út_refpolicywarnù   s    ro   c             C   s   t j| jdƒ| _| S )z#[a-zA-Z_\$][a-zA-Z0-9_\-\+\.\$\*~]*r   )ÚreservedÚgetÚvaluerV   )rg   rf   rf   rh   Út_IDENTIFIERÿ   s    rs   c             C   s   t j| jdƒ| _| S )z\"[a-zA-Z0-9_\-\+\.\$\*~ :]+\"r   )rp   rq   rr   rV   )rg   rf   rf   rh   Ú
t_FILENAME  s    rt   c             C   s   | j  jd7  _dS )z\#.*\nr   N)rj   rk   )rg   rf   rf   rh   Ú	t_comment  s    ru   c             C   s    t d| jd  ƒ | jdƒ d S )NzIllegal character '%s'r   r   )Úprintrr   rm   )rg   rf   rf   rh   Út_error  s    rw   c             C   s   | j  jt| jƒ7  _dS )z\n+N)rj   rk   Úlenrr   )rg   rf   rf   rh   Ú	t_newline  s    ry   Ú Tc             C   sX   | d krd S xF| D ]>}|d kr q||_ |d k	rB|jjd||fƒ q|jjd|ƒ qW d S )Nr   )ÚparentÚchildrenÚinsert)Zstmtsr{   ÚvalÚsrf   rf   rh   Úcollect-  s    
r€   c             C   s8   x2| D ]*}t j|ƒr&|jt j|ƒƒ q|j|ƒ qW d S )N)ÚsptZhas_keyÚupdateZby_nameÚadd)Zidsr   Úidrf   rf   rh   Úexpand9  s    

r…   c             C   sN   t | ƒdkr&| d r&tjj| d ƒ n$t | ƒdkrJ| d rJtjj| d ƒ dS )z^statements : statement
                  | statements statement
                  | empty
    é   r   N)rx   Úmr|   Úappend)Úprf   rf   rh   Úp_statementsA  s    rŠ   c             C   s   | d | d< dS )zµstatement : interface
                 | template
                 | obj_perm_set
                 | policy
                 | policy_module_stmt
                 | module_stmt
    r   r   Nrf   )r‰   rf   rf   rh   Úp_statementK  s    r‹   c             C   s   dS )zempty :Nrf   )r‰   rf   rf   rh   Úp_emptyU  s    rŒ   c             C   s.   t jƒ }| d |_| d |_d|_ || d< dS )zHpolicy_module_stmt : POLICY_MODULE OPAREN IDENTIFIER COMMA NUMBER CPARENé   é   Tr   N)r   ÚModuleDeclarationÚnameÚversion)r‰   r‡   rf   rf   rh   Úp_policy_module_stmt`  s
    

r’   c             C   s(   t j| d ƒ}t| d |ƒ || d< dS )zainterface : INTERFACE OPAREN TICK IDENTIFIER SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN
    é   é   r   N)r   Ú	Interfacer€   )r‰   Úxrf   rf   rh   Úp_interfaceh  s    r—   c             C   s(   t j| d ƒ}t| d |ƒ || d< dS )z¿template : TEMPLATE OPAREN TICK IDENTIFIER SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN
                | DEFINE OPAREN TICK IDENTIFIER SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN
    r“   r”   r   N)r   ZTemplater€   )r‰   r–   rf   rf   rh   Ú
p_templateo  s    r˜   c             C   s   d| d< dS )z4define : DEFINE OPAREN TICK IDENTIFIER SQUOTE CPARENNr   rf   )r‰   rf   rf   rh   Úp_definew  s    r™   c             C   sz   t | ƒdkr"| d r"| d | d< nTt | ƒdkrv| d sL| d rv| d | d< n*| d sb| d | d< n| d | d  | d< dS )zlinterface_stmts : policy
                       | interface_stmts policy
                       | empty
    r†   r   r   N)rx   )r‰   rf   rf   rh   Úp_interface_stmts~  s    rš   c             C   sF   t jƒ }t| d |dd� t| ƒdkr8t| d |dd� |g| d< dS )	z»optional_policy : OPT_POLICY OPAREN TICK interface_stmts SQUOTE CPAREN
                       | OPT_POLICY OPAREN TICK interface_stmts SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN
    r“   T)r~   é   r”   Fr   N)r   ZOptionalPolicyr€   rx   )r‰   Úorf   rf   rh   Úp_optional_policyŽ  s
    r�   c             C   sP   t jƒ }| d |_t| d |dd� t| ƒdkrBt| d |dd� |g| d< d	S )
zùtunable_policy : TUNABLE_POLICY OPAREN TICK cond_expr SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN
                      | TUNABLE_POLICY OPAREN TICK cond_expr SQUOTE COMMA TICK interface_stmts SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN
    r“   r”   T)r~   é   é   Fr   N)r   ZTunablePolicyÚ	cond_exprr€   rx   )r‰   r–   rf   rf   rh   Úp_tunable_policy˜  s    
r¡   c             C   s   dS )a×  ifelse : IFELSE OPAREN TICK IDENTIFIER SQUOTE COMMA COMMA TICK IDENTIFIER SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN optional_semi
              | IFELSE OPAREN TICK IDENTIFIER SQUOTE COMMA TICK IDENTIFIER SQUOTE COMMA TICK interface_stmts SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN optional_semi
              | IFELSE OPAREN TICK IDENTIFIER SQUOTE COMMA TICK SQUOTE COMMA TICK interface_stmts SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN optional_semi
    Nrf   )r‰   rf   rf   rh   Úp_ifelse£  s    r¢   c             C   sb   t j| d ƒ}| d dkr d}nd}t| d ||d� t| ƒdkrTt| d |dd� |g| d	< d
S )aJ  ifdef : IFDEF OPAREN TICK IDENTIFIER SQUOTE COMMA TICK statements SQUOTE CPAREN optional_semi
             | IFNDEF OPAREN TICK IDENTIFIER SQUOTE COMMA TICK statements SQUOTE CPAREN optional_semi
             | IFDEF OPAREN TICK IDENTIFIER SQUOTE COMMA TICK statements SQUOTE COMMA TICK statements SQUOTE CPAREN optional_semi
    r“   r   re   TFr”   )r~   rŸ   r   N)r   ZIfDefr€   rx   )r‰   r–   Úvrf   rf   rh   Úp_ifdef±  s    r¤   c             C   s8   t j| d d�}t| ƒdkr,|jj| d ƒ || d< dS )zÄinterface_call : IDENTIFIER OPAREN interface_call_param_list CPAREN
                      | IDENTIFIER OPAREN CPAREN
                      | IDENTIFIER OPAREN interface_call_param_list CPAREN SEMIr   )Zifnamer“   r�   r   N)r   ZInterfaceCallrx   ÚargsÚextend)r‰   Úirf   rf   rh   Úp_interface_callÀ  s    r¨   c             C   s6   t | ƒdkr| d | d< n| d d| d  g| d< dS )zúinterface_call_param : IDENTIFIER
                            | IDENTIFIER MINUS IDENTIFIER
                            | nested_id_set
                            | TRUE
                            | FALSE
                            | FILENAME
    r†   r   r   ú-r�   N)rx   )r‰   rf   rf   rh   Úp_interface_call_paramÊ  s    
rª   c             C   s6   t | ƒdkr| d g| d< n| d | d g | d< dS )z�interface_call_param_list : interface_call_param
                                 | interface_call_param_list COMMA interface_call_param
    r†   r   r   r�   N)rx   )r‰   rf   rf   rh   Úp_interface_call_param_listÙ  s    r«   c             C   s$   t j| d ƒ}| d |_|| d< dS )zRobj_perm_set : DEFINE OPAREN TICK IDENTIFIER SQUOTE COMMA TICK names SQUOTE CPARENr“   r”   r   N)r   Z
ObjPermSetÚperms)r‰   r   rf   rf   rh   Úp_obj_perm_setã  s    
r­   c             C   s   | d | d< dS )z¡policy : policy_stmt
              | optional_policy
              | tunable_policy
              | ifdef
              | ifelse
              | conditional
    r   r   Nrf   )r‰   rf   rf   rh   Úp_policyí  s    r®   c             C   s   | d r| d g| d< dS )aº  policy_stmt : gen_require
                   | avrule_def
                   | typerule_def
                   | typebound_def
                   | typeattribute_def
                   | roleattribute_def
                   | interface_call
                   | role_def
                   | role_allow
                   | permissive
                   | type_def
                   | typealias_def
                   | attribute_def
                   | attribute_role_def
                   | range_transition_def
                   | role_transition_def
                   | bool
                   | define
                   | initial_sid
                   | genfscon
                   | fs_use
                   | portcon
                   | nodecon
                   | netifcon
                   | pirqcon
                   | iomemcon
                   | ioportcon
                   | pcidevicecon
                   | devicetreecon
    r   r   Nrf   )r‰   rf   rf   rh   Úp_policy_stmt÷  s    r¯   c             C   s.   t jƒ }| d |_| d |_d|_ || d< dS )z+module_stmt : MODULE IDENTIFIER NUMBER SEMIr†   r�   Fr   N)r   r�   r�   r‘   )r‰   r‡   rf   rf   rh   Úp_module_stmt  s
    

r°   c             C   s   dS )zlgen_require : GEN_REQ OPAREN TICK requires SQUOTE CPAREN
                   | REQUIRE OBRACE requires CBRACENrf   )r‰   rf   rf   rh   Úp_gen_require!  s    r±   c             C   s   dS )zsrequires : require
                | requires require
                | ifdef
                | requires ifdef
    Nrf   )r‰   rf   rf   rh   Ú
p_requires)  s    r²   c             C   s   dS )zñrequire : TYPE comma_list SEMI
               | ROLE comma_list SEMI
               | ATTRIBUTE comma_list SEMI
               | ATTRIBUTE_ROLE comma_list SEMI
               | CLASS comma_list SEMI
               | BOOL comma_list SEMI
    Nrf   )r‰   rf   rf   rh   Ú	p_require1  s    r³   c             C   sH   t jƒ }| d |_| d |_| d |_t| ƒdkr<| d |_|| d< dS )zšsecurity_context : IDENTIFIER COLON IDENTIFIER COLON IDENTIFIER
                        | IDENTIFIER COLON IDENTIFIER COLON IDENTIFIER COLON mls_range_defr   r�   rŽ   é   r›   r   N)r   ZSecurityContextÚuserr\   rV   rx   Úlevel)r‰   r   rf   rf   rh   Úp_security_context;  s    



r·   c             C   s   | d }| d |_ || d< dS )zQgen_context : GEN_CONTEXT OPAREN security_context COMMA mls_range_def CPAREN
    r�   rŽ   r   N)r¶   )r‰   r   rf   rf   rh   Úp_gen_contextH  s    
r¸   c             C   s   | d | d< dS )z<context : security_context
               | gen_context
    r   r   Nrf   )r‰   rf   rf   rh   Ú	p_contextS  s    r¹   c             C   s(   t jƒ }| d |_| d |_|| d< dS )z$initial_sid : SID IDENTIFIER contextr†   r�   r   N)r   Z
InitialSidr�   Úcontext)r‰   r   rf   rf   rh   Úp_initial_sidY  s    

r»   c             C   s2   t jƒ }| d |_| d |_| d |_|| d< dS )z+genfscon : GENFSCON IDENTIFIER PATH contextr†   r�   r“   r   N)r   ZGenfsConÚ
filesystemÚpathrº   )r‰   Úgrf   rf   rh   Ú
p_genfscon`  s
    


r¿   c             C   sn   t jƒ }| d dkr t jj|_n.| d dkr8t jj|_n| d dkrNt jj|_| d |_| d |_|| d< dS )	z›fs_use : FS_USE_XATTR IDENTIFIER context SEMI
              | FS_USE_TASK IDENTIFIER context SEMI
              | FS_USE_TRANS IDENTIFIER context SEMI
    r   rR   rT   rS   r†   r�   r   N)r   ZFilesystemUseZXATTRrV   ZTASKZTRANSr¼   rº   )r‰   Úfrf   rf   rh   Úp_fs_usej  s    


rÁ   c             C   s`   t jƒ }| d |_t| ƒdkr4| d |_| d |_n | d d | d  |_| d |_|| d< dS )zkportcon : PORTCON IDENTIFIER NUMBER context
               | PORTCON IDENTIFIER NUMBER MINUS NUMBER contextr†   rŽ   r�   r“   r©   r   N)r   ZPortConZ	port_typerx   Zport_numberrº   )r‰   Úcrf   rf   rh   Ú	p_portcon|  s    


rÃ   c             C   s2   t jƒ }| d |_| d |_| d |_|| d< dS )zanodecon : NODECON NUMBER NUMBER context
               | NODECON IPV6_ADDR IPV6_ADDR context
    r†   r�   r“   r   N)r   ZNodeConÚstartÚendrº   )r‰   Únrf   rf   rh   Ú	p_nodeconŠ  s
    


rÇ   c             C   s2   t jƒ }| d |_| d |_| d |_|| d< dS )z.netifcon : NETIFCON IDENTIFIER context contextr†   r�   r“   r   N)r   ZNetifConrc   Zinterface_contextZpacket_context)r‰   rÆ   rf   rf   rh   Ú
p_netifcon•  s
    


rÈ   c             C   s(   t jƒ }| d |_| d |_|| d< dS )z pirqcon : PIRQCON NUMBER contextr†   r�   r   N)r   ZPirqConZpirq_numberrº   )r‰   rÂ   rf   rf   rh   Ú	p_pirqconž  s    

rÉ   c             C   sV   t jƒ }t| ƒdkr*| d |_| d |_n | d d | d  |_| d |_|| d< dS )zYiomemcon : IOMEMCON NUMBER context
                | IOMEMCON NUMBER MINUS NUMBER contextr“   r†   r�   r©   r   N)r   ZIomemConrx   Z
device_memrº   )r‰   rÂ   rf   rf   rh   Ú
p_iomemcon¦  s    

rÊ   c             C   sV   t jƒ }t| ƒdkr*| d |_| d |_n | d d | d  |_| d |_|| d< dS )z\ioportcon : IOPORTCON NUMBER context
                | IOPORTCON NUMBER MINUS NUMBER contextr“   r†   r�   r©   r   N)r   Z	IoportConrx   Zioportrº   )r‰   rÂ   rf   rf   rh   Úp_ioportcon³  s    

rË   c             C   s(   t jƒ }| d |_| d |_|| d< dS )z*pcidevicecon : PCIDEVICECON NUMBER contextr†   r�   r   N)r   ZPciDeviceConZdevicerº   )r‰   rÂ   rf   rf   rh   Úp_pcideviceconÀ  s    

rÌ   c             C   s(   t jƒ }| d |_| d |_|| d< dS )z,devicetreecon : DEVICETREECON NUMBER contextr†   r�   r   N)r   ZDevicetTeeConr½   rº   )r‰   rÂ   rf   rf   rh   Úp_devicetreeconÈ  s    

rÍ   c             C   s4   | d | d< t | ƒdkr0| d d | d  | d< dS )z[mls_range_def : mls_level_def MINUS mls_level_def
                     | mls_level_def
    r   r   r†   r©   r�   N)rx   )r‰   rf   rf   rh   Úp_mls_range_defÐ  s    rÎ   c             C   s:   | d | d< t | ƒdkr6| d d dj| d ƒ | d< dS )zRmls_level_def : IDENTIFIER COLON comma_list
                     | IDENTIFIER
    r   r   r†   ú:ú,r�   N)rx   Újoin)r‰   rf   rf   rh   Úp_mls_level_defØ  s    rÒ   c             C   s‚   t j| d ƒ}t| ƒdkrD| d dkr8|jj| d ƒ qv| d |_n2t| ƒdkrv| d |_t| ƒdkrv|jj| d ƒ || d< dS )	zÓtype_def : TYPE IDENTIFIER COMMA comma_list SEMI
                | TYPE IDENTIFIER SEMI
                | TYPE IDENTIFIER ALIAS names SEMI
                | TYPE IDENTIFIER ALIAS names COMMA comma_list SEMI
    r†   r´   r�   rÐ   r“   r”   r   N)r   ZTyperx   Ú
attributesr‚   Úaliases)r‰   rg   rf   rf   rh   Ú
p_type_defà  s    
rÕ   c             C   s   t j| d ƒ}|| d< dS )z)attribute_def : ATTRIBUTE IDENTIFIER SEMIr†   r   N)r   Z	Attribute)r‰   Úarf   rf   rh   Úp_attribute_defò  s    r×   c             C   s   t j| d ƒ}|| d< dS )z3attribute_role_def : ATTRIBUTE_ROLE IDENTIFIER SEMIr†   r   N)r   ZAttribute_Role)r‰   rÖ   rf   rf   rh   Úp_attribute_role_def÷  s    rØ   c             C   s(   t jƒ }| d |_| d |_|| d< dS )z5typealias_def : TYPEALIAS IDENTIFIER ALIAS names SEMIr†   r“   r   N)r   Z	TypeAliasrV   rÔ   )r‰   rg   rf   rf   rh   Úp_typealias_defü  s    

rÙ   c             C   s:   t jƒ }| d |_t| ƒdkr.|jj| d ƒ || d< dS )zWrole_def : ROLE IDENTIFIER TYPES comma_list SEMI
                | ROLE IDENTIFIER SEMIr†   r“   r   N)r   ZRoler\   rx   r]   r‚   )r‰   Úrrf   rf   rh   Ú
p_role_def  s
    
rÛ   c             C   s(   t jƒ }| d |_| d |_|| d< dS )z#role_allow : ALLOW names names SEMIr†   r�   r   N)r   Z	RoleAllowZ	src_rolesZ	tgt_roles)r‰   rÚ   rf   rf   rh   Úp_role_allow  s    

rÜ   c             C   s   dS )z"permissive : PERMISSIVE names SEMINrf   )r‰   rf   rf   rh   Úp_permissive  s    rÝ   c             C   s‚   t jƒ }| d dkr t jj|_n.| d dkr8t jj|_n| d dkrNt jj|_| d |_| d |_| d |_| d |_	|| d	< d
S )zÿavrule_def : ALLOW names names COLON names names SEMI
                  | DONTAUDIT names names COLON names names SEMI
                  | AUDITALLOW names names COLON names names SEMI
                  | NEVERALLOW names names COLON names names SEMI
    r   r^   r_   r`   r†   r�   rŽ   r´   r   N)
r   ÚAVRuler=   Ú	rule_typer>   r?   Ú	src_typesÚ	tgt_typesÚobj_classesr¬   )r‰   rÖ   rf   rf   rh   Úp_avrule_def  s    




rã   c             C   st   t jƒ }| d dkr t jj|_n| d dkr6t jj|_| d |_| d |_| d |_| d |_| d |_	|| d	< d
S )a�  typerule_def : TYPE_TRANSITION names names COLON names IDENTIFIER SEMI
                    | TYPE_TRANSITION names names COLON names IDENTIFIER FILENAME SEMI
                    | TYPE_TRANSITION names names COLON names IDENTIFIER IDENTIFIER SEMI
                    | TYPE_CHANGE names names COLON names IDENTIFIER SEMI
                    | TYPE_MEMBER names names COLON names IDENTIFIER SEMI
    r   ra   rb   r†   r�   rŽ   r´   r›   r   N)
r   ZTypeRulerC   rß   rD   rà   rá   râ   Z	dest_typeÚ	file_name)r‰   rg   rf   rf   rh   Úp_typerule_def*  s    





rå   c             C   s.   t jƒ }| d |_|jj| d ƒ || d< dS )z5typebound_def : TYPEBOUNDS IDENTIFIER comma_list SEMIr†   r�   r   N)r   Z	TypeBoundrV   rá   r‚   )r‰   rg   rf   rf   rh   Úp_typebound_def=  s    
ræ   c             C   s8   t jƒ }| d |_| d dkr&d|_nd|_|| d< dS )zIbool : BOOL IDENTIFIER TRUE SEMI
            | BOOL IDENTIFIER FALSE SEMIr†   r�   rY   TFr   N)r   ZBoolr�   Ústate)r‰   Úbrf   rf   rh   Úp_boolD  s    
ré   c             C   sP   t jƒ }| d |_t| d |dd� t| ƒdkrBt| d |dd� |g| d< d	S )
z¾ conditional : IF OPAREN cond_expr CPAREN OBRACE interface_stmts CBRACE
                    | IF OPAREN cond_expr CPAREN OBRACE interface_stmts CBRACE ELSE OBRACE interface_stmts CBRACE
    r�   r´   T)r~   r”   é
   Fr   N)r   ZConditionalr    r€   rx   )r‰   rÂ   rf   rf   rh   Úp_conditionalO  s    
rë   c             C   s.   t jƒ }| d |_|jj| d ƒ || d< dS )z<typeattribute_def : TYPEATTRIBUTE IDENTIFIER comma_list SEMIr†   r�   r   N)r   ZTypeAttributerV   rÓ   r‚   )r‰   rg   rf   rf   rh   Úp_typeattribute_defZ  s    
rì   c             C   s.   t jƒ }| d |_|jj| d ƒ || d< dS )z<roleattribute_def : ROLEATTRIBUTE IDENTIFIER comma_list SEMIr†   r�   r   N)r   ZRoleAttributer\   Zroleattributesr‚   )r‰   rg   rf   rf   rh   Úp_roleattribute_defa  s    
rí   c             C   s   dS )z˜range_transition_def : RANGE_TRANSITION names names COLON names mls_range_def SEMI
                            | RANGE_TRANSITION names names names SEMINrf   )r‰   rf   rf   rh   Úp_range_transition_defh  s    rî   c             C   s   dS )z<role_transition_def : ROLE_TRANSITION names names names SEMINrf   )r‰   rf   rf   rh   Úp_role_transition_defm  s    rï   c             C   sj   t | ƒ}|dkr | d g| d< nF|dkr@| d g| d  | d< n&| d | d | d  g | d  | d< dS )a   cond_expr : IDENTIFIER
                 | EXPL cond_expr
                 | cond_expr AMP AMP cond_expr
                 | cond_expr BAR BAR cond_expr
                 | cond_expr EQUAL EQUAL cond_expr
                 | cond_expr EXPL EQUAL cond_expr
    r†   r   r   r�   r“   N)rx   )r‰   Úlrf   rf   rh   Úp_cond_exprq  s    rñ   c             C   sr   t jƒ }t| ƒdk r$t| d |ƒ nBt| ƒdkrFt| d |ƒ d|_n t| d gƒ |jd| d  ƒ || d< dS )zºnames : identifier
             | nested_id_set
             | asterisk
             | TILDE identifier
             | TILDE nested_id_set
             | IDENTIFIER MINUS IDENTIFIER
    r�   r   r†   Tr©   r   N)r   ZIdSetrx   r…   Z
complimentrƒ   )r‰   r   rf   rf   rh   Úp_namesŽ  s    rò   c             C   s   | d g| d< dS )zidentifier : IDENTIFIERr   r   Nrf   )r‰   rf   rf   rh   Úp_identifier¡  s    ró   c             C   s   | d g| d< dS )zasterisk : ASTERISKr   r   Nrf   )r‰   rf   rf   rh   Ú
p_asterisk¥  s    rô   c             C   s   | d | d< dS )z1nested_id_set : OBRACE nested_id_list CBRACE
    r†   r   Nrf   )r‰   rf   rf   rh   Úp_nested_id_set©  s    rõ   c             C   s2   t | ƒdkr| d | d< n| d | d  | d< dS )z`nested_id_list : nested_id_element
                      | nested_id_list nested_id_element
    r†   r   r   N)rx   )r‰   rf   rf   rh   Úp_nested_id_list®  s    rö   c             C   s4   t | ƒdkr| d | d< nd| d  }|g| d< dS )zxnested_id_element : identifier
                         | MINUS IDENTIFIER
                         | nested_id_set
    r†   r   r   r©   N)rx   )r‰   Ústrrf   rf   rh   Úp_nested_id_element·  s    rø   c             C   s0   t | ƒdkr | d | d  | d< | d | d< dS )zTcomma_list : nested_id_list
                  | comma_list COMMA nested_id_list
    r†   r   r�   r   N)rx   )r‰   rf   rf   rh   Úp_comma_listÃ  s    rù   c             C   s   dS )z/optional_semi : SEMI
                   | emptyNrf   )r‰   rf   rf   rh   Úp_optional_semiË  s    rú   c             C   s&   dt | j| j| jf attƒ dad S )Nz(%s: Syntax error on line %d %s [type=%s]F)Ú
parse_filerk   rr   rV   Úerrorrv   Úsuccess)Útokrf   rf   rh   Úp_errorÕ  s    rÿ   c             C   s(   | si S i }x| D ]}|||j < qW d S )N)r�   )r�   Úmapr–   rf   rf   rh   Úprep_sptÛ  s
    
r  c             C   sH   t stjƒ atjd|dd�a | d k	r*| antjƒ a|s@tjƒ an|ad S )NZLALRr   )ÚmethodÚdebugZwrite_tables)	Úparserr   rj   r   r‡   r   ÚModuleÚSupportMacrosr�   )rQ   Úsupportr  rf   rf   rh   Úcreate_globalsä  s    
r  Fc             C   sŠ   t |||ƒ dt_daytj| |td� W nB tk
rl } z&d ad adt|ƒ d tj	ƒ  a
W Y d d }~X nX ts†d adt
 }t|ƒ‚tS )Nr   T)r  rj   zinternal parser error: %sÚ
zcould not parse text: "%s")r  rj   rk   rý   r  ÚparseÚ	Exceptionr÷   Ú	tracebackÚ
format_excrü   Ú
ValueErrorr‡   )ÚtextrQ   r  r  ÚeÚmsgrf   rf   rh   r
  õ  s    *r
  c       	      C   s²   g }d }x t j| ƒD ]’\}}}x†|D ]~}t jj|ƒ}t jj||ƒ}|d dkr„|dkr\|}q¢ttjd|d ƒƒr¢|j|d |fƒ q$|d dkr$|j|d |fƒ q$W qW ||fS )Nr   z.sptzobj_perm_sets.sptZpatternsr   z.if)	ÚosÚwalkr½   ÚsplitextrÑ   rx   ÚreÚfindallrˆ   )	ÚrootÚmodulesÚsupport_macrosÚdirpathZdirnamesÚ	filenamesr�   ÚmodnameÚfilenamerf   rf   rh   Úlist_headers
  s    
r  c                s>  ddl m} tjƒ }g }d }tjj| ƒr|tjj| ƒd }|dkrLtd|  ƒ‚tjj	|ƒ}	|j
|	d | fƒ ttjƒ ƒ\}
}nt| ƒ\}}|rš| rštdƒ‚‡fdd„‰d‡ ‡fd	d
„	}d }|�r8ˆd| ƒ tjƒ }|||ƒ |jj
|ƒ tjdƒ}tjddddddddddg
ƒ}|jj
tj|ƒƒ |jj
|ƒ ˆdƒ ˆ�rdˆ  �rd|jtjt|ƒd�}|jdƒ g }x´|D ]¬}tjƒ }|d |_y*|�rž||d ||ƒ n||d |ƒ W nF tk
�rô } z(ˆt|ƒd ƒ |j
|d ƒ �wnW Y d d }~X nX |jj
|ƒ ˆ�rnˆ  �rn|jƒ  �qnW t|ƒ�r:ˆddj|ƒ ƒ |S )Nr   )Úutilrz   zInvalid file name %sr   z1could not find support macros (obj_perm_sets.spt)c                s   ˆ rˆ j | ƒ d S )N)Úwrite)r  )Úoutputrf   rh   rœ   3  s    zparse_headers.<locals>.oc                s˜   ˆ rˆd|  ƒ y.t | ƒ}|jƒ }|jƒ  | at|||ˆ ƒ W nT tk
r^ } zd S d }~X n6 tk
r’ } ztd| t|ƒf ƒ‚W Y d d }~X nX d S )Nzparsing file %s
zerror parsing file %s: %s)ÚopenÚreadÚcloserû   r
  ÚIOErrorr  r÷   )rÀ   rQ   r�   ÚfdZtxtr  )r  rœ   rf   rh   rû   7  s    z!parse_headers.<locals>.parse_filezParsing support macros (%s): Úcan_execz$1z$2ÚfileZexecute_no_transr"  r#  ÚgetattrÚlockZexecuteZioctlzdone.
)ZstepszParsing interface filesr	  z failed to parse some headers: %sz, )N)rz   r  r   ZHeadersr  r½   ÚisfileÚsplitr  r  rˆ   r  r   Úheadersr  r|   r•   r   ZAccessVectorrÞ   ZConsoleProgressBarÚsysÚstdoutrx   rÄ   r  r�   r÷   ÚsteprÑ   )r  r!  r…   r  r  r-  r  r  r�   r  Zall_modulesrû   r�   r'  ÚavZstatusZfailuresr–   r‡   r  rf   )r  rœ   r!  rh   Úparse_headers  sb    






r2  )Ir   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   )N)NNF)NTF)vr.  r  r  r  rz   r   r   r   r   r   Útokensrp   Zt_TICKZt_SQUOTEZt_OBRACEZt_CBRACEZt_SEMIZt_COLONZt_OPARENZt_CPARENZt_COMMAZt_MINUSZt_TILDEZ
t_ASTERISKZt_AMPZt_BARZt_EXPLZt_EQUALZt_NUMBERZt_PATHZt_ignoreri   rl   rn   ro   rs   rt   ru   rw   ry   r‡   rü   rû   r�   rý   r€   r…   rŠ   r‹   rŒ   r’   r—   r˜   r™   rš   r�   r¡   r¢   r¤   r¨   rª   r«   r­   r®   r¯   r°   r±   r²   r³   r·   r¸   r¹   r»   r¿   rÁ   rÃ   rÇ   rÈ   rÉ   rÊ   rË   rÌ   rÍ   rÎ   rÒ   rÕ   r×   rØ   rÙ   rÛ   rÜ   rÝ   rã   rå   ræ   ré   rë   rì   rí   rî   rï   rñ   rò   ró   rô   rõ   rö   rø   rù   rú   rÿ   r  r  rj   r  r
  r  r2  rf   rf   rf   rh   Ú<module>    sÞ  
                                                                        






"

			

