
    yf_                        S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	J
r
  S SKJr  SSKJrJr  \(       a  S SKrS rOSrS rSSKJr  \" 5       rSS	KJr  SS
KJr  SSKJrJr  SSKJr  SSKJrJrJ r J!r!J"r"J#r#  SSKJ$r$  SSK%J&r&  SSK'J(r(  SSK)J*r*J+r+  SSK,J-r-  SSK.J/r/  S r0Sr1 " S S5      r2 " S S5      r3 " S S\Rh                  \35      r5g)    N)defaultdict)SIGINT   )llfusehas_pyfuse3c                 F   ^  [         R                  " T 5      U 4S j5       nU$ )Nc                     >#    T" U 0 UD6$ 7fN )argskwargsfns     +/usr/lib/python3/dist-packages/borg/fuse.pywrapperasync_wrapper.<locals>.wrapper   s     t&v&&s   	)	functoolswraps)r   r   s   ` r   async_wrapperr      s#    			' 
	'    c                     U $ r
   r   )r   s    r   r   r      s    	r   )create_logger)blake2b_128)Archiver)Archiveget_item_uid_gid)FuseVersionsIndex)	daemonizedaemonizinghardlinkablesignal_handlerformat_file_sizeError)msgpack)Item)LRUCache)uid2user	gid2group)	is_darwin)RemoteRepositoryc                      [         (       a&   [        R                  " [        R                  5        g [        R                  " SS9$ !    g= f)Nr   )workers)r   triorunr   mainr   r   r   	fuse_mainr/   /   s:    {	HHV[[! {{1%%	s   $A A
   c                   z    \ rS rSrSrSr\R                  " S5      r\R                  S:X  d   eS r
S rSS	 jrS
rg)	ItemCacheB   z
This is the "meat" of the file system's metadata storage.

This class generates inode numbers that efficiently index items in archives,
and retrieves items from these inode numbers.
i    z=cII	   c                     Xl         [        5       U l        SU l        SU l        [
        R                  " SS9U l        [        SS S9U l	        SU l
        SU l        g )Nr   i@B zborg-tmp)prefix
   c                     g r
   r   _s    r   <lambda>$ItemCache.__init__.<locals>.<lambda>s   s    dr   capacitydispose)decrypted_repository	bytearraymetawrite_offsetoffsettempfileTemporaryFilefdr%   chunksindirect_itemsdirect_items)selfr@   s     r   __init__ItemCache.__init__U   sZ    $8! K	  ((
; NC  r   c           	         XR                   -
  nUS:  a  [        S5      eU R                  U   [        S5      :X  a  U R                  R                  U R                  U5      u  p4nX$-
  n[        U R                  XfS-    5      nU R                  R                  U5      nU(       d5  [        U R                  R                  U/5      5      u  pXR                  U'   [        U5      US  n
[        R                  " 5       nUR                  U
5        [!        [        U5      S9$ U R                  U   [        S5      :X  a  ["        R%                  U R                  US-   US-    S	5      nU R&                  R)                  U[*        R,                  5        [!        [        [        R                  " U R&                  S
S95      S9$ [        S5      e)Nr   z3ItemCache.get() called with an invalid inode number   I    internal_dict   Sr   r4   littlei   )	read_sizezInvalid entry type in self.meta)rD   
ValueErrorrB   ordindirect_entry_structunpack_frombytesrH   getnextr@   get_many
memoryviewr#   Unpackerfeedr$   int
from_bytesrG   seekioSEEK_SET)rK   inoderD   r:   chunk_id_relative_offsetchunk_offsetchunk_id_offsetchunk_idchunkcsizedataunpacker	fd_offsets                r   r[   ItemCache.get{   sp   $A:RSS99VD	)8<8R8R8^8^_c_h_hjp8q5A$?OTYY7KLMHKKOOH-E#D$=$=$F$Fz$RS(-H%e$\]3D'')HMM$d8n55YYv#d)+tyy!FQJ'GRIGGLLBKK0d7+;+;DGGt+T&UVV>??r   Nc              #   "  #    [         R                  " 5       nSnSnSnSnU R                  n	U R                  n
U R                  R
                  n[        XR                  R                  U5      5       GH  u  nu  pU	S-   [        U
5      :  a  U
[        U R                  5      -   =U l        n
XXS-   & U	nU	S-  n	Xg-  n[        U5      nUR                  U5          UR                  5       nSnXV-
  nU(       a  [        U5      U-
  OUR                  5       U-
  nXUUU-    -  nUU-  nU(       a  M  [!        WS9nU(       a  U" U5      (       a  U(       d
  SU;   a  SnM  Un[        U5      nUU-
  U:  nSnU	S-   [        U
5      :  a  U
[        U R                  5      -   =U l        n
U(       au  U R"                  R%                  S[&        R(                  5      nU R"                  R+                  U5        S	UR-                  S
S5      -   XU	S-   & U =R.                  S-  sl        O*UU-
  U-
  nU" XSX-
  U5        U =R0                  S-  sl        XR2                  -   nU	S-  n	UU4v   GM     Xl        g ! [         R                   a    Sn GNf = f7f)Nr   r   rP   TFrQ   partr4   rS      rT   r   rO   )r#   r_   rC   rB   rX   	pack_intozipr@   r]   lenrZ   GROW_META_BYr`   unpack	OutOfDatatellr$   rG   rc   rd   SEEK_ENDwriteto_bytesrJ   rI   rD   )rK   archive_item_idsfilterconsider_part_filesrn   stream_offsetchunk_beginlast_chunk_lengthmsgpacked_bytesrC   rB   pack_indirect_intokeyrl   rm   current_id_offsetitemneed_more_datastartlengthcurrent_itemcurrent_item_lengthcurrent_spans_chunkspositem_offsetrf   s                             r   iter_archive_itemsItemCache.iter_archive_items   s    ##% ((yy!77AA"%&68Q8Q8Z8Z[k8l"mC%b CI-#'%0A0A*B#BB	D36R/0 ,BL,K #D	MM$*#??,D%*N &3 1?#d)e+X]]_WdEdeFl#;;'!$/&,,6IfX\n&)O.&),&7#'47J'J['X$"%!#s4y0'+eD4E4E.F'FFDI$ ('',,q"++6CGGMM,/:>aQYAZ:ZDlQ&67%%*%"/2E"E"SK&t4Aacno''1,'${{2!Tk!w  #nR )s (( *%)N*s+   CJI2-FJ2JJJJ)rH   r@   rJ   rG   rI   rB   rD   rC   )NF)__name__
__module____qualname____firstlineno____doc__rw   structStructrX   sizerL   r[   r   __static_attributes__r   r   r   r2   r2   B   sC     #L"MM&1 %%***$L@0X)r   r2   c                   d    \ rS rSrSrS rS rS rS rS r	SS	 jr
/ 4S
 jr/ 4S jrS rS rSrg)FuseBackend   zJVirtual filesystem based on archive(s) to provide information to fuse
    c                    X0l         X@l        UR                  U l        X l        Xl        0 U l        [        [        S S9U l        SU l	        0 U l
        [        [        5      U l        [        R                  " 5       U l        [        R"                  " 5       U l        S U l        0 U l        [+        U5      U l        SU l        SU l        S U l        S U l        SU l        g )Nc                     g r
   r   r9   s    r   r;   &FuseBackend.__init__.<locals>.<lambda>   s    tr   r=   r   F)repository_uncached_argsnumeric_ids	_manifestr   _itemsr%   FILES_inode_cacheinode_countparentr   dictcontentsosgetuiddefault_uidgetgiddefault_giddefault_dirpending_archivesr2   cacheallow_damaged_filesversions
uid_forced
gid_forcedumask)rK   r   manifest
repositoryr   r@   s         r   rL   FuseBackend.__init__   s    #- 
++! $e^L $D)99;99; "34
#( 
r   c                    U R                  SS9  U R                  R                  R                  (       aL  U R                  (       a  [        S5      eU R                  U R                  R                  R                  5        g [        5       U l        U R                  R                  R                  U R                  5       H  nU R                  (       a  U R                  UR                  5        M1  U R                  S[        UR                  R                  5       S-  5      S9nX R                   S   ["        R$                  " UR                  5      '   UR                  U R&                  U'   M     g )Nr   )r   z_for versions view, do not specify a single archive, but always give the repository as location.    eA)r   mtime)_create_dirr   locationarchiver   r"   _process_archiver   versions_indexr   archiveslist_consideringnamera   ts	timestampr   r   fsencoder   )rK   r   archive_inodes      r   _create_filesystemFuseBackend._create_filesystem  s	   "::&&}} J K K!!$**"5"5"="=>"3"5D>>22CCDJJO==))',,7 %)$4$4ASI]I]I_beIeEf$4$gMBOMM!$R[[%>?;B<<D))-8 Pr   c                     U R                   R                  U5      nUb  U$  U R                  U   $ ! [         a.    U R                  R                  U5      nX R                   U'   Us $ f = fr
   )r   r[   r   KeyErrorr   )rK   rf   r   s      r   get_itemFuseBackend.get_item$  sk      $$U+K	;;u%% 	::>>%(D'+e$K		s   1 5A)(A)c                     U R                   R                  US 5      nUb(  U R                  U[        R                  " U5      /5        g g r
   )r   popr   r   r   )rK   rf   archive_names      r   check_pending_archive!FuseBackend.check_pending_archive1  sA    ,,00=#!!,\1J0KL $r   c                 D    U =R                   S-  sl         U R                   $ )Nr   )r   )rK   s    r   _allocate_inodeFuseBackend._allocate_inode7  s    Ar   Nc                     U R                  5       nUbB  [        U R                  R                  5       S9U R                  U'   X R                  U   l        OU R                  U R                  U'   XR                  U'   U$ )zCreate directory
        rQ   )r   r$   r   as_dictr   r   r   )rK   r   r   inos       r   r   FuseBackend._create_dir;  sn     ""$#$2B2B2J2J2LMDKK%*KK"#//DKK!C
r   c                 f    X!R                  S5      -   nSnU H  nU R                  U   U   nM     U$ )N   /r   )splitr   )rK   pathr6   segmentsrf   segments         r   
find_inodeFuseBackend.find_inodeG  s:    JJt,,GMM%(1E  r   c                 8  ^^ 0 U l         [        R                  " 5       n[        U R                  U R
                  U R                  UU R                  R                  S9nU R                  R                  n[        R                  " U R                  R                  U R                  R                  5      nUR                  5       (       + =(       d    UmT(       a  0 OSmUU4S jn[        R                  " XgU5      nU R                   R#                  UR$                  R&                  UU R                  R                  S9 GH  u  pU(       aN  [(        R*                  R-                  U
R.                  R1                  [(        R*                  5      US 5      U
l        [(        R2                  " U
R.                  5      n[4        R6                  " U
R8                  5      nU(       a"   U R;                  X5      nXR<                  U'   M  X+R1                  S5      -   nSnUSS  H  nU RA                  UU5      nM     U RC                  US   XX,U	TU5        GM     [        R                  " 5       U-
  n[D        RG                  SUURH                  5        g! [>         a     Nf = f)	z9Build FUSE inode hierarchy from archive metadata
        )r   Nc                    > T(       ah  U(       d`  [        U R                  5      (       aE  U R                  SS5      (       a-  SU ;  a&  U R                  S5      S 4TU R                  S5      '   g g g g g g )Nhardlink_masterTsourcerH   r   )r   moder[   )r   matchedhardlink_masterspartial_extracts     r   peek_and_store_hardlink_mastersEFuseBackend._process_archive.<locals>.peek_and_store_hardlink_mastersZ  sd    L4K4KHH.55($:N6:hhx6H$5O &!12 ;O5 5Lr   )r   r   r   r   z9fuse: _process_archive completed in %.1f s for archive %s)%file_versionstimeperf_counterr   r   r   r   r   r   strip_componentsr   build_matcherpatternspathsemptybuild_filterr   r   metadataitemsr   sepjoinr   r   r   statS_ISDIRr   r   r   r   _process_inner_process_leafloggerdebugr   )rK   r   r6   t0r   r   matcherr   r   
item_inoder   r   is_dirrf   r   r   r   durationr   r   s                     @@r   r   FuseBackend._process_archiveN  s      $22DHHdnnl.2jj.L.LN::66(()<)<djj>N>NO%mmo-A1A!02d	P
 &&wQab $

 = =g>N>N>T>T]cRVR\R\RpRp !> !rJFFKK		(?@P@Q(RS	;;tyy)D\\$)),F	 !OOD9E *.KK&

4 00HF#CR=,,Wf= )x|T6:/1AC+!r. $$&+PRZ\c\h\hi   s    J
JJc	                 P  ^  UR                   n	U? U=(       d    0 nU 4S jn
S	S jnSU;   GaG  [        UR                  5      (       Ga,  [        R                  R                  UR                  R                  [        R                  5      US  5      nUR                  UR                  S U45      u  pU(       a  [        R                  " U5      nT R                  (       a  T R                  U   nU" XSS9n T R                  X5      nT R!                  U5      nUR                  SS5      S-   Ul        UT R$                  U'   O4Ub.  Xl        UnUT R$                  U'   U(       a  S U	4XrR                  '   OUnT R                  (       aQ  U(       dJ  T R)                  X5      n[        R                  " U	5      nU
" UU5      nUb  U" X5      nUT R                  U'   UT R*                  W'   U(       a  UT R,                  U   U'   g g ! [         a    [        R                  SX5         g f = f)
Nc                    > SU ;   ap  [        U5      nTR                  R                  US5      u  p4[        SR                  S U R                   5       5      5      nXT:w  a  US-  nX54TR                  U'   U$ g )NrH   )r   Nr   c              3   ,   #    U  H
  u  n  o!v   M     g 7fr
   r   ).0rj   r:   s      r   	<genexpr>BFuseBackend._process_leaf.<locals>.file_version.<locals>.<genexpr>  s     2^R]!Q8R]s   r   )r   r   r[   r   rH   )r   r   file_idcurrent_versionprevious_idcontents_idrK   s         r   file_version/FuseBackend._process_leaf.<locals>.file_version  s    4%d+/3/B/B/F/FwPY/Z,)#((2^RVR]R]2^*^_-#q(O3B3OD''0&&  r   c                     U(       a  U R                  SS5      nU SUS   -   -  n [        R                  R                  U 5      u  p[        R                  " SU-  5      nX-   U-   $ )Nr   r   r   z.%05d)rsplitr   r   splitextr   )r   versionadd_dir
path_fnameextversion_encs         r   make_versioned_name6FuseBackend._process_leaf.<locals>.make_versioned_name  s_    ![[q1
z"~--((.ID++g&78K%++r   r   T)r  z#Skipping broken hard link: %s -> %snlinkr   F)r   r   r   r   r   r   r   r   r[   r   r   r   r   r   r  warningr   r   r   rH   r   r   r   )rK   r   r   r   r6   r  r  r   stripped_componentsr   r  r  r   rH   link_targetr  rf   enc_paths   `                 r   r  FuseBackend._process_leafz  s   yyI+1r	'	, tTYY 7 7VV[[!2!2266!:;N;O!PQF"2"6"6t{{T6N"SF kk+6=="00=G"5kTX"YK OOK@E }}U+!XXgq1A5
%)E"#$"%)E"#594L$[[1E==((6F{{4(H"42G"*49/6""8,#E*/DMM&!$' 7   NN#H$Ws   6H  H%$H%c                 r    U R                   U   nX;   a  X1   nU$ U R                  U5      nU(       a  XCU'   U$ r
   )r   r   )rK   r   parent_inodedirrf   s        r   r   FuseBackend._process_inner  sD    mmL);IE
  $$\2E!D	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   rL   r   r   r   r   r   r   r   r  r   r   r   r   r   r   r      sI    >H&M 
 ')  57 *jXD0Lr   r   c                      \ rS rSrSrS rS rSS jr\SS j5       r	SS jr
\SS	 j5       r\SS
 j5       r\SS j5       r\SS j5       r\SS j5       r\SS j5       r\S 5       r\(       a  S rOS r\SS j5       rSrg)FuseOperationsi  z(Export archive as a FUSE filesystem
    c                 z   [         R                  R                  U 5        [        R                  XX2XE5        XPl        [        [        R                  R                  S[        R                  " 5       =(       d    S5      5      n[        R                  SU5        [        US S9U l        [        [        S S9U l        g )NBORG_MOUNT_DATA_CACHE_ENTRIESr   z$mount data cache capacity: %d chunksc                     g r
   r   r9   s    r   r;   )FuseOperations.__init__.<locals>.<lambda>  s    SWr   r=   c                     g r
   r   r9   s    r   r;   r0    s    Dr   )r   
OperationsrL   r   r@   ra   r   environr[   	cpu_countr  r  r%   
data_cacher   	_last_pos)rK   r   r   r   r   r@   data_cache_capacitys          r   rL   FuseOperations.__init__  s    ""4(TdY$8!!"**..1PRTR^R^R`Rede"fg;=PQ",?X!5.Ir   c                 z   [         R                  SU R                  [        U R                  5      [        [        R                  " U R                  5      [        U R                  5      [        R                  " U R                  5      -  -   5      5        [         R                  S[        U R                  5      5        [         R                  SU R                  R                  U R                  R                  -   U R                  R                  U R                  R                  [        [        R                  " U R                  R                  5      5      [        [        R                  " U R                  R                  R!                  5       5      R"                  5      5        [         R                  S[        U R$                  R'                  5       5      U R$                  R(                  [        [+        S U R$                  R'                  5        5       5      5      5        U R,                  R/                  5         g )Nz$fuse: %d synth inodes, %d edges (%s)zfuse: %d pending archivesz]fuse: ItemCache %d entries (%d direct, %d indirect), meta-array size %s, direct items size %sz#fuse: data cache: %d/%d entries, %sc              3   <   #    U  H  u  p[        U5      v   M     g 7fr
   )rv   )r  r   rk   s      r   r  2FuseOperations.sig_info_handler.<locals>.<genexpr>  s     )_G^#e**G^s   )r  r  r   rv   r   r!   sys	getsizeofr   r   rJ   rI   rB   r   r   rG   filenost_sizer5  r   	_capacitysumr@   log_instrumentation)rK   sig_nostacks      r   sig_info_handlerFuseOperations.sig_info_handler  sn   ;%%s4;;'7 &cmmDKK&@3t{{CSVYVcVcdhdtdtVuCu&uv		x
 	0#d6K6K2LMtZZ,,tzz/H/HH$**JaJacgcmcmc|c|%cmmDJJOO&DE%bggdjjmm.B.B.D&E&M&MN	P 	:C@U@U@W<XZ^ZiZiZsZs%c)_tG\G\G^)_&_`	b!!557r   c           	         SS jn/ SQnU(       a   UR                  UR                  S5      5        [        (       aO  U" USSS[        5      nU=(       d"    [        R
                  R                  U5       S3nUR                  SU 35        U" US	S
S[        5      nU(       a  U" USS
S[        5        U" USS
S[        5      U l	        U" USS
S[        5      U l
        U" USSS[        5      U l        U" USSS[        5      U l        U" USSS[        SS9U l        U R                  b  U R                  OU R                  nU R                  b  U R                  OU R                   n	[#        U5      n
[%        U	5      n['        U
[        5      (       d   e['        U[        5      (       d   eSU R                  ) -  n[)        U[        [*        R*                  " 5       S-  5      XXS9U l        U R/                  5         [0        R2                  " XU5        U(       do  ['        U R4                  [6        5      (       a  [9        5         OE[;        5        u  p[<        R?                  S5        U R4                  RA                  X5        SSS5        Sn [C        SU RD                  5         [C        SU RD                  5         [G        5       nSSS5        SSS5        WSL =(       d    U[H        :H  =(       a    Un[0        RJ                  " U5        g! , (       d  f       N= f! , (       d  f       N[= f! , (       d  f       Nd= f! [0        RJ                  " U5        f = f)z6Mount filesystem on *mountpoint* with *mount_options*.r   c                 0   [        U [        5      (       d   e[        U 5       H  u  pgXq:X  a  U R                  U5        Us  $ UR	                  US-   5      (       d  M:  U R                  U5        UR                  SS5      S   nU[        L a.  UR                  5       n	U	S;   a    gU	S;   a    g[        SU-  5      eU[        L a   [        XS9s  $  U" U5      s  $    U$ ! [         a    [        SU-  5      S ef = f! [         a    [        SU-  5      S ef = f)	N=r   )yyestrue1T)nnofalse0Fzunsupported value in option: %s)base)

isinstancelist	enumerater   
startswithr   boollowerrV   ra   )
optionsr   presentnot_presentwanted_typeint_baseidxoptionvaluevs
             r   
pop_option(FuseOperations.mount.<locals>.pop_option  s.   gt,,,,(1=KK$"N$$S3Y//KK$"LLa03E"d*!KKM 99#' 99#(()JV)STT"c)c#&u#<<_*511)  20 #"  * c",-NQW-W"X^bbc & _()JV)STZ^^_s   CC;C8;D)zfsname=borgfsrodefault_permissions,volname z	 (borgfs)zvolname=ignore_permissionsTFre  r   r   uidNgidr   rs   )r]  iA  r   )r   r   usergrouprj  rk  z<fuse: mount local repo, going to background: migrating lock.SIGUSR1SIGINFO)r   )&extendr   r(   strr   r   basenameappendrW  r   r   ra   r   r   r   r   r   r&   r'   rS  r$   r   r   r   r   initr   r)   r   r   r  r  migrate_lockr    rE  r/   r   close)rK   
mountpointmount_options
foregroundrb  rY  rg  ri  dir_uiddir_giddir_user	dir_groupdir_modeold_idnew_idumountsignals                    r   mountFuseOperations.mount  s   	#B ANN=..s349 )RSAG KBGG$4$4Z$@#A!KGNNXgY/0'1EtUTXY w 5tUDI#-g7LdTY[_#` "7JeTJ$WeT4E$WeT4E!QaH
%)__%@$//dFVFV%)__%@$//dFVFVG$g&	(C(((()S))))djj[(XSs9J5K%-GZ!Dg.$224DEE ]&6vLL!_`,,99&I # 	!	4+@+@A	4+@+@A" B B nI6)9)HjFLL % #] BA BA LL sH   
3LL7 L&5L L&%L7 
L
L#	L&&
L40L7 7MNc                     [         R                  " 5       nSUl        SUl        SUl        SUl        SUl        SUl        SUl        SUl	        SUl
        U$ )N   r      )r   StatvfsDataf_bsizef_frsizef_blocksf_bfreef_bavailf_filesf_ffreef_favail	f_namemax)rK   ctxstat_s      r   statfsFuseOperations.statfsC  sT    ""$r   c           	         U R                  U5      n[        R                  " 5       nXl        SUl        SUl        SUl        UR                  U R                  ) -  Ul	        UR                  SS5      Ul        [        X0R                  U R                  U R                  U R                   U R"                  S9u  Ul        Ul        UR                  SS5      Ul        UR+                  5       Ul        SUl        UR,                  UR.                  -   S-
  UR.                  -  Ul        UR2                  =Ul        nUR                  SU5      Ul        UR                  S	U5      Ul        UR                  S
U5      Ul        U$ )Nr   i,  r   r   )numericuid_defaultgid_defaultr   r   rdevr  atimectime	birthtime)r   r   EntryAttributesst_ino
generationentry_timeoutattr_timeoutr   r   st_moder[   st_nlinkr   r   r   r   r   r   st_uidst_gidst_rdevget_sizer?  
st_blksize	st_blocksr   st_mtime_nsst_atime_nsst_ctime_nsst_birthtime_ns)rK   rf   r  r   entrymtime_nss         r   _getattrFuseOperations._getattrQ  s?   }}U#&&(! 		TZZK/'1-%5dDTDTBFBRBR`d`p`pAE]a]l]l&n"el + ==5+;+;;a?EDTDTT'+zz1H HHWh7 HHWh7 $h ?r   c                      U R                  XS9$ )N)r  )r  rK   rf   r  s      r   getattrFuseOperations.getattrh  s    }}U},,r   c                 d    U R                  U5      nUR                  S0 5      R                  5       $ )Nxattrs)r   r[   keysrK   rf   r  r   s       r   	listxattrFuseOperations.listxattrl  s*    }}U#xx"%**,,r   c                     U R                  U5      n UR                  S0 5      U   =(       d    S$ ! [         a&    [        R                  " [        R
                  5      S ef = f)Nr  r   )r   r[   r   r   	FUSEErrorENOATTR)rK   rf   r   r  r   s        r   getxattrFuseOperations.getxattrq  sV    }}U#	=88Hb)$/636 	=""6>>2<	=s	   1 0A!c                    U R                  U5        US:X  a  UnO_US:X  a  U R                  U   nOIU R                  U   R                  U5      nU(       d$  [        R
                  " [        R                  5      eU R                  U5      $ )N   .   ..)	r   r   r   r[   r   r  errnoENOENTr  )rK   r(  r   r  rf   s        r   lookupFuseOperations.lookupy  sq    ""<04< EU]KK-EMM,/33D9E&&u||44}}U##r   c                    U R                   (       dP  U R                  U5      nSU;   a9  [        R                  S5        [        R
                  " [        R                  5      e[        (       a  [        R                  " US9$ U$ )Nchunks_healthyzzFile has damaged (all-zero) chunks. Try running borg check --repair. Mount with allow_damaged_files to read damaged files.)fh)
r   r   r  r"  r   r  r  EIOr   FileInfo)rK   rf   flagsr  r   s        r   openFuseOperations.open  sc    ''=='D4'   W X&&uyy11,7Kv%(BUBr   c                 (    U R                  U5        U$ r
   )r   r  s      r   opendirFuseOperations.opendir  s    ""5)r   c                 &   / nU R                  U5      nU R                  R                  US5      u  pgXr:  a  Su  pgX'-  nUR                  n[	        U[        U5      5       GH  n	X   u  pnX:  a  X+-  nX{-  nUS-  nM  [        X;U-
  5      nXR                  ;   a.  U R                  U
   nX--   [        U5      :X  a  U R                  U
	 OSU R                  R                  XR                  R                  U
5      5      nX--   [        U5      :  a  XR                  U
'   UR                  XX--    5        SnX=-  nU(       a  M  XR                  ;   a  U R                  R                  XU45        OXg4U R                  U'     O   SR                  U5      $ )N)r   r   r   r   r   )r   r6  r[   rH   rangerv   minr5  r   decryptr   rs  updr   )rK   r  rD   r   partsr   chunk_norh   rH   r^  idsrl   rN  rm   s                  r   readFuseOperations.read  sx   }}R  "&!3!3B!? %+"H3v;/C!;LB5z!ADf*%A__$r*:T*+xx'',D,D,H,H,LM:D	)*.OOB'LLVZ01FID4'NN&&rl+CD*2)ADNN2&5 06 xxr   c                 &  #    SU4SU R                   U   4/nUR                  U R                  U   R                  5       5        [	        XBS  U5       H:  u  nu  pgU R                  U5      n[        R                  " X6XS-   5      (       a  M:    g    g 7fNr  r  r   )r   rp  r   r   rU  r  r   readdir_reply)	rK   r  offtokenentriesir   rf   attrss	            r   readdirFuseOperations.readdir  s     bzE4;;r?#;<GNN4==,2245$-gdmS$A =De,++EAFF %Bs   BBBc              #      #    SU4SU R                   U   4/nUR                  U R                  U   R                  5       5        [	        X2S  U5       H"  u  nu  pVU R                  U5      nXWUS-   4v   M$     g 7fr  )r   rp  r   r   rU  r  )rK   r  r  r  r  r   rf   r  s           r   r  r    sx     bzE4;;r?#;<GNN4==,2245$-gdmS$A =De,1q5(( %Bs   A7A9c                 d    U R                  U5      n[        R                  " UR                  5      $ r
   )r   r   r   r   r  s       r   readlinkFuseOperations.readlink  s#    }}U#{{4;;''r   )	r6  r   r5  r@   r   r   r   r   r   r!  r
   )r   r   r   r   r   rL   rE  r  r   r  r  r  r  r  r  r  r  r  r   r  r  r   r   r   r   r,  r,    s    J8Z!x  . - - - - = = 
$ 
$ 
C 
C   ) )X 		) ( (r   r,  )6r  r   rd   r   r   r   r<  rE   r   collectionsr   r  r   	fuse_implr   r   r,   r   r  r   crypto.low_levelr   archiverr   r   r   r   	hashindexr   helpersr   r   r   r    r!   r"   r#   r   r$   lrucacher%   platformr&   r'   platformflagsr(   remoter)   r/   r   r2   r   r2  r,  r   r   r   <module>r     s      	 	   
   #  *  D "	 )  . ( b b    ) $ $	&  	
i) i)XZ ZzN(V&& N(r   