14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""Extended file operations available in POSIX.
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmf = posixfile.open(filename, [mode, [bufsize]])
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      will create a new posixfile object
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmf = posixfile.fileopen(fileobject)
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      will create a posixfile object from a builtin file object
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmf.file()
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      will return the original builtin file object
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmf.dup()
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      will return a new file object based on a new filedescriptor
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmf.dup2(fd)
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      will return a new file object based on the given filedescriptor
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmf.flags(mode)
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      will turn on the associated flag (merge)
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      mode can contain the following characters:
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  (character representing a flag)
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      a       append only flag
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      c       close on exec flag
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      n       no delay flag
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      s       synchronization flag
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  (modifiers)
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      !       turn flags 'off' instead of default 'on'
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      =       copy flags 'as is' instead of default 'merge'
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      ?       return a string in which the characters represent the flags
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              that are set
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      note: - the '!' and '=' modifiers are mutually exclusive.
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            - the '?' modifier will return the status of the flags after they
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              have been changed by other characters in the mode string
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmf.lock(mode [, len [, start [, whence]]])
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      will (un)lock a region
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      mode can contain the following characters:
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  (character representing type of lock)
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      u       unlock
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      r       read lock
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      w       write lock
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  (modifiers)
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      |       wait until the lock can be granted
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      ?       return the first lock conflicting with the requested lock
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              or 'None' if there is no conflict. The lock returned is in the
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              format (mode, len, start, whence, pid) where mode is a
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              character representing the type of lock ('r' or 'w')
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      note: - the '?' modifier prevents a region from being locked; it is
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              query only
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport warnings
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmwarnings.warn("The posixfile module is deprecated; "
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "fcntl.lockf() provides better locking", DeprecationWarning, 2)
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass _posixfile_:
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """File wrapper class that provides extra POSIX file routines."""
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    states = ['open', 'closed']
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    #
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Internal routines
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    #
674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __repr__(self):
684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        file = self._file_
694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return "<%s posixfile '%s', mode '%s' at %s>" % \
704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                (self.states[file.closed], file.name, file.mode, \
714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 hex(id(self))[2:])
724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    #
744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Initialization routines
754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    #
764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def open(self, name, mode='r', bufsize=-1):
774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        import __builtin__
784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return self.fileopen(__builtin__.open(name, mode, bufsize))
794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def fileopen(self, file):
814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        import types
824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if repr(type(file)) != "<type 'file'>":
834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            raise TypeError, 'posixfile.fileopen() arg must be file object'
844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self._file_  = file
854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Copy basic file methods
864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for maybemethod in dir(file):
874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if not maybemethod.startswith('_'):
884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                attr = getattr(file, maybemethod)
894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if isinstance(attr, types.BuiltinMethodType):
904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    setattr(self, maybemethod, attr)
914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return self
924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    #
944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # New methods
954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    #
964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def file(self):
974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return self._file_
984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def dup(self):
1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        import posix
1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if not hasattr(posix, 'fdopen'):
1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            raise AttributeError, 'dup() method unavailable'
1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return posix.fdopen(posix.dup(self._file_.fileno()), self._file_.mode)
1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def dup2(self, fd):
1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        import posix
1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if not hasattr(posix, 'fdopen'):
1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            raise AttributeError, 'dup() method unavailable'
1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        posix.dup2(self._file_.fileno(), fd)
1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return posix.fdopen(fd, self._file_.mode)
1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def flags(self, *which):
1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        import fcntl, os
1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if which:
1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if len(which) > 1:
1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                raise TypeError, 'Too many arguments'
1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            which = which[0]
1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else: which = '?'
1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        l_flags = 0
1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if 'n' in which: l_flags = l_flags | os.O_NDELAY
1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if 'a' in which: l_flags = l_flags | os.O_APPEND
1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if 's' in which: l_flags = l_flags | os.O_SYNC
1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        file = self._file_
1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if '=' not in which:
1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            cur_fl = fcntl.fcntl(file.fileno(), fcntl.F_GETFL, 0)
1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if '!' in which: l_flags = cur_fl & ~ l_flags
1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else: l_flags = cur_fl | l_flags
1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        l_flags = fcntl.fcntl(file.fileno(), fcntl.F_SETFL, l_flags)
1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if 'c' in which:
1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            arg = ('!' not in which)    # 0 is don't, 1 is do close on exec
1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            l_flags = fcntl.fcntl(file.fileno(), fcntl.F_SETFD, arg)
1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if '?' in which:
1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            which = ''                  # Return current flags
1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            l_flags = fcntl.fcntl(file.fileno(), fcntl.F_GETFL, 0)
1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if os.O_APPEND & l_flags: which = which + 'a'
1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if fcntl.fcntl(file.fileno(), fcntl.F_GETFD, 0) & 1:
1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                which = which + 'c'
1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if os.O_NDELAY & l_flags: which = which + 'n'
1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if os.O_SYNC & l_flags: which = which + 's'
1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return which
1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def lock(self, how, *args):
1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        import struct, fcntl
1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if 'w' in how: l_type = fcntl.F_WRLCK
1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif 'r' in how: l_type = fcntl.F_RDLCK
1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif 'u' in how: l_type = fcntl.F_UNLCK
1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else: raise TypeError, 'no type of lock specified'
1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if '|' in how: cmd = fcntl.F_SETLKW
1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif '?' in how: cmd = fcntl.F_GETLK
1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else: cmd = fcntl.F_SETLK
1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        l_whence = 0
1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        l_start = 0
1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        l_len = 0
1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if len(args) == 1:
1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            l_len = args[0]
1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif len(args) == 2:
1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            l_len, l_start = args
1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif len(args) == 3:
1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            l_len, l_start, l_whence = args
1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif len(args) > 3:
1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            raise TypeError, 'too many arguments'
1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Hack by davem@magnet.com to get locking to go on freebsd;
1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # additions for AIX by Vladimir.Marangozov@imag.fr
1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        import sys, os
1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if sys.platform in ('netbsd1',
1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            'openbsd2',
1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            'freebsd2', 'freebsd3', 'freebsd4', 'freebsd5',
1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            'freebsd6', 'freebsd7', 'freebsd8',
1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            'bsdos2', 'bsdos3', 'bsdos4'):
1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            flock = struct.pack('lxxxxlxxxxlhh', \
1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                  l_start, l_len, os.getpid(), l_type, l_whence)
1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif sys.platform in ('aix3', 'aix4'):
1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            flock = struct.pack('hhlllii', \
1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                  l_type, l_whence, l_start, l_len, 0, 0, 0)
1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            flock = struct.pack('hhllhh', \
1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                  l_type, l_whence, l_start, l_len, 0, 0)
1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        flock = fcntl.fcntl(self._file_.fileno(), cmd, flock)
1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if '?' in how:
1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if sys.platform in ('netbsd1',
1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                'openbsd2',
2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                'freebsd2', 'freebsd3', 'freebsd4', 'freebsd5',
2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                'bsdos2', 'bsdos3', 'bsdos4'):
2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                l_start, l_len, l_pid, l_type, l_whence = \
2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    struct.unpack('lxxxxlxxxxlhh', flock)
2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            elif sys.platform in ('aix3', 'aix4'):
2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                l_type, l_whence, l_start, l_len, l_sysid, l_pid, l_vfs = \
2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    struct.unpack('hhlllii', flock)
2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            elif sys.platform == "linux2":
2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                l_type, l_whence, l_start, l_len, l_pid, l_sysid = \
2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    struct.unpack('hhllhh', flock)
2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else:
2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                l_type, l_whence, l_start, l_len, l_sysid, l_pid = \
2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    struct.unpack('hhllhh', flock)
2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if l_type != fcntl.F_UNLCK:
2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if l_type == fcntl.F_RDLCK:
2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return 'r', l_len, l_start, l_whence, l_pid
2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else:
2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return 'w', l_len, l_start, l_whence, l_pid
2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef open(name, mode='r', bufsize=-1):
2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Public routine to open a file as a posixfile object."""
2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return _posixfile_().open(name, mode, bufsize)
2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef fileopen(file):
2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Public routine to get a posixfile object from a Python file object."""
2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return _posixfile_().fileopen(file)
2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#
2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Constants
2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#
2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSEEK_SET = 0
2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSEEK_CUR = 1
2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSEEK_END = 2
2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#
2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# End of posixfile.py
2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#
238