common.py
53 lines
| 1.5 KiB
| text/x-python
|
PythonLexer
Bryan O'Sullivan
|
r6239 | # server.py - inotify common protocol code | ||
# | ||||
# Copyright 2006, 2007, 2008 Bryan O'Sullivan <bos@serpentine.com> | ||||
# Copyright 2007, 2008 Brendan Cully <brendan@kublai.com> | ||||
# | ||||
Martin Geisler
|
r8225 | # This software may be used and distributed according to the terms of the | ||
Matt Mackall
|
r10263 | # GNU General Public License version 2 or any later version. | ||
Bryan O'Sullivan
|
r6239 | |||
import cStringIO, socket, struct | ||||
Nicolas Dumazet
|
r8553 | """ | ||
Protocol between inotify clients and server: | ||||
Client sending query: | ||||
1) send protocol version number | ||||
2) send query type (string, 4 letters long) | ||||
3) send query parameters: | ||||
- For STAT, N+1 \0-separated strings: | ||||
1) N different names that need checking | ||||
2) 1 string containing all the status types to match | ||||
Nicolas Dumazet
|
r8555 | - No parameter needed for DBUG | ||
Nicolas Dumazet
|
r8553 | |||
Server sending query answer: | ||||
1) send protocol version number | ||||
2) send query type | ||||
3) send struct.pack'ed headers describing the length of the content: | ||||
Nicolas Dumazet
|
r9854 | e.g. for STAT, receive 9 integers describing the length of the | ||
9 \0-separated string lists to be read: | ||||
* one file list for each lmar!?ic status type | ||||
* one list containing the directories visited during lookup | ||||
Nicolas Dumazet
|
r8553 | |||
""" | ||||
Nicolas Dumazet
|
r9854 | version = 3 | ||
Bryan O'Sullivan
|
r6239 | |||
Nicolas Dumazet
|
r8386 | resphdrfmts = { | ||
Nicolas Dumazet
|
r9854 | 'STAT': '>lllllllll', # status requests | ||
'DBUG': '>l' # debugging queries | ||||
Nicolas Dumazet
|
r8386 | } | ||
resphdrsizes = dict((k, struct.calcsize(v)) | ||||
for k, v in resphdrfmts.iteritems()) | ||||
Bryan O'Sullivan
|
r6239 | |||
def recvcs(sock): | ||||
cs = cStringIO.StringIO() | ||||
s = True | ||||
try: | ||||
while s: | ||||
s = sock.recv(65536) | ||||
cs.write(s) | ||||
finally: | ||||
sock.shutdown(socket.SHUT_RD) | ||||
cs.seek(0) | ||||
return cs | ||||