
    w&by                        d Z ddlZddlZddlZ	  ej                  ej                  ej
                  d      Zej                  d       [d Zd Z	d Z
d3dZdZdZdZdZdZdZdZdZdZ G d d      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"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-Z2dZ3 G d. d/      Z4 G d0 d1      Z5d2 Z6y# ej                  $ rY 	 ddlZd Zd	 Z	d
 Z
d3dZnC# e$ r; ddlZ ej                   d      Z G d dej$                        Zd Zd Z	d Z
d3dZY nw xY wY w xY w)4z
Netlink message generation/parsing

Copyright 2007        Johannes Berg <johannes@sipsolutions.net>

GPLv2+; See copying for details.
    N)r   r   c                 &    | j                  |       y N)bind
descriptoraddrs     //usr/lib/python3/dist-packages/iotop/netlink.py_nl_bindr
      s        c                 "    | j                         S r   )getsocknamer   s    r	   _nl_getsocknamer      s    %%''r   c                 &    | j                  |       y r   )sendr   msgs     r	   _nl_sendr      s    r   c                 $    | j                  |      S r   )recvfromr   bufss     r	   _nl_recvr      s    ""4((r   c                 R    t        j                  | j                         |d          y N   )_netlinkr   filenor   s     r	   r
   r
   #   s    MM*++-tAw7r   c                 H    t        j                  | j                               S r   )r   r   r   r   s    r	   r   r   &   s    ''
(9(9(;<<r   c                 L    t        j                  | j                         |       y r   )r   r   r   r   s     r	   r   r   )   s    MM*++-s3r   c                 J    t        j                  | j                         |      S r   )r   r   r   r   s     r	   r   r   ,   s    $$Z%6%6%8$??r   c                   x    e Zd Zdej                  fdej                  fdej
                  fdej
                  fgZy)SOCKADDR_NL	nl_familynl_padnl_pid	nl_groupsN)__name__
__module____qualname__ctypesc_ushortc_int_fields_ r   r	   r#   r#   4   s9    $foo6!foo6!fll3$fll35Hr   r#   c                     t        t        j                  dt        j                         d      }t
        j                  | j                         t        j                  |      t        j                  |            S Nr   )r#   socket
AF_NETLINKosgetpidlibcr   r   r+   pointersizeofr   s     r	   r
   r
   :   sR    v00!RYY[!DD99Z..0#^^D1#]]402 2r   c                 4   t        dddd      }t        j                  t        j                  |            }t        j                  | j                         t        j                  |      t        j                  |             |j                  |j                  fS r1   )
r#   r+   r-   r8   r6   r   r   r7   r&   r'   )r   r   lens      r	   r   r   @   so    q!Q*D,,v}}T23CZ..0#^^D1#^^C02 ;;..r   c                 `    t         j                  | j                         |t        |      d      S r1   )r6   r   r   r:   r   s     r	   r   r   H   s$    99Z..0#s3xCCr   c           
         t        dddd      }t        j                  t        j                  |            }t        j                  |      }t
        j                  | j                         ||dt        j                  |      t        j                  |            }t        j                  t        j                  |      |      }||j                  |j                  ffS r1   )r#   r+   r-   r8   create_string_bufferr6   r   r   r7   	string_atr&   r'   )r   r   r   r:   bufrrets          r	   r   r   K   s    q!Q*D,,v}}T23C--d3Cj//1!4$nnT2FNN34GIA ""6>>##6:Cdnn555r   r                  c                   H    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)Attrc                 n    || _         t        |      rt        j                  |g| | _        y || _        y r   )typer:   structpackdata)self	attr_typerM   valuess       r	   __init__zAttr.__init__g   s,    	v;D262DIDIr   c                     t        j                  dt        | j                        dz   | j                        }t        | j                        }|dz   dz
  dz  |z
  }|| j                  z   d|z  z   S )NHHrC   r       )rK   rL   r:   rM   rJ   )rN   hdrlengthpads       r	   _dumpz
