| # server.py - inotify common protocol code |
| # |
| # Copyright 2006, 2007, 2008 Bryan O'Sullivan <bos@serpentine.com> |
| # Copyright 2007, 2008 Brendan Cully <brendan@kublai.com> |
| # |
| # This software may be used and distributed according to the terms of the |
| # GNU General Public License version 2 or any later version. |
| |
| import cStringIO, socket, struct |
| |
| """ |
| 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 |
| - No parameter needed for DBUG |
| |
| 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 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 |
| |
| """ |
| |
| version = 3 |
| |
| resphdrfmts = { |
| 'STAT': '>lllllllll', # status requests |
| 'DBUG': '>l' # debugging queries |
| } |
| resphdrsizes = dict((k, struct.calcsize(v)) |
| for k, v in resphdrfmts.iteritems()) |
| |
| 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 |