1 """Extended file operations available in POSIX.
3 f = posixfile.open(filename, [mode, [bufsize]])
4 will create a new posixfile object
6 f = posixfile.fileopen(fileobject)
7 will create a posixfile object from a builtin file object
10 will return the original builtin file object
13 will return a new file object based on a new filedescriptor
16 will return a new file object based on the given filedescriptor
19 will turn on the associated flag (merge)
20 mode can contain the following characters:
22 (character representing a flag)
26 s synchronization flag
28 ! turn flags 'off' instead of default 'on'
29 = copy flags 'as is' instead of default 'merge'
30 ? return a string in which the characters represent the flags
33 note: - the '!' and '=' modifiers are mutually exclusive.
34 - the '?' modifier will return the status of the flags after they
35 have been changed by other characters in the mode string
37 f.lock(mode [, len [, start [, whence]]])
38 will (un)lock a region
39 mode can contain the following characters:
41 (character representing type of lock)
46 | wait until the lock can be granted
47 ? return the first lock conflicting with the requested lock
48 or 'None' if there is no conflict. The lock returned is in the
49 format (mode, len, start, whence, pid) where mode is a
50 character representing the type of lock ('r' or 'w')
52 note: - the '?' modifier prevents a region from being locked; it is
58 "The posixfile module is obsolete and will disappear in the future",
64 """File wrapper class that provides extra POSIX file routines."""
66 states
= ['open', 'closed']
73 return "<%s posixfile '%s', mode '%s' at %s>" % \
74 (self
.states
[file.closed
], file.name
, file.mode
, \
78 # Initialization routines
80 def open(self
, name
, mode
='r', bufsize
=-1):
82 return self
.fileopen(__builtin__
.open(name
, mode
, bufsize
))
84 def fileopen(self
, file):
86 if `
type(file)`
!= "<type 'file'>":
87 raise TypeError, 'posixfile.fileopen() arg must be file object'
89 # Copy basic file methods
90 for maybemethod
in dir(file):
91 if not maybemethod
.startswith('_'):
92 attr
= getattr(file, maybemethod
)
93 if isinstance(attr
, types
.BuiltinMethodType
):
94 setattr(self
, maybemethod
, attr
)
106 if not hasattr(posix
, 'fdopen'):
107 raise AttributeError, 'dup() method unavailable'
109 return posix
.fdopen(posix
.dup(self
._file
_.fileno()), self
._file
_.mode
)
114 if not hasattr(posix
, 'fdopen'):
115 raise AttributeError, 'dup() method unavailable'
117 posix
.dup2(self
._file
_.fileno(), fd
)
118 return posix
.fdopen(fd
, self
._file
_.mode
)
120 def flags(self
, *which
):
125 raise TypeError, 'Too many arguments'
130 if 'n' in which
: l_flags
= l_flags | os
.O_NDELAY
131 if 'a' in which
: l_flags
= l_flags | os
.O_APPEND
132 if 's' in which
: l_flags
= l_flags | os
.O_SYNC
137 cur_fl
= fcntl
.fcntl(file.fileno(), fcntl
.F_GETFL
, 0)
138 if '!' in which
: l_flags
= cur_fl
& ~ l_flags
139 else: l_flags
= cur_fl | l_flags
141 l_flags
= fcntl
.fcntl(file.fileno(), fcntl
.F_SETFL
, l_flags
)
144 arg
= ('!' not in which
) # 0 is don't, 1 is do close on exec
145 l_flags
= fcntl
.fcntl(file.fileno(), fcntl
.F_SETFD
, arg
)
148 which
= '' # Return current flags
149 l_flags
= fcntl
.fcntl(file.fileno(), fcntl
.F_GETFL
, 0)
150 if os
.O_APPEND
& l_flags
: which
= which
+ 'a'
151 if fcntl
.fcntl(file.fileno(), fcntl
.F_GETFD
, 0) & 1:
153 if os
.O_NDELAY
& l_flags
: which
= which
+ 'n'
154 if os
.O_SYNC
& l_flags
: which
= which
+ 's'
157 def lock(self
, how
, *args
):
160 if 'w' in how
: l_type
= fcntl
.F_WRLCK
161 elif 'r' in how
: l_type
= fcntl
.F_RDLCK
162 elif 'u' in how
: l_type
= fcntl
.F_UNLCK
163 else: raise TypeError, 'no type of lock specified'
165 if '|' in how
: cmd
= fcntl
.F_SETLKW
166 elif '?' in how
: cmd
= fcntl
.F_GETLK
167 else: cmd
= fcntl
.F_SETLK
176 l_len
, l_start
= args
178 l_len
, l_start
, l_whence
= args
180 raise TypeError, 'too many arguments'
182 # Hack by davem@magnet.com to get locking to go on freebsd;
183 # additions for AIX by Vladimir.Marangozov@imag.fr
185 if sys
.platform
in ('netbsd1',
187 'freebsd2', 'freebsd3', 'freebsd4', 'freebsd5',
188 'bsdos2', 'bsdos3', 'bsdos4'):
189 flock
= struct
.pack('lxxxxlxxxxlhh', \
190 l_start
, l_len
, os
.getpid(), l_type
, l_whence
)
191 elif sys
.platform
in ['aix3', 'aix4']:
192 flock
= struct
.pack('hhlllii', \
193 l_type
, l_whence
, l_start
, l_len
, 0, 0, 0)
195 flock
= struct
.pack('hhllhh', \
196 l_type
, l_whence
, l_start
, l_len
, 0, 0)
198 flock
= fcntl
.fcntl(self
._file
_.fileno(), cmd
, flock
)
201 if sys
.platform
in ('netbsd1',
203 'freebsd2', 'freebsd3', 'freebsd4', 'freebsd5',
204 'bsdos2', 'bsdos3', 'bsdos4'):
205 l_start
, l_len
, l_pid
, l_type
, l_whence
= \
206 struct
.unpack('lxxxxlxxxxlhh', flock
)
207 elif sys
.platform
in ['aix3', 'aix4']:
208 l_type
, l_whence
, l_start
, l_len
, l_sysid
, l_pid
, l_vfs
= \
209 struct
.unpack('hhlllii', flock
)
210 elif sys
.platform
== "linux2":
211 l_type
, l_whence
, l_start
, l_len
, l_pid
, l_sysid
= \
212 struct
.unpack('hhllhh', flock
)
214 l_type
, l_whence
, l_start
, l_len
, l_sysid
, l_pid
= \
215 struct
.unpack('hhllhh', flock
)
217 if l_type
!= fcntl
.F_UNLCK
:
218 if l_type
== fcntl
.F_RDLCK
:
219 return 'r', l_len
, l_start
, l_whence
, l_pid
221 return 'w', l_len
, l_start
, l_whence
, l_pid
223 def open(name
, mode
='r', bufsize
=-1):
224 """Public routine to open a file as a posixfile object."""
225 return _posixfile_().open(name
, mode
, bufsize
)
228 """Public routine to get a posixfile object from a Python file object."""
229 return _posixfile_().fileopen(file)
239 # End of posixfile.py