:mod:`posixfile` --- File-like objects with locking support
===========================================================

.. module:: posixfile
   :platform: Unix
   :synopsis: A file-like object with support for locking.
   :deprecated:
.. moduleauthor:: Jaap Vermeulen
.. sectionauthor:: Jaap Vermeulen


.. index:: pair: POSIX; file object

.. deprecated:: 1.5
   The locking operation that this module provides is done better and more portably
   by the :func:`fcntl.lockf` call.

.. index:: single: fcntl() (in module fcntl)

This module implements some additional functionality over the built-in file
objects.  In particular, it implements file locking, control over the file
flags, and an easy interface to duplicate the file object. The module defines a
new file object, the posixfile object.  It has all the standard file object
methods and adds the methods described below.  This module only works for
certain flavors of Unix, since it uses :func:`fcntl.fcntl` for file locking.

To instantiate a posixfile object, use the :func:`posixfile.open` function.  The
resulting object looks and feels roughly the same as a standard file object.

The :mod:`posixfile` module defines the following constants:


.. data:: SEEK_SET

   Offset is calculated from the start of the file.


.. data:: SEEK_CUR

   Offset is calculated from the current position in the file.


.. data:: SEEK_END

   Offset is calculated from the end of the file.

The :mod:`posixfile` module defines the following functions:


.. function:: open(filename[, mode[, bufsize]])

   Create a new posixfile object with the given filename and mode.  The *filename*,
   *mode* and *bufsize* arguments are interpreted the same way as by the built-in
   :func:`open` function.


.. function:: fileopen(fileobject)

   Create a new posixfile object with the given standard file object. The resulting
   object has the same filename and mode as the original file object.

The posixfile object defines the following additional methods:


.. method:: posixfile.lock(fmt, [len[, start[, whence]]])

   Lock the specified section of the file that the file object is referring to.
   The format is explained below in a table.  The *len* argument specifies the
   length of the section that should be locked. The default is ``0``. *start*
   specifies the starting offset of the section, where the default is ``0``.  The
   *whence* argument specifies where the offset is relative to. It accepts one of
   the constants :const:`SEEK_SET`, :const:`SEEK_CUR` or :const:`SEEK_END`.  The
   default is :const:`SEEK_SET`.  For more information about the arguments refer to
   the :manpage:`fcntl(2)` manual page on your system.


.. method:: posixfile.flags([flags])

   Set the specified flags for the file that the file object is referring to.  The
   new flags are ORed with the old flags, unless specified otherwise.  The format
   is explained below in a table.  Without the *flags* argument a string indicating
   the current flags is returned (this is the same as the ``?`` modifier).  For
   more information about the flags refer to the :manpage:`fcntl(2)` manual page on
   your system.


.. method:: posixfile.dup()

   Duplicate the file object and the underlying file pointer and file descriptor.
   The resulting object behaves as if it were newly opened.


.. method:: posixfile.dup2(fd)

   Duplicate the file object and the underlying file pointer and file descriptor.
   The new object will have the given file descriptor. Otherwise the resulting
   object behaves as if it were newly opened.


.. method:: posixfile.file()

   Return the standard file object that the posixfile object is based on.  This is
   sometimes necessary for functions that insist on a standard file object.

All methods raise :exc:`IOError` when the request fails.

Format characters for the :meth:`lock` method have the following meaning:

+--------+-----------------------------------------------+
| Format | Meaning                                       |
+========+===============================================+
| ``u``  | unlock the specified region                   |
+--------+-----------------------------------------------+
| ``r``  | request a read lock for the specified section |
+--------+-----------------------------------------------+
| ``w``  | request a write lock for the specified        |
|        | section                                       |
+--------+-----------------------------------------------+

In addition the following modifiers can be added to the format:

+----------+--------------------------------+-------+
| Modifier | Meaning                        | Notes |
+==========+================================+=======+
| ``|``    | wait until the lock has been   |       |
|          | granted                        |       |
+----------+--------------------------------+-------+
| ``?``    | return the first lock          | \(1)  |
|          | conflicting with the requested |       |
|          | lock, or ``None`` if there is  |       |
|          | no conflict.                   |       |
+----------+--------------------------------+-------+

Note:

(1)
   The lock returned is in the format ``(mode, len, start, whence, pid)`` where
   *mode* is a character representing the type of lock ('r' or 'w').  This modifier
   prevents a request from being granted; it is for query purposes only.

Format characters for the :meth:`flags` method have the following meanings:

+--------+-----------------------------------------------+
| Format | Meaning                                       |
+========+===============================================+
| ``a``  | append only flag                              |
+--------+-----------------------------------------------+
| ``c``  | close on exec flag                            |
+--------+-----------------------------------------------+
| ``n``  | no delay flag (also called non-blocking flag) |
+--------+-----------------------------------------------+
| ``s``  | synchronization flag                          |
+--------+-----------------------------------------------+

In addition the following modifiers can be added to the format:

+----------+---------------------------------+-------+
| Modifier | Meaning                         | Notes |
+==========+=================================+=======+
| ``!``    | turn the specified flags 'off', | \(1)  |
|          | instead of the default 'on'     |       |
+----------+---------------------------------+-------+
| ``=``    | replace the flags, instead of   | \(1)  |
|          | the default 'OR' operation      |       |
+----------+---------------------------------+-------+
| ``?``    | return a string in which the    | \(2)  |
|          | characters represent the flags  |       |
|          | that are set.                   |       |
+----------+---------------------------------+-------+

Notes:

(1)
   The ``!`` and ``=`` modifiers are mutually exclusive.

(2)
   This string represents the flags after they may have been altered by the same
   call.

Examples::

   import posixfile

   file = posixfile.open('testfile', 'w')
   file.lock('w|')
   ...
   file.lock('u')
   file.close()

