Ë
    ­Ó^jÔ  ã                  ó*  — U d dl mZ d dlZd dlZd dlZd dlZd dlmZmZm	Z	 d dl
mZ d dlmZ dd„Zdd„Zdd„Zdd	„Zdd
œdd„Zej&                  dk7  xr ej(                  ej*                  v Zded<   ej(                  ej0                  v Zded<   g d¢Zy)é    )ÚannotationsN)ÚEACCESÚEIOÚEISDIR)ÚPath)ÚFinalc                ó†   — t        |«      }|r4t        j                  | |«      x}dk(  rt        t        d«      ‚||d }|rŒ3yy)ac  
    Write the whole buffer to *fd*, looping over the short writes ``os.write`` is allowed to make.

    A marker written with a bare ``os.write`` can land partially: a peer reading it mid-write parses a truncated record
    as malformed or as a foreign holder. Looping until the buffer drains keeps the record atomic in the process and
    kernel view. No ``fsync``: filelock needs a complete record, not crash-durable storage.

    :param fd: file descriptor open for writing.
    :param data: bytes to write in full.

    :raises OSError: if a write reports zero progress before the record is complete.

    r   z5os.write wrote 0 bytes before the record was completeN)Ú
memoryviewÚosÚwriteÚOSErrorr   )ÚfdÚdataÚ	remainingÚwrittens       úY/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/filelock/_util.pyÚ	write_allr      sH   € ô ˜4Ó €IÙ
Ü—x‘x  IÓ.Ð.ˆG°1Ò4Üœ#ÐVÓWÐWØ˜g˜hÐ'ˆ	ô ó    c                óR  — 	 t        j                  | «      }|j                  t        j
                  z  st        t        d| «      ‚t	        j                  |j                  «      r5t        j                  dk(  rt        t        d| «      ‚t        t        d| «      ‚y# t        $ r Y yw xY w)a  
    Raise an exception if attempting to open the file for writing would fail.

    Separates files that can never be written from files that are writable but currently locked.

    :param filename: file to check

    :raises OSError: as if the file was opened for writing.

    NzPermission deniedÚwin32zIs a directory)r   Úlstatr   Úst_modeÚstatÚS_IWUSRÚPermissionErrorr   ÚS_ISDIRÚsysÚplatformÚIsADirectoryErrorr   )ÚfilenameÚ	file_stats     r   Úraise_on_not_writable_filer"   !   s’   € ðô
 —H‘H˜XÓ&ˆ	ð ×Ñ¤§¡Ò,ÜœfÐ&9¸8ÓDÐDä‡|�|�I×%Ñ%Ô&Ü�<‰<˜7Ò"Ü!¤&Ð*=¸xÓHÐHÜ¤Ð(8¸(ÓCÐCð 'øô ò Ùðús   ‚B Â	B&Â%B&c                óP   — t        | «      j                  j                  dd¬«       y)zp
    Ensure the directory containing the file exists (create it if necessary).

    :param filename: file.

    T)ÚparentsÚexist_okN)r   ÚparentÚmkdir)r    s    r   Úensure_directory_existsr(   A   s!   € ô 	ˆƒN×Ñ×Ñ¨°tÐÕ<r   c                óP  — | › dt        j                  «       › dt        j                  d«      › �}t	        | «      j                  |«       	 t        j                  |«      }|j                  |kD  s|j                  |k7  ryt	        |«      j                  «        y# t        $ r Y yw xY w)aA  
    Atomically break a stale lock file judged stale at modification time *mtime_before*.

    Rename the file to a process-private name before unlinking it, so two processes breaking the same lock cannot
    delete each other's work: only one rename of a given inode wins, the loser gets ``OSError``. After the rename,
    re-check the file. A newer modification time, or a different inode than *ino_before*, means a peer recreated the
    lock between the stale decision and the rename, so we grabbed a live file and abort, leaving the renamed file in
    place. A rollback rename is itself racy, the same trade-off as the soft read/write marker break. The inode check
    matters because filesystems with coarse modification-time granularity (NFS, FAT) can give a same-second recreation
    the old mtime, so mtime alone would miss it and unlink a live lock; the inode is the reliable identity, mirroring
    the token re-check in the soft read/write marker break. ``lstat`` avoids following a hostile symlink swapped in
    after the decision.

    The break name carries a random token so it is unguessable and unique per attempt. Without it two breakers in the
    same process share ``<lock>.break.<pid>``, and a second break can rename a recreated live lock onto that path in
    the window between the re-verify ``lstat`` above and the ``unlink`` below, deleting a live lock the inode check
    just approved. A private name keeps anyone else from targeting our break path, matching the soft read/write marker
    break.

    :param lock_file: path to the lock file to break.
    :param mtime_before: modification time observed when the lock was judged stale.
    :param ino_before: inode number observed when the lock was judged stale.

    :raises OSError: if the rename fails (e.g. the file vanished or is not owned in a sticky directory).

    z.break.ú.é   N)r   ÚgetpidÚsecretsÚ	token_hexr   Úrenamer   r   Úst_mtimeÚst_inoÚunlink)Ú	lock_fileÚmtime_beforeÚ
ino_beforeÚ
break_pathÚst_afters        r   Úbreak_lock_filer8   K   s”   € ð6 �;˜g¤b§i¡i£k ]°!´G×4EÑ4EÀbÓ4IÐ3JÐK€JÜˆƒO×Ñ˜:Ô&ðÜ—8‘8˜JÓ'ˆð ×Ñ˜<Ò'¨8¯?©?¸jÒ+HØÜˆÓ×ÑÕøô	 ò Ùðús   ÁB Â	B%Â$B%)r   c               ó|   — |�t         rt        j                  |d «       y t        j                  | d t         ¬«       y )N)Úfollow_symlinks)Ú_SUPPORTS_UTIME_FDr   ÚutimeÚ_SUPPORTS_UTIME_NOFOLLOW)Únamer   s     r   Útouchr?   q   s1   € ð
 
€~Õ,Ü
�‰��TÔØÜ‡H�HˆT�4Ô-EÐ)EÖFr   r   zFinal[bool]r;   r=   )r8   r(   r"   r?   r   )r   Úintr   ÚbytesÚreturnÚNone)r    ÚstrrB   rC   )r    z
Path | strrB   rC   )r3   rD   r4   Úfloatr5   r@   rB   rC   )r>   rD   r   z
int | NonerB   rC   )Ú
__future__r   r   r-   r   r   Úerrnor   r   r   Úpathlibr   Útypingr   r   r"   r(   r8   r?   r   r<   Úsupports_fdr;   Ú__annotations__Úsupports_follow_symlinksr=   Ú__all__© r   r   ú<module>rO      s‹   ðÞ "ã 	Û Û Û 
ß %Ñ %Ý Ý ó(ó*Dó@=ó#ðL *.õ Gð #&§,¡,°'Ñ"9Ò"X¸b¿h¹hÈ"Ï.É.Ð>XÐ �KÓ Xà(*¯©°B×4OÑ4OÐ(OÐ ˜+Ó Oò�r   