common.py
49 lines
| 1.4 KiB
| text/x-python
|
PythonLexer
|
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> | ||||
# | ||||
|
r8225 | # This software may be used and distributed according to the terms of the | ||
# GNU General Public License version 2, incorporated herein by reference. | ||||
|
r6239 | |||
import cStringIO, socket, struct | ||||
|
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 | ||||
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: | ||||
e.g. for STAT, receive 8 integers describing the length of the | ||||
8 \0-separated string lists ( one list for each lmar!?ic status type ) | ||||
""" | ||||
version = 2 | ||||
|
r6239 | |||
|
r8386 | resphdrfmts = { | ||
'STAT': '>llllllll' # status requests | ||||
} | ||||
resphdrsizes = dict((k, struct.calcsize(v)) | ||||
for k, v in resphdrfmts.iteritems()) | ||||
|
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 | ||||