158 def lock(self, how, *args):
161 if 'w' in how: l_type = fcntl.F_WRLCK
162 elif 'r' in how: l_type = fcntl.F_RDLCK
163 elif 'u' in how: l_type = fcntl.F_UNLCK
164 else:
raise TypeError,
'no type of lock specified'
166 if '|' in how: cmd = fcntl.F_SETLKW
167 elif '?' in how: cmd = fcntl.F_GETLK
168 else: cmd = fcntl.F_SETLK
177 l_len, l_start = args
179 l_len, l_start, l_whence = args
181 raise TypeError,
'too many arguments'
186 if sys.platform
in (
'netbsd1',
188 'freebsd2',
'freebsd3',
'freebsd4',
'freebsd5',
189 'bsdos2',
'bsdos3',
'bsdos4'):
190 flock = struct.pack(
'lxxxxlxxxxlhh', \
191 l_start, l_len, os.getpid(), l_type, l_whence)
192 elif sys.platform
in [
'aix3',
'aix4']:
193 flock = struct.pack(
'hhlllii', \
194 l_type, l_whence, l_start, l_len, 0, 0, 0)
196 flock = struct.pack(
'hhllhh', \
197 l_type, l_whence, l_start, l_len, 0, 0)
199 flock = fcntl.fcntl(self._file_.fileno(), cmd, flock)
202 if sys.platform
in (
'netbsd1',
204 'freebsd2',
'freebsd3',
'freebsd4',
'freebsd5',
205 'bsdos2',
'bsdos3',
'bsdos4'):
206 l_start, l_len, l_pid, l_type, l_whence = \
207 struct.unpack(
'lxxxxlxxxxlhh', flock)
208 elif sys.platform
in [
'aix3',
'aix4']:
209 l_type, l_whence, l_start, l_len, l_sysid, l_pid, l_vfs = \
210 struct.unpack(
'hhlllii', flock)
211 elif sys.platform ==
"linux2":
212 l_type, l_whence, l_start, l_len, l_pid, l_sysid = \
213 struct.unpack(
'hhllhh', flock)
215 l_type, l_whence, l_start, l_len, l_sysid, l_pid = \
216 struct.unpack(
'hhllhh', flock)
218 if l_type != fcntl.F_UNLCK:
219 if l_type == fcntl.F_RDLCK:
220 return 'r', l_len, l_start, l_whence, l_pid
222 return 'w', l_len, l_start, l_whence, l_pid