Attr._dumpn   s`    kk$DII 2DII>TYY
Q"$.TYY,,r   c                 J    d| j                   t        | j                        fz  S )Nz<Attr type %d, data "%s">)rJ   reprrM   rN   s    r	   __repr__zAttr.__repr__t   s    *diidii-IIIr   c                 H    t        j                  d| j                        d   S )NHr   rK   unpackrM   r\   s    r	   u16zAttr.u16w       }}S$)),Q//r   c                 H    t        j                  d| j                        d   S )Nhr   r`   r\   s    r	   s16zAttr.s16z   rc   r   c                 H    t        j                  d| j                        d   S )NIr   r`   r\   s    r	   u32zAttr.u32}   rc   r   c                 H    t        j                  d| j                        d   S )Nir   r`   r\   s    r	   s32zAttr.s32   rc   r   c                     | j                   S r   )rM   r\   s    r	   strzAttr.str   s    yyr   c                 >    | j                   j                  d      d   S )N r   )rM   splitr\   s    r	   nulstrzAttr.nulstr   s    yyt$Q''r   c                 ,    t        | j                        S r   )parse_attributesrM   r\   s    r	   nestedzAttr.nested   s    		**r   N)r(   r)   r*   rQ   rY   r]   rb   rf   ri   rl   rn   rr   ru   r/   r   r	   rH   rH   f   s5    -J0000(+r   rH   c                       e Zd Zd Zy)StrAttrc                 j    t         j                  | |dt        |      z  |j                  d             y )Nz%dsutf-8rH   rQ   r:   encoderN   rO   rM   s      r	   rQ   zStrAttr.__init__   s&    dIus4y'8$++g:NOr   Nr(   r)   r*   rQ   r/   r   r	   rw   rw      s    Pr   rw   c                       e Zd Zd Zy)
NulStrAttrc                 l    t         j                  | |dt        |      z  |j                  d      d       y )Nz%dsBry   r   rz   r|   s      r	   rQ   zNulStrAttr.__init__   s,    d#d)!3T[[5I1	Nr   Nr}   r/   r   r	   r   r      s    Nr   r   c                       e Zd Zd Zy)U32Attrc                 4    t         j                  | |d|       y )Nrh   rH   rQ   rN   rO   vals      r	   rQ   zU32Attr.__init__       dIsC0r   Nr}   r/   r   r	   r   r          1r   r   c                       e Zd Zd Zy)U8Attrc                 4    t         j                  | |d|       y )NBr   r   s      r	   rQ   zU8Attr.__init__   r   r   Nr}   r/   r   r	   r   r      r   r   r   c                       e Zd Zd Zd Zy)Nestedc                      || _         || _        y r   )attrsrJ   )rN   rO   r   s      r	   rQ   zNested.__init__   s    
	r   c                     g }| j                   D ]!  }|j                  |j                                # dj                  |      }t	        |      }t        j                  d|dz   | j                        }||z   S )N rS   rC   )r   appendrY   joinr:   rK   rL   rJ   )rN   contentsattrrW   rV   s        r	   rY   zNested._dump   sg    JJ 	*DOODJJL)	*778$Xkk$
DII6X~r   N)r(   r)   r*   rQ   rY   r/   r   r	   r   r      s    r   r            	   
                  c                        e Zd ZddZd Zd Zy)MessageNc                     || _         || _        || _        d| _        |xs g }t	        |t
              r?g }|D ]!  }|j                  |j                                # dj                  |      | _	        y || _	        y )Nr   )
rJ   flagsseqpid
isinstancelistr   rY   r   payload)rN   msg_typer   r   r   r   r   s          r	   rQ   zMessage.__init__   sn    	
-Rgt$H .

