ó
B¢Qc           @   s  d  Z  d d l Z d d l Z d d l Z yV e j e j e j d ƒ Z e j d4 ƒ [ d „  Z d „  Z	 d „  Z
 d d „ Z Wnº e j k
 r<y7 d d l Z d	 „  Z d
 „  Z	 d „  Z
 d d „ Z Wq=e k
 r8d d l Z e j d ƒ Z d e j f d „  ƒ  YZ d „  Z d „  Z	 d „  Z
 d d „ Z q=Xn Xd Z d Z d Z d Z d Z d Z d Z d Z d Z d d5 d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ  d e f d  „  ƒ  YZ! d! e f d" „  ƒ  YZ" d# e f d$ „  ƒ  YZ# 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+ Z0 d, Z1 d- Z2 d. Z3 d Z4 d/ d6 d0 „  ƒ  YZ5 d1 d7 d2 „  ƒ  YZ6 d3 „  Z7 d S(8   s‡   
Netlink message generation/parsing

Copyright 2007        Johannes Berg <johannes@sipsolutions.net>

GPLv2+; See copying for details.
iÿÿÿÿNi    c         C   s   |  j  | ƒ d  S(   N(   t   bind(   t
   descriptort   addr(    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyt   _nl_bind   s    c         C   s
   |  j  ƒ  S(   N(   t   getsockname(   R   (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyt   _nl_getsockname   s    c         C   s   |  j  | ƒ d  S(   N(   t   send(   R   t   msg(    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyt   _nl_send   s    i @  c         C   s   |  j  | ƒ S(   N(   t   recvfrom(   R   t   bufs(    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyt   _nl_recv   s    c         C   s   t  j |  j ƒ  | d ƒ d  S(   Ni   (   t   _netlinkR    t   fileno(   R   R   (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyR      s    c         C   s   t  j |  j ƒ  ƒ S(   N(   R   R   R   (   R   (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyR       s    c         C   s   t  j |  j ƒ  | ƒ d  S(   N(   R   R   R   (   R   R   (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyR   "   s    c         C   s   t  j |  j ƒ  | ƒ S(   N(   R   R	   R   (   R   R
   (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyR   $   s    t   SOCKADDR_NLc           B   s>   e  Z d  e j f d e j f d e j f d e j f g Z RS(   t	   nl_familyt   nl_padt   nl_pidt	   nl_groups(   t   __name__t
   __module__t   ctypest   c_ushortt   c_intt   _fields_(    (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyR   ,   s   c         C   sI   t  t j d t j ƒ  d ƒ } t j |  j ƒ  t j	 | ƒ t j
 | ƒ ƒ S(   Ni    (   R   t   sockett
   AF_NETLINKt   ost   getpidt   libcR    R   R   t   pointert   sizeof(   R   R   (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyR   2   s    c         C   sh   t  d d d d ƒ } t j t j | ƒ ƒ } t j |  j ƒ  t j | ƒ t j | ƒ ƒ | j | j	 f S(   Ni    (
   R   R   R   R   R   R   R   R   R   R   (   R   R   t   len(    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyR   8   s    c         C   s"   t  j |  j ƒ  | t | ƒ d ƒ S(   Ni    (   R   R   R   R    (   R   R   (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyR   @   s    c         C   s£   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(   Ni    (   R   R   R   R   t   create_string_bufferR   R	   R   R   t	   string_atR   R   (   R   R
   R   R    t   buft   rt   ret(    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyR   C   s    	i   i   i   i   i   i   t   Attrc           B   sb   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d	 „  Z RS(
   c         G   s:   | |  _  t | ƒ r- t j | | Œ |  _ n	 | |  _ d  S(   N(   t   typeR    t   structt   packt   data(   t   selft	   attr_typeR*   t   values(    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyt   __init__^   s    	c         C   s]   t  j d t |  j ƒ d |  j ƒ } t |  j ƒ } | d d d @| } | |  j d | S(   Nt   HHi   i   i   t    iüÿÿÿ(   R(   R)   R    R*   R'   (   R+   t   hdrt   lengtht   pad(    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyt   _dumpe   s    %c         C   s   d |  j  t |  j ƒ f S(   Ns   <Attr type %d, data "%s">(   R'   t   reprR*   (   R+   (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyt   __repr__k   s    c         C   s   t  j d |  j ƒ d S(   Nt   Hi    (   R(   t   unpackR*   (   R+   (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyt   u16n   s    c         C   s   t  j d |  j ƒ d S(   Nt   hi    (   R(   R8   R*   (   R+   (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyt   s16p   s    c         C   s   t  j d |  j ƒ d S(   Nt   Ii    (   R(   R8   R*   (   R+   (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyt   u32r   s    c         C   s   t  j d |  j ƒ d S(   Nt   ii    (   R(   R8   R*   (   R+   (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyt   s32t   s    c         C   s   |  j  S(   N(   R*   (   R+   (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyt   strv   s    c         C   s   |  j  j d ƒ d S(   NR0   i    (   R*   t   split(   R+   (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyt   nulstrx   s    c         C   s   t  |  j ƒ S(   N(   t   parse_attributesR*   (   R+   (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyt   nestedz   s    (   R   R   R.   R4   R6   R9   R;   R=   R?   R@   RB   RD   (    (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyR&   ]   s   									t   StrAttrc           B   s   e  Z d  „  Z RS(   c         C   s-   t  j |  | d t | ƒ | j d ƒ ƒ d  S(   Ns   %dss   utf-8(   R&   R.   R    t   encode(   R+   R,   R*   (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyR.   ~   s    (   R   R   R.   (    (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyRE   }   s   t
   NulStrAttrc           B   s   e  Z d  „  Z RS(   c         C   s0   t  j |  | d t | ƒ | j d ƒ d ƒ d  S(   Ns   %dsBs   utf-8i    (   R&   R.   R    RF   (   R+   R,   R*   (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyR.   ‚   s    (   R   R   R.   (    (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyRG      s   t   U32Attrc           B   s   e  Z d  „  Z RS(   c         C   s   t  j |  | d | ƒ d  S(   NR<   (   R&   R.   (   R+   R,   t   val(    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyR.   †   s    (   R   R   R.   (    (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyRH   …   s   t   U8Attrc           B   s   e  Z d  „  Z RS(   c         C   s   t  j |  | d | ƒ d  S(   Nt   B(   R&   R.   (   R+   R,   RI   (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyR.   Š   s    (   R   R   R.   (    (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyRJ   ‰   s   t   Nestedc           B   s   e  Z d  „  Z d „  Z RS(   c         C   s   | |  _  | |  _ d  S(   N(   t   attrsR'   (   R+   R,   RM   (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyR.   Ž   s    	c         C   sl   g  } x$ |  j  D] } | j | j ƒ  ƒ q Wd j | ƒ } t | ƒ } t j d | d |  j ƒ } | | S(   Nt    R/   i   (   RM   t   appendR4   t   joinR    R(   R)   R'   (   R+   t   contentst   attrR2   R1   (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyR4   ’   s    (   R   R   R.   R4   (    (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyRL      s   	i   i   i   i	   i
   i   i   i   i   i   t   Messagec           B   s,   e  Z d  d d d „ Z d „  Z d „  Z RS(   i    iÿÿÿÿc         C   s‹   | |  _  | |  _ | |  _ d |  _ | p- g  } t | t ƒ r~ g  } x! | D] } | j | j ƒ  ƒ qL Wd j | ƒ |  _	 n	 | |  _	 d  S(   NiÿÿÿÿRN   (
   R'   t   flagst   seqt   pidt
   isinstancet   listRO   R4   RP   t   payload(   R+   t   msg_typeRT   RU   RY   RQ   RR   (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyR.   ®   s    				c         C   s‚   |  j  d k r! | j  ƒ  |  _  n  | j |  _ t |  j ƒ } t j d | d |  j |  j |  j  |  j ƒ } | j | |  j ƒ d  S(   Niÿÿÿÿt   IHHIIi   i   (	   RU   RV   R    RY   R(   R)   R'   RT   R   (   R+   t   connR2   R1   (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyR   ¼   s    c         C   s,   d |  j  |  j |  j |  j t |  j ƒ f S(   Ns:   <netlink.Message type=%d, pid=%d, seq=%d, flags=0x%x "%s">(   R'   RV   RU   RT   R5   RY   (   R+   (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyR6   Ç   s    N(   R   R   t   NoneR.   R   R6   (    (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyRS   ­   s   	t
   Connectionc           B   s2   e  Z d  d d „ Z d „  Z d „  Z d „  Z RS(   i    c         C   s   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 |  _ | |  _ d  S(   Ni   i    (   R   R   t   SOCK_RAWR   t
   setsockoptt
   SOL_SOCKETt	   SO_SNDBUFt	   SO_RCVBUFR   R   RV   t   groupst   _seqt
   unexpected(   R+   t   nltypeRd   t   unexpected_msg_handler(    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyR.   Ì   s    	c         C   s   t  |  j | ƒ d  S(   N(   R   R   (   R+   R   (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyR   Õ   s    c         C   sÓ   t  |  j ƒ \ } \ } } t j d | d  ƒ \ } } } } } t | | | | d ƒ }	 | |	 _ |	 j t k rÏ t j d |	 j d  ƒ d }
 |
 d k rÏ t	 d t
 j |
 ƒ |
 f ƒ } |
 | _ | ‚ qÏ n  |	 S(   NR[   i   R>   i   i    s   Netlink error: %s (%d)(   R   R   R(   R8   RS   RV   R'   t   NLMSG_ERRORRY   t   OSErrorR   t   strerrort   errno(   R+   RQ   t   nlpidt   nlgrpst   msglenRZ   RT   RU   RV   R   Rl   t   err(    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyt   recv×   s    			c         C   s   |  j  d 7_  |  j  S(   Ni   (   Re   (   R+   (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyRU   ç   s    N(   R   R   R]   R.   R   Rq   RU   (    (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyR^   Ë   s   			c         C   so   i  } xb t  |  ƒ rj t j d |  d  ƒ \ } } t | |  d | !ƒ | | <| d d d @} |  | }  q	 W| S(   NR/   i   i   i   iüÿÿÿ(   R    R(   R8   R&   (   R*   RM   t   attr_lenR,   (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyRC   ë   s    (   i    i    (    (    (    (8   t   __doc__R   R   R(   R   R_   t
   _dummysockR    R   R   R   R   t   errorR   t   ImportErrorR   t   CDLLR]   R   t	   StructureR   t   NLM_F_REQUESTt   NLM_F_MULTIt	   NLM_F_ACKt
   NLM_F_ECHOt
   NLMSG_NOOPRi   t
   NLMSG_DONEt   NLMSG_OVERRUNt   NLMSG_MIN_TYPER&   RE   RG   RH   RJ   RL   t   NETLINK_ROUTEt   NETLINK_UNUSEDt   NETLINK_USERSOCKt   NETLINK_FIREWALLt   NETLINK_INET_DIAGt   NETLINK_NFLOGt   NETLINK_XFRMt   NETLINK_SELINUXt   NETLINK_ISCSIt   NETLINK_AUDITt   NETLINK_FIB_LOOKUPt   NETLINK_CONNECTORt   NETLINK_NETFILTERt   NETLINK_IP6_FWt   NETLINK_DNRTMSGt   NETLINK_KOBJECT_UEVENTt   NETLINK_GENERICRS   R^   RC   (    (    (    s1   /usr/lib/python2.7/dist-packages/iotop/netlink.pyt   <module>   sz   									  