
vÅÏ^º  ã               @   s(  d  Z  d d l Z d Z d d	 „  Z e j d
 k r d d l Z d d l m Z m Z m	 Z	 m
 Z
 m Z m Z m Z m Z m Z d d l m Z m Z m Z d Z d Z d Z e e ƒ e e	 ƒ k rÎ e
 Z n e Z e	 Z Gd d „  d e ƒ Z Gd d „  d e ƒ Z Gd d „  d e ƒ Z e e ƒ Z e j j Z e e _ e e e e e e g e _  e j j! Z! e e! _ e e e e e g e! _  d d „  Z" d d „  Z# n„ y+ d d l$ Z$ e$ j Z e$ j Z e$ j Z Wn> e% e& f k
 rd Z Z Z d d „  Z" d d „  Z# Yn Xd d „  Z" d d „  Z# d S)aw  
Portable file locking utilities.

Based partially on an example by Jonathan Feignberg in the Python
Cookbook [1] (licensed under the Python Software License) and a ctypes port by
Anatoly Techtonik for Roundup [2] (license [3]).

[1] http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/65203
[2] https://sourceforge.net/p/roundup/code/ci/default/tree/roundup/backends/portalocker.py
[3] https://sourceforge.net/p/roundup/code/ci/default/tree/COPYING.txt

Example Usage::

    >>> from django.core.files import locks
    >>> with open('./file', 'wb') as f:
    ...     locks.lock(f, locks.LOCK_EX)
    ...     f.write('Django')
é    NÚLOCK_EXÚLOCK_SHÚLOCK_NBÚlockÚunlockc             C   s   t  |  d ƒ r |  j ƒ  S|  S)zCGet a filedescriptor from something which could be a file or an fd.Úfileno)Úhasattrr   )Úf© r
   ú9/tmp/pip-build-8lau8j11/django/django/core/files/locks.pyÚ_fd   s    r   Únt)	ÚsizeofÚc_ulongÚc_void_pÚc_int64Ú	StructureÚUnionÚPOINTERÚwindllÚbyref)ÚBOOLÚDWORDÚHANDLEé   é   c               @   s(   e  Z d  Z d e f d e f g Z d S)Ú_OFFSETZOffsetZ
OffsetHighN)Ú__name__Ú
__module__Ú__qualname__r   Ú_fields_r
   r
   r
   r   r   0   s   	r   c               @   s1   e  Z d  Z d g Z d e f d e f g Z d S)Ú_OFFSET_UNIONÚ_offsetZPointerN)r   r   r   Ú_anonymous_r   ÚPVOIDr    r
   r
   r
   r   r!   5   s   		r!   c               @   sC   e  Z d  Z d g Z d e f d e f d e f d e f g Z d S)Ú
OVERLAPPEDZ_offset_unionZInternalZInternalHighZhEventN)r   r   r   r#   Ú	ULONG_PTRr!   r   r    r
   r
   r
   r   r%   ;   s
   				r%   c             C   sI   t  j t |  ƒ ƒ } t ƒ  } t | | d d d t | ƒ ƒ } t | ƒ S)Nr   l     þ )ÚmsvcrtÚget_osfhandler   r%   Ú
LockFileExr   Úbool)r	   ÚflagsÚhfileÚ
overlappedÚretr
   r
   r   r   M   s    	!c             C   sF   t  j t |  ƒ ƒ } t ƒ  } t | d d d t | ƒ ƒ } t | ƒ S)Nr   l     þ )r'   r(   r   r%   ÚUnlockFileExr   r*   )r	   r,   r-   r.   r
   r
   r   r   S   s    	c             C   s   d S)NFr
   )r	   r+   r
   r
   r   r   c   s    c             C   s   d S)NTr
   )r	   r
   r
   r   r   g   s    c             C   s"   t  j t |  ƒ | ƒ } | d k S)Nr   )ÚfcntlÚflockr   )r	   r+   r.   r
   r
   r   r   k   s    c             C   s%   t  j t |  ƒ t  j ƒ } | d k S)Nr   )r0   r1   r   ÚLOCK_UN)r	   r.   r
   r
   r   r   o   s    )zLOCK_EXzLOCK_SHzLOCK_NBzlockzunlock)'Ú__doc__ÚosÚ__all__r   Únamer'   Úctypesr   r   r   r   r   r   r   r   r   Úctypes.wintypesr   r   r   r   r   r   r&   r$   r   r!   r%   ZLPOVERLAPPEDÚkernel32r)   ÚrestypeÚargtypesr/   r   r   r0   ÚImportErrorÚAttributeErrorr
   r
   r
   r   Ú<module>   sJ   @					