-.88H-DL"DLr   c                 ^   | j                   dk(  r|j                         | _         |j                  | _        t        | j                        }t	        j
                  d|dz   | j                  | j                  | j                   | j                        }|j                  || j                  z          y )Nr   IHHIIrF   )	r   r   r:   r   rK   rL   rJ   r   r   )rN   connrW   rV   s       r	   r   zMessage.send   sw    88r>xxzDH88T\\"kk'6E>499**dhh:		#$%r   c                     d| j                   | j                  | j                  | j                  t	        | j
                        fz  S )Nz:<netlink.Message type=%d, pid=%d, seq=%d, flags=0x%x "%s">)rJ   r   r   r   r[   r   r\   s    r	   r]   zMessage.__repr__   s<    KIItxx4::tDLL7IOK K 	Kr   )r   r   N)r(   r)   r*   rQ   r   r]   r/   r   r	   r   r      s    #	&Kr   r   c                   &    e Zd ZddZd Zd Zd Zy)
ConnectionNc                    t        j                   t         j                  t         j                  |      | _        | j                  j	                  t         j
                  t         j                  d       | j                  j	                  t         j
                  t         j                  d       t        | j                  d|f       t        | j                        \  | _
        | _        d| _        || _        y )Ni   r   )r2   r3   SOCK_RAWr   
setsockopt
SOL_SOCKET	SO_SNDBUF	SO_RCVBUFr
   r   r   groups_seq
unexpected)rN   nltyper   unexpected_msg_handlers       r	   rQ   zConnection.__init__   s     --(9(9(.A""6#4#4f6F6FN""6#4#4f6F6FN1f+. / @$+	0r   c                 0    t        | j                  |       y r   )r   r   )rN   r   s     r	   r   zConnection.send   s    #&r   c                    t        | j                        \  }\  }}t        j                  d|d d       \  }}}}}t	        ||||dd        }	||	_        |	j                  t        k(  rXt        j                  d|	j                  d d       d    }
|
dk7  r,t        dt        j                  |
      |
fz        }|
|_        ||	S )Nr   rF   rk   rC   r   zNetlink error: %s (%d))r   r   rK   ra   r   r   rJ   NLMSG_ERRORr   OSErrorr4   strerrorerrno)rN   r   nlpidnlgrpsmsglenr   r   r   r   r   r   errs               r	   recvzConnection.recv   s    $,T__$=!/5& -3MM':B3B--I)%chsHRSM:88{"]]3BQ8;;Ez646KK4F:O O P!		
r   c                 D    | xj                   dz  c_         | j                   S r   )r   r\   s    r	   r   zConnection.seq  s    		Q	yyr   )r   N)r(   r)   r*   rQ   r   r   r   r/   r   r	   r   r      s    1'"r   r   c                     i }t        |       rJt        j                  d| d d       \  }}t        || d|       ||<   |dz   dz
  dz  }| |d  } t        |       rJ|S )NrS   rC   r   rT   )r:   rK   ra   rH   )rM   r   attr_lenrO   s       r	   rt   rt     so    E
d)$mmD$r(;)	4(+;<i\A%+HI	 d)
 Lr   )i @  )7__doc__r4   r2   rK   r3   r   
_dummysockr   r
   r   r   r   errorr   ImportErrorr+   CDLLr6   	Structurer#   NLM_F_REQUESTNLM_F_MULTI	NLM_F_ACK
NLM_F_ECHO
NLMSG_NOOPr   
NLMSG_DONENLMSG_OVERRUNNLMSG_MIN_TYPErH   rw   r   r   r   r   NETLINK_ROUTENETLINK_UNUSEDNETLINK_USERSOCKNETLINK_FIREWALLNETLINK_INET_DIAGNETLINK_NFLOGNETLINK_XFRMNETLINK_SELINUXNETLINK_ISCSINETLINK_AUDITNETLINK_FIB_LOOKUPNETLINK_CONNECTORNETLINK_NETFILTERNETLINK_IP6_FWNETLINK_DNRTMSGNETLINK_KOBJECT_UEVENTNETLINK_GENERICr   r   rt   r/   r   r	   <module>r      s   
  H6v00&//1EJOOF()z 	
 

$+ $+NPd P
N N1d 1
1T 1
T         K K>" "JS || 7656	8	=	4	@ '6v{{4 	5&** 	5	2	/	D
	6;'6!76s6   AC$ $E4DE=EEEEE