
    Hmd                     V    d dl Z d dlmZmZ d dlmZmZmZmZm	Z	  G d de
          ZdS )    N)CDLL	get_errno)bytearray_to_strgr_create_string_buffergr_query_xattrgr_lsetxattrgr_lremovexattrc                       e Zd ZdZ edd          Zed             Zed             Zed             Z	edd	            Z
ed
             Zedd            Zed             Zed             Zed             ZdS )Xattrah  singleton that wraps the extended attributes system
       interface for python using ctypes

       Just implement it to the degree we need it, in particular
       - we need just the l*xattr variants, ie. we never want symlinks to be
         followed
       - don't need size discovery for getxattr, as we always know the exact
         sizes we expect
    z	libc.so.6T)	use_errnoc                     t                      S N)r   )clss    B/usr/lib/x86_64-linux-gnu/glusterfs/python/syncdaemon/libcxattr.pygeterrnozXattr.geterrno   s    {{    c                 n    |                                  }t          |t          j        |                    r   )r   OSErrorosstrerror)r   errns     r   raise_oserrzXattr.raise_oserr#   s)    ||~~dBK--...r   c                     |rt          |          }nd } t          | j        |          |f|z   ||fz    }|dk    r|                                  |rt	          |j                  }|d |         S |S N)r   getattrlibcr   r   raw)r   pathsizsyscallabufretresults           r   _query_xattrzXattr._query_xattr(   s     	)#..CCC(gch((D7Q;#s+CE"99OO 	 &cg..F$3$<Jr   r   c                 (    t          | ||d|          S )N	lgetxattr)r   )r   r   attrr    s       r   r(   zXattr.lgetxattr9   s    c4k4@@@r   c                     |                      ||          }|dk    r|                                  |dk    rdS |                      |||          S )z%lgetxattr variant with size discoveryr   r    )r(   r   )r   r   r)   sizes       r   lgetxattr_bufzXattr.lgetxattr_buf=   sT     }}T4((2::OO1992}}T4...r   c                     t          | ||d          }t          |t                    r.|                    d          }|r|                    d          ng }|S )N
llistxattr )r   
isinstancestrstripsplit)r   r   r    r$   s       r   r/   zXattr.llistxattrG   sS    S$\::c3 	1))D//C%(0#))D///bC
r   c                 b    t          | |||          }|dk    r|                                  d S d S r   )r   r   )r   r   r)   valr$   s        r   	lsetxattrzXattr.lsetxattrO   s;    3dC00"99OO 9r   c                 `    t          | ||          }|dk    r|                                  d S d S r   )r	   r   )r   r   r)   r$   s       r   lremovexattrzXattr.lremovexattrU   s9    c4.."99OO 9r   c                     	 d}|                      ||          S # t          $ rR |                      |          }|dk    r|                                  |dk    rg cY S |                      ||          cY S w xY w)z%listxattr variant with size discoveryi d  r   r   )r/   r   r   )r   r   r,   s      r   llistxattr_bufzXattr.llistxattr_buf[   s    	. D>>$--- 
	. 
	. 
	. >>$''Drzz!!!qyy			>>$-----
	.s    AA6A65A6N)r   )__name__
__module____qualname____doc__r   r   classmethodr   r   r&   r(   r-   r/   r7   r9   r;    r   r   r   r      s3         4t,,,D  [ / / [/   [  A A A [A / / [/    [   [
   [
 . . [. . .r   r   )r   ctypesr   r   py2py3r   r   r   r   r	   objectr   rA   r   r   <module>rE      s    
			 " " " " " " " "C C C C C C C C C C C C C C_. _. _. _. _.F _. _. _. _. _.r   