[cfe-commits] r66068 - /cfe/trunk/utils/CaptureCmd
Daniel Dunbar
daniel at zuster.org
Wed Mar 4 13:06:53 PST 2009
Author: ddunbar
Date: Wed Mar 4 15:06:52 2009
New Revision: 66068
URL: http://llvm.org/viewvc/llvm-project?rev=66068&view=rev
Log:
Add a little utility for interposing between a command line program
and capturing its invocations.
Added:
cfe/trunk/utils/CaptureCmd (with props)
Added: cfe/trunk/utils/CaptureCmd
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/utils/CaptureCmd?rev=66068&view=auto
==============================================================================
--- cfe/trunk/utils/CaptureCmd (added)
+++ cfe/trunk/utils/CaptureCmd Wed Mar 4 15:06:52 2009
@@ -0,0 +1,73 @@
+#!/usr/bin/python
+
+"""CaptureCmd - A generic tool for capturing information about the
+invocations of another program.
+
+Usage
+--
+1. Move the original tool to a safe known location.
+
+2. Link CaptureCmd to the original tool's location.
+
+3. Define CAPTURE_CMD_PROGRAM to the known location of the original
+tool; this must be an absolute path.
+
+4. Define CAPTURE_CMD_DIR to a directory to write invocation
+information to.
+"""
+
+import hashlib
+import os
+import sys
+import time
+
+def saveCaptureData(prefix, dir, object):
+ string = repr(object) + '\n'
+ key = hashlib.sha1(string).hexdigest()
+ path = os.path.join(dir,
+ prefix + key)
+ if not os.path.exists(path):
+ f = open(path, 'wb')
+ f.write(string)
+ f.close()
+ return prefix + key
+
+def main():
+ program = os.getenv('CAPTURE_CMD_PROGRAM')
+ dir = os.getenv('CAPTURE_CMD_DIR')
+ fallback = os.getenv('CAPTURE_CMD_FALLBACK')
+ if not program:
+ raise ValueError('CAPTURE_CMD_PROGRAM is not defined!')
+ if not dir:
+ raise ValueError('CAPTURE_CMD_DIR is not defined!')
+
+ # Make the output directory if it doesn't already exist.
+ if not os.path.exists(dir):
+ os.mkdir(dir, 0700)
+
+ # Get keys for various data.
+ env = os.environ.items()
+ env.sort()
+ envKey = saveCaptureData('env-', dir, env)
+ cwdKey = saveCaptureData('cwd-', dir, os.getcwd())
+ argvKey = saveCaptureData('argv-', dir, sys.argv)
+ entry = (time.time(), envKey, cwdKey, argvKey)
+ saveCaptureData('cmd-', dir, entry)
+
+ if fallback:
+ pid = os.fork()
+ if not pid:
+ os.execv(program, sys.argv)
+ os._exit(1)
+ else:
+ res = os.waitpid(pid, 0)
+ if not res:
+ os.execv(fallback, sys.argv)
+ os._exit(1)
+ os._exit(res)
+ else:
+ os.execv(program, sys.argv)
+ os._exit(1)
+
+if __name__ == '__main__':
+ main()
Propchange: cfe/trunk/utils/CaptureCmd
------------------------------------------------------------------------------
svn:executable = *
More information about the cfe-commits
mailing list