
OcIc           @   s)  d  Z  d d k l Z d d k Z d d k Z d d k Z y d d k Z Wn e j
 o n Xd d k Z d d k	 Z	 d d k
 Z
 d d k Z d d k Z d d k Z d d k Z d d k Z d d k Z d d k Z h  a d d! d     YZ d   Z d   Z d   Z d	 e i f d
     YZ d e i f d     YZ d   Z d d" d     YZ d d d d  Z d   Z d   Z  d d  Z! d   Z" d   Z# d   Z$ d e f d     YZ% d e i f d     YZ& d   Z' d   Z( e( e _) d   Z* e* e _+ d   Z, e, e _- d    Z. e. e _/ d S(#   s!  Store and retrieve extended attributes and access control lists

Not all file systems will have EAs and ACLs, but if they do, store
this information in separate files in the rdiff-backup-data directory,
called extended_attributes.<time>.snapshot and
access_control_lists.<time>.snapshot.

i(   t
   generatorsNt   ExtendedAttributesc           B   sw   e  Z d  Z d d  Z d   Z d   Z d   Z d   Z d   Z	 d   Z
 d   Z d	 d
  Z d   Z d   Z RS(   s,   Hold a file's extended attribute informationc         C   s0   | |  _  | d j o h  |  _ n
 | |  _ d S(   s'   Initialize EA object with no attributesN(   t   indext   Nonet	   attr_dict(   t   selfR   R   (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt   __init__+   s    	 c         C   s'   t  | t  p t  | i |  i j S(   s!   Equal if all attributes are equal(   t
   isinstanceR   t   AssertionErrorR   (   R   t   ea(    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt   __eq__1   s    c         C   s   |  i  |  S(   N(   R
   (   R   R	   (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt   __ne__5   s    c         C   s!   |  i  o d i |  i   p d S(   Nt   /t   .(   R   t   join(   R   (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt   get_indexpath7   s    c         C   s  y% | i  i i | i | i    } Wn t j
 o } | d t i t i t i	 f j o d Sn | d t i
 t i t i f j o+ t i d t | i  | f d  d Sn   n Xx | D] } | i d  o q n | i   o | d j o q n y/ | i  i i | i | | i    |  i | <Wq t j
 o[ } | d t i j o q q| d t i j o Pq| d t i j o q q  q Xq Wd S(   s)   Set the extended attributes from an rpathi    Ns   Warning: listattr(%s): %si   s   system.s   com.apple.ResourceFork(   t   connt   xattrt	   listxattrt   patht   issymt   IOErrort   errnot
   EOPNOTSUPPt   EPERMt   ETXTBSYt   EACCESt   ENOENTt   ELOOPt   logt   Logt   reprt
   startswitht   isdirt   getxattrR   t   ENODATAt   ERANGE(   R   t   rpt	   attr_listt   exct   attr(    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt   read_from_rp9   s2    %### /   c         C   s=  y x | i  i i | i | i    D] } y& | i  i i | i | | i    Wq% t j
 oJ } | d t i j o* t	 i
 d | t | i  f d  q% q   q% Xq% WWn t j
 o{ } | d t i j p | d t i j o d Sq9| d t i j o+ t	 i
 d t | i  | f d  d Sq9  n Xd S(   s+   Delete all the extended attributes in rpathi    s*   Warning: unable to remove xattr %s from %si   Ns)   Warning: unable to clear xattrs on %s: %si   (   R   R   R   R   R   t   removexattrR   R   R   R   R   R   R   R   R   (   R   R%   t   nameR'   (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt   clear_rpV   s&    " &	(	c      
   C   s   |  i  |  x |  i i   D] \ } } y, | i i i | i | | d | i    Wq t j
 oe } | d t	 i
 t	 i t	 i t	 i t	 i f j o* t i d | t | i  f d  q q   q Xq Wd S(   s%   Write extended attributes to rpath rpi    s'   Warning: unable to write xattr %s to %si   N(   R,   R   t	   iteritemsR   R   t   setxattrR   R   R   R   R   R   R   R   t   EINVALR   R   R   (   R   R%   R+   t   valueR'   (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt   write_to_rpm   s     ,	c         C   s   |  i  | S(   s'   Return attribute attached to given name(   R   (   R   R+   (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt   get}   s    t    c         C   s   | |  i  | <d S(   s6   Set given name to given value.  Does not write to diskN(   R   (   R   R+   R0   (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt   set   s    c         C   s   |  i  | =d S(   s'   Delete value associated with given nameN(   R   (   R   R+   (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt   delete   s    c         C   s   |  i  S(   s-   Return true if no extended attributes are set(   R   (   R   (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt   empty   s    N(   t   __name__t
   __module__t   __doc__R   R   R
   R   R   R)   R,   R1   R2   R4   R5   R6   (    (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyR   )   s   								c         C   sB   t  |  i  } | i |   t  | i  } | i |  | | j S(   s8   Return true if rp1 and rp2 have same extended attributes(   R   R   R)   (   t   rp1t   rp2t   ea1t   ea2(    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt   ea_compare_rps   s
    c         C   s   d t  i |  i    g } x |  i i   D] \ } } | p | i |  q, t i |  i d d  } y$ | i d t  i |  | f  Wq, t	 j
 o! t
 i d t |  d  q, Xq, Wd i |  d S(   s0   Convert ExtendedAttributes object to text records
   # file: %ss   
R3   s   %s=0s%ss6   Warning: unable to store Unicode extended attribute %si   (   t   Ct	   acl_quoteR   R   R-   t   appendt   base64t   encodestringt   replacet   UnicodeEncodeErrorR   R   R   R   (   R	   t   str_listR+   t   valt   encoded_val(    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt	   EA2Record   s      $	c   
      C   sc  |  i  d  } | i d  } | d  d j p t i d | d    n | d } | d j o
 d } n t t i |  i  d   } t |  } x | D] } | i   } | p q n | d d j p
 t	 |  | i
 d	  } | d
 j o | i |  q | |  } | | d | d !d j p
 t	 d  | | d }	 | i | t i |	   q W| S(   s0   Convert text record to ExtendedAttributes objects   
i    i   s   # file: s   Bad record beginning: R   R   t   #t   =ii   i   t   0ss(   Currently only base64 encoding supported(    (   t   splitt   popt   metadatat   ParsingErrort   tupleR?   t   acl_unquoteR   t   stripR   t   findR4   RB   t   decodestring(
   t   recordt   linest   firstt   filenameR   R	   t   linet   eq_posR+   RH   (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt	   Record2EA   s0    
 
   
t   EAExtractorc           B   s2   e  Z d  Z e i d  Z e e  Z d   Z	 RS(   s?   Iterate ExtendedAttributes objects from the EA information files   (?:\n|^)(# file: (.*?))\nc         C   s5   | d j o d Sn t  t i |  i d   Sd S(   s/   Convert possibly quoted filename to index tupleR   R   N(    (   RQ   R?   RR   RM   (   R   RY   (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt   filename_to_index   s     (
   R7   R8   R9   t   ret   compilet   record_boundary_regexpt   staticmethodR\   t   record_to_objectR^   (    (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyR]      s   t   ExtendedAttributesFilec           B   s&   e  Z d  Z d Z e Z e e  Z RS(   s0   Store/retrieve EAs from extended_attributes filet   extended_attributes(	   R7   R8   R9   t   _prefixR]   t
   _extractorRb   RI   t   _object_to_record(    (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyRd      s   c         c   sn   xg t  i |  |  D]S \ } } | p t d | i f  | p t | i  } n | i |  | Vq Wd S(   s9   Update a rorp iter by adding the information from ea_iters   Missing rorp for index %sN(   t   rorpitert   CollateIteratorsR   R   R   t   set_ea(   t	   rorp_itert   ea_itert   rorpR	   (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt   join_ea_iter   s      t   AccessControlListsc           B   s   e  Z d  Z d 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 d  Z RS(   s   Hold a file's access control list information

	Since posix1e.ACL objects cannot be pickled, and because they lack
	user/group name information, store everything in self.entry_list
	and self.default_entry_list.

	c         C   s5   | |  _  | o |  i |  n d |  _ |  _ d S(   s2   Initialize object with index and possibly acl_textN(   R   t   set_from_textR   t
   entry_listt   default_entry_list(   R   R   t   acl_text(    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyR      s    	 c         C   s   g  g  |  _  |  _ x | i d  D] } | i d  } | d j o | |  } n | i   } | p q# n | i d  o' |  i | d  } |  i i |  q# |  i  i |  i |   q# Wd S(   s9   Set self.entry_list and self.default_entry_list from texts   
RJ   i    s   default:i   N(   Rr   Rs   RM   RT   RS   R    t   text_to_entrytupleRA   (   R   t   textRZ   t   comment_post
   entrytuple(    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyRq      s       c            sd     i  p d Sn t   i   i   }   i o& | i t   f d     i   n d i |  S(   s   Return text version of aclsR3   c            s   d    i  |   S(   s   default:(   t   entrytuple_to_text(   t   e(   R   (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt   <lambda>   s    s   
(   Rr   t   mapRy   Rs   t   extendR   (   R   t   slist(    (   R   s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt   __str__   s    
 
c         C   s  | \ } } } | d j o
 d } n | d j o! | \ } } d | p | } nz | d j o
 d } nc | d j o! | \ } }	 d |	 p | } n5 | d	 j o
 d
 } n | d j p
 t  |  d } d | d @o d p d | d @o d p d | d @o d p d f }
 | |
 S(   s0   Return text version of entrytuple, as in getfaclt   Us   user::t   us   user:%s:t   Gs   group::t   gs	   group:%s:t   Ms   mask::t   Os   other::s   %s%s%si   t   rt   -i   t   wi   t   x(   R   (   R   Rx   t   tagchart	   name_pairt   permsRv   t   uidt   unamet   gidt   gnamet
   permstring(    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyRy      s&     

 
c         C   sp  | i  d  \ } } } | o| y t |  } Wn t j
 o d | f } n X| d f } | d j o
 d } q	| d j p t | | f  d } no d } | d j o
 d } nR | d j o
 d } n; | d j o
 d	 } n$ | d
 j p t | | f  d } t |  d j p t | | f  | \ } }	 }
 | d j d >|	 d j d >B|
 d j B} | | | f S(   sr   Return entrytuple given text like 'user:foo:r--'

		See the acl_to_list function for entrytuple documentation.

		t   :t   userR   t   groupR   R   R   t   maskR   t   otherR   i   R   i   R   i   R   N(   RM   t   intt
   ValueErrorR   R   t   len(   R   Rv   t   typetextt	   qualifiert   permtextR   t   namepairt   typechart   readt   writet   executeR   (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyRu     s2       

 
 
 
#c         C   s.  | p	 | Sn | p t  |  t  |  j o d Sn x t t  |   D] } | | \ } } } | | \ } } }	 | | j p | |	 j o d Sn | | j o qL n | p | o d Sn | | \ }
 } \ } } | o | | j o qL qd Sn | o d Sn |
 | j o d SqL qL Wd S(   s7   True if the lists have same entries.  Assume preorderedi    i   (   R   t   range(   R   t   l1t   l2t   it   type1t	   namepair1t   perms1t   type2t	   namepair2t   perms2t   id1t   name1t   id2t   name2(    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt   cmp_entry_list1  s0     	!        c         C   sd   t  | |  i  p t  |  i   o | i   Sn |  i |  i | i  o |  i |  i | i  S(   sv   Compare self and other access control list

		Basic acl permissions are considered equal to an empty acl
		object.

		(   R   t	   __class__R   t   is_basicR   Rr   Rs   (   R   t   acl(    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyR
   C  s     c         C   s   |  i  |  S(   N(   R
   (   R   R   (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyR   P  s    c         C   sd   |  i  |  i | i  p d |  i f GHd Sn |  i  |  i | i  p d |  i f GHd Sn d S(   s9   Returns same as __eq__ but print explanation if not equals&   ACL entries for %s compare differentlyi    s)   Default ACL entries for %s do not comparei   (   R   Rr   R   Rs   (   R   R   (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt
   eq_verboseR  s    c         C   s!   |  i  o d i |  i   p d S(   NR   R   (   R   R   (   R   (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyR   ]  s    c         C   s_   |  i  o |  i o d Sn t |  i   d j p t |  i   t |  i   d j o |  i S(   s   True if acl can be reduced to standard unix permissions

		Assume that if they are only three entries, they correspond to
		user, group, and other, and thus don't use any special ACL
		features.

		i   i   (   Rr   Rs   R   R   (   R   (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyR   _  s     #c         C   s%   | i  i i |  \ |  _ |  _ d S(   s4   Set self.ACL from an rpath, or None if not supportedN(   R   t   eas_aclst   get_acl_lists_from_rpRr   Rs   (   R   R%   (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyR)   k  s    i   c         C   s&   | i  i i | |  i |  i |  d S(   s-   Write current access control list to RPath rpN(   R   R   t
   set_rp_aclRr   Rs   (   R   R%   t	   map_names(    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyR1   p  s    N(   R7   R8   R9   R   R   Rq   R   Ry   Ru   R   R
   R   R   R   R   R)   R1   (    (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyRp      s   					 							i   c         C   s   |  i  t i j p t  | o t | |  } n t i   } | i |  i  |  i	   o@ | o t | |  } n t i   } | i |  i t i
  n d S(   s@   Set given rp with ACL that acl_text defines.  rp should be localN(   R   t   Globalst   local_connectionR   t   list_to_aclt   posix1et   ACLt   applytoR   R!   t   ACL_TYPE_DEFAULT(   R%   Rr   Rs   R   R   t   def_acl(    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyR   v  s     c      	   C   s{  |  i  t i j p t  y t i d |  i  } Wnw t j
 ok } | d t i	 j o
 d } q | d t i j o- t i d t |  i  | f d  d } q   n X|  i   o y t i d |  i  } WqWt j
 ok } | d t i	 j o
 d } qM| d t i j o- t i d t |  i  | f d  d } qM  qWXn d } | o
 t |  | o
 t |  f S(   s=   Returns (acl_list, def_acl_list) from an rpath.  Call locallyt   filei    s'   Warning: unable to read ACL from %s: %si   t   filedefs/   Warning: unable to read default ACL from %s: %sN(   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R!   t   acl_to_list(   R%   R   R'   R   (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyR     s0     
	
 
	
c            s%   d       f d   } t  | |   S(   s+  Return list representation of posix1e.ACL object

	ACL objects cannot be pickled, so this representation keeps
	the structure while adding that option.  Also we insert the
	username along with the id, because that information will be
	lost when moved to another system.

	The result will be a list of tuples.  Each tuple will have the
	form (acltype, (uid or gid, uname or gname) or None, permissions
	as an int).  acltype is encoded as a single character:

	U - ACL_USER_OBJ
	u - ACL_USER
	G - ACL_GROUP_OBJ
	g - ACL_GROUP
	M - ACL_MASK
	O - ACL_OTHER

	c         S   s   |  t  i j o d Sn |  t  i j o d Sng |  t  i j o d SnO |  t  i j o d Sn7 |  t  i j o d Sn |  t  i j p
 t |   d Sd  S(   NR   R   R   R   R   R   (   R   t   ACL_USER_OBJt   ACL_USERt   ACL_GROUP_OBJt	   ACL_GROUPt   ACL_MASKt	   ACL_OTHERR   (   t   tag(    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt   acltag_to_char  s         c            s     |  i   } | d j o" |  i } | t i |  f } n6 | d j o" |  i } | t i |  f } n d  } |  i i d >|  i i d >B|  i i	 B} | | | f S(   NR   R   i   i   (
   t   tag_typeR   t
   user_groupt	   uid2unamet	   gid2gnameR   t   permsetR   R   R   (   t   entryR   R   t
   owner_pairR   R   (   R   (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt   entry_to_tuple  s    		(   R|   (   R   R   (    (   R   s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyR     s    	
c   
      C   sc  d   } d   } t  i   } x>|  D]6\ } } } d } | o | ou | d j o t i |   } n0 | d j p t | | | f  t i |   } | d j o | | d  q% q q | d d j	 p t | | | f  | d } n t  i |  }	 | |  |	 _ | d j	 o | |	 _	 n | d ?|	 i
 _ | d ?d @|	 i
 _ | d @|	 i
 _ q% W| S(	   s  Return posix1e.ACL object from list representation

	If map_names is true, use user_group to update the names for the
	current system, and drop if not available.  Otherwise just use the
	same id.

	See the acl_to_list function for the format of an acllist.

	c         S   s   |  d j o t  i Sn |  d j o t  i Sng |  d j o t  i SnO |  d j o t  i Sn7 |  d j o t  i Sn |  d j p
 t |   t  i Sd S(   s=   Given typechar, query posix1e module for appropriate constantR   R   R   R   R   R   N(   R   R   R   R   R   R   R   R   (   R   (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt   char_to_acltag  s         c         S   sb   t  i o t i i d |  f  n t i |   o d Sn t i d |  f d  |  t |  <d S(   s(   Warn about acl with name getting droppedsK   --never-drop-acls specified but cannot map name
%s occurring inside an ACL.Ns   Warning: name %s not found on system, dropping ACL entry.
Further ACL entries dropped with this name will not trigger further warningsi   (   R   t   never_drop_aclsR   R   t
   FatalErrort   dropped_acl_namest   has_key(   R+   (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt	   warn_drop  s    
	 	R   R   i   i    i   N(   R   R   R   R   t   acl_user_mapR   t   acl_group_mapt   EntryR   R   R   R   R   R   (
   Rr   R   R   R   R   R   R   R   t   idR   (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyR     s2    
		   $ c         C   sB   t  |  i  } | i |   t  | i  } | i |  | | j S(   s4   Return true if rp1 and rp2 have same acl information(   Rp   R   R)   (   R:   R;   t   acl1t   acl2(    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt   acl_compare_rps  s
    c         C   s#   d t  i |  i    t |   f S(   s7   Convert an AccessControlLists object into a text records   # file: %s
%s
(   R?   R@   R   t   str(   R   (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt
   ACL2Record  s    c         C   s   |  i  d  } |  |  } | i d  p t i d |   n | d } | d j o
 d } n t t i |  i d   } t | |  |  S(   s3   Convert text record to an AccessControlLists objects   
s   # file: s   Bad record beginning: i   R   R   (    (	   RT   R    RO   RP   RQ   R?   RR   RM   Rp   (   RV   t   newline_post
   first_lineRY   R   (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt
   Record2ACL  s    

 
t   ACLExtractorc           B   s   e  Z d  Z e e  Z RS(   s   Iterate AccessControlLists objects from the ACL information file

	Except for the record_to_object method, we can reuse everything in
	the EAExtractor class because the file formats are so similar.

	(   R7   R8   R9   Rb   R   Rc   (    (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyR     s   t   AccessControlListFilec           B   s&   e  Z d  Z d Z e Z e e  Z RS(   s1   Store/retrieve ACLs from extended attributes filet   access_control_lists(	   R7   R8   R9   Rf   R   Rg   Rb   R   Rh   (    (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyR   &  s   c         c   sn   xg t  i |  |  D]S \ } } | p t d | i f  | p t | i  } n | i |  | Vq Wd S(   s:   Update a rorp iter by adding the information from acl_iters   Missing rorp for index %sN(   Ri   Rj   R   R   Rp   t   set_acl(   Rl   t   acl_iterRn   R   (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt   join_acl_iter,  s      c         C   s1   t  |  i  } |  i   p | i |   n | S(   sO   Get acls of given rpath rp.

	This overrides a function in the rpath module.

	(   Rp   R   R   R)   (   R%   R   (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt   rpath_acl_get5  s     c         C   s
   t  |   S(   s?   Get a blank AccessControlLists object (override rpath function)(   Rp   (   R   (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt   rpath_get_blank_acl@  s    c         C   s@   t  |  i  } |  i   o |  i   o | i |   n | S(   sZ   Get extended attributes of given rpath

	This overrides a function in the rpath module.

	(   R   R   t   issockt   isfifoR)   (   R%   R	   (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt   rpath_ea_getE  s    c         C   s
   t  |   S(   s?   Get a blank ExtendedAttributes object (override rpath function)(   R   (   R   (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pyt   rpath_get_blank_eaQ  s    (    (    (0   R9   t
   __future__R    RB   R   R_   R   t   ImportErrort   staticR   R   t
   connectionRO   Ri   R   R?   t   rpathR   R   R   R>   RI   R\   t   FlatExtractorR]   t   FlatFileRd   Ro   Rp   R   R   R   R   R   R   R   R   R   R   R   R   t   acl_getR   t   get_blank_aclR   t   ea_getR   t   get_blank_ea(    (    (    s:   /var/lib/python-support/python2.5/rdiff_backup/eas_acls.pys   <module>   sF   $  xd									.:													
		