#!/usr/bin/python # Increment a counter file with safe locking. # You can use this as an "xfilter" with mailfilter to count messages that match # particular rules. # Adam Sampson import sys, os, fcntl def main(args): if len(args) != 1: print "Usage: increment-counter counter-file" sys.exit(1) fn = args[0] fd = os.open(fn, os.O_RDWR | os.O_CREAT) fcntl.lockf(fd, fcntl.LOCK_EX) s = os.read(fd, 4096) try: n = int(s) except ValueError: print >>sys.stderr, "Couldn't read value from counter file " + fn + ", assuming 0" n = 0 fnn = fn + ".new" f = open(fnn, "w") f.write(str(n + 1)) f.close() os.rename(fnn, fn) os.close(fd) while 1: s = sys.stdin.read(4096) if s == "": break sys.stdout.write(s) if __name__ == "__main__": main(sys.argv[1